Дерево данных Opendaylight отравлено после смены лидера

Мы используем азотную версию (SR1) ODL. Мы пробуем кластер из 2 узлов, и когда ведомый становится ведущим (после работы сервера в течение 5–6 часов), мы наблюдаем ниже исключение в karaf.log. Когда происходит указанное ниже исключение, мы не можем получить доступ к MDSAL для любых операций чтения/записи.

Мы вызываем API-интерфейс switchAllLocalShardsState, чтобы изменить последователя на нового лидера на основе события «Akka Member Removed».

1) Что здесь означают «отравление» и «исключение без прогресса».

2) Вызывает ли эту проблему "TERM", который мы передаем в качестве аргумента для switchAllLocalShardsState. Если да, объясните значение TERM, а также сообщите нам, почему мы сталкиваемся с этой проблемой только после того, как сервер работает в течение длительного времени.

2018-06-04 11:58:25,452 | ERROR | tAdminThread #20  | 130 - com.fujitsu.fnc.sdn.fw-scheduler-odl - 5.1.0.SNAPSHOT | SchedulerServiceImpl | Get Schedule List Transaction failed : ReadFailedException{message=read execution failed, errorList=[RpcError [message=read execution failed, severity=ERROR, errorType=APPLICATION, tag=operation-failed, applicationTag=null, info=null, cause=ReadFailedException{message=read execution failed, errorList=[RpcError [message=read execution failed, severity=ERROR, errorType=APPLICATION, tag=operation-failed, applicationTag=null, info=null, cause=org.opendaylight.controller.cluster.access.client.NoProgressException: No progress in 31198 seconds]]}]]}
2018-06-04 11:58:25,452 | WARN  | tAdminThread #12  | 261 - com.fujitsu.fnc.sdnfw.security-odl - 5.1.0.SNAPSHOT | IDMLightServer | getContainer: {}
java.util.concurrent.ExecutionException: ReadFailedException{message=read execution failed, errorList=[RpcError [message=read execution failed, severity=ERROR, errorType=APPLICATION, tag=operation-failed, applicationTag=null, info=null, cause=org.opendaylight.controller.cluster.access.client.NoProgressException: No progress in 31198 seconds]]}
        at org.opendaylight.yangtools.util.concurrent.MappingCheckedFuture.wrapInExecutionException(MappingCheckedFuture.java:65)[583:org.opendaylight.yangtools.util:1.2.1]
        at org.opendaylight.yangtools.util.concurrent.MappingCheckedFuture.get(MappingCheckedFuture.java:78)[583:org.opendaylight.yangtools.util:1.2.1]
        at com.fujitsu.fnc.sdnfw.aaa.idmlight.impl.IDMLightServer.getUsermgmt(IDMLightServer.java:3056)[261:com.fujitsu.fnc.sdnfw.security-odl:5.1.0.SNAPSHOT]
        at com.fujitsu.fnc.sdnfw.aaa.idmlight.impl.IDMLightServer.init(IDMLightServer.java:1977)[261:com.fujitsu.fnc.sdnfw.security-odl:5.1.0.SNAPSHOT]
        at com.fujitsu.fnc.sdnfw.aaa.idmlight.impl.IDMLightServer.handleEvent(IDMLightServer.java:3251)[261:com.fujitsu.fnc.sdnfw.security-odl:5.1.0.SNAPSHOT]
        at Proxyadd8c855_db4c_4e72_b600_2ca57cba8d4d.handleEvent(Unknown Source)[:]
        at org.apache.felix.eventadmin.impl.handler.EventHandlerProxy.sendEvent(EventHandlerProxy.java:415)[393:org.apache.karaf.services.eventadmin:4.0.10]
        at org.apache.felix.eventadmin.impl.tasks.HandlerTask.run(HandlerTask.java:90)[393:org.apache.karaf.services.eventadmin:4.0.10]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)[:1.8.0_66]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)[:1.8.0_66]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[:1.8.0_66]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)[:1.8.0_66]
        at java.lang.Thread.run(Thread.java:745)[:1.8.0_66]
        Suppressed: java.lang.IllegalStateException: Uncaught exception occured during closing transaction
                at org.opendaylight.controller.cluster.databroker.AbstractDOMBrokerTransaction.closeSubtransactions(AbstractDOMBrokerTransaction.java:92)[497:org.opendaylight.controller.sal-distributed-datastore:1.6.1]
                at org.opendaylight.controller.cluster.databroker.DOMBrokerReadOnlyTransaction.close(DOMBrokerReadOnlyTransaction.java:50)[497:org.opendaylight.controller.sal-distributed-datastore:1.6.1]
                at org.opendaylight.controller.md.sal.binding.impl.BindingDOMReadTransactionAdapter.close(BindingDOMReadTransactionAdapter.java:36)[484:org.opendaylight.controller.sal-binding-broker-impl:1.6.1]
                at com.fujitsu.fnc.sdnfw.aaa.idmlight.impl.IDMLightServer.getUsermgmt(IDMLightServer.java:3062)[261:com.fujitsu.fnc.sdnfw.security-odl:5.1.0.SNAPSHOT]
                ... 10 more
        Caused by: java.lang.IllegalStateException: Connection ConnectedClientConnection{client=ClientIdentifier{frontend=member-1-frontend-datastore-config, generation=1}, cookie=0, poisoned=org.opendaylight.controller.cluster.access.client.NoProgressException: No progress in 31198 seconds, backend=ShardBackendInfo{actor=Actor[akka.tcp://[email protected]:2550/user/shardmanager-config/member-2-shard-default-config#-1532234096], sessionId=0, version=BORON, maxMessages=1000, cookie=0, shard=default, dataTree=absent}} has been poisoned
                at org.opendaylight.controller.cluster.access.client.AbstractClientConnection.commonEnqueue(AbstractClientConnection.java:198)[467:org.opendaylight.controller.cds-access-client:1.2.1]

person satlearner    schedule 04.06.2018    source источник
comment
Ссылки на NoProgressException и AbstractClientConnection указывают на то, что вы включили протокол на основе сообщений кластеризованного хранилища данных (который по существу является экспериментальным). Я не очень хорошо знаком с кодом на основе жестов, но я считаю, что NoProgressException означает, что время ожидания операции транзакции истекло.   -  person Tom Pantelis    schedule 04.06.2018
comment
Также что такое API switchAllLocalShardsState?   -  person Tom Pantelis    schedule 04.06.2018
comment
@TomPantelis: Спасибо за быстрый ответ. switchAllLocalShardsState в функции bean-компонента JMX, чтобы изменить состояние сегмента для всех сегментов. Мы используем этот JMX Mbean для изменения состояния, сообщите нам, если есть альтернативный подход.   -  person satlearner    schedule 04.06.2018
comment
Я забыл об этом. Я никогда не использовал его. Существует лучший способ реализовать 2-узловой первичный/вторичный узел, сделав вторичный узел без права голоса, а затем повысив вторичный узел до лидера, переключив его на голосование, когда основной узел выйдет из строя. Это задокументировано в онлайн-руководстве по кластеризации в разделе «Геоизбыточность», в котором описано это для 6 узлов, но вы можете использовать его для 2 узлов — та же концепция.   -  person Tom Pantelis    schedule 04.06.2018
comment
Спасибо @TomPantelis, мы не наблюдаем эту проблему после изменения протокола на Ask в org.opendaylight.controller.cluster.datastore.cfg   -  person satlearner    schedule 06.06.2018
comment
@TomPantelis: Не могли бы вы объяснить разницу между Tell и Ask и что рекомендуется для ODL. Как Ask решил нашу проблему.   -  person satlearner    schedule 07.06.2018
comment
Это просто разные реализации интерфейса транзакции. Tell-based — это новый метод, изначально представленный в Nitrogen, предназначенный для большей устойчивости к временным сбоям связи, но он все еще является экспериментальным, и со времен Nitrogen были внесены исправления. Мне любопытно, откуда ты вообще об этом знаешь...   -  person Tom Pantelis    schedule 07.06.2018
comment
Я добавлю ответ, чтобы вы могли отметить как ответивший.   -  person Tom Pantelis    schedule 07.06.2018


Ответы (1)


NoProgressException указывает на то, что вы включили новый основанный на сообщениях, который изначально был представлен в Nitrogen. Он разработан, чтобы быть более устойчивым к временным сбоям связи, но все еще является экспериментальным, и после Nitrogen были исправления. Я бы предложил отключить его.

Кроме того, есть лучший способ реализовать первичный/вторичный узел с двумя узлами, сделав вторичный узел без права голоса, а затем повысив вторичный узел до лидера, переключив его на голосование, когда основной узел выйдет из строя. Это задокументировано в онлайн-руководстве по кластеризации в разделе «Геоизбыточность», в котором описано это для 6 узлов, но вы можете использовать его для 2 узлов — та же концепция.

person Tom Pantelis    schedule 07.06.2018