Узел не присоединяется к кластеру после остановки

Я использую функциональные возможности кластера Akka.NET (1.0.5) для реализации службы, состоящей из главного узла, который получает запросы по HTTP и распределяет работу между рабочими узлами, присоединившимися к кластеру.

Идея состоит в том, чтобы иметь возможность легко выполнить следующее:

  • добавлять рабочие узлы в кластер при высоком спросе (проверьте)

  • иметь возможность перезагрузить мастер-узел или перевести его в автономный режим (техническое обслуживание/неправильное поведение/что угодно) и повторно подключить рабочих, когда он станет доступным (проверьте)

  • обновить/перезагрузить плохо работающий рабочий процесс и повторно подключить его к главному узлу (сбой!)

Первый пункт работает, как и следовало ожидать: новый экземпляр (рабочая роль облачной службы Azure) запускается и присоединяется к главному, который также является начальным узлом.

Во-вторых, у всех рабочих узлов есть актор, который прослушивает сплетни кластера и определяет, умер ли главный узел. В этом случае система актора рабочего узла будет перезагружена.

Последний пункт, где я застрял. Главный узел также прислушивается к сплетням кластера, чтобы определить, когда рабочий процесс стал недоступен (ClusterEvent.UnreachableMember) или закрывается (статус выхода), и решает, следует ли его отключить. Согласно тому, что я понял из документации, единственный способ вернуть «новую» версию того же узла в кластер — это сначала отключить старую версию.

К сожалению, похоже, этого не происходит. В тестовом сценарии, который я запускал для локального воспроизведения проблемы в эмуляторе вычислений, были следующие шаги:

  1. Запустите главный узел (порт 8090)

  2. Запустите рабочий узел (порт 9090)

  3. Поработай немного

  4. Внезапно убить рабочий узел

  5. Запустите резервную копию рабочего узла

Ниже приведены соответствующие фрагменты из журналов, которые я собрал для обоих узлов во время этого теста:


Мастер:

Рабочий становится недоступным:

[WARNING][07/12/2015 20:39:35][Thread 0023][[akka://InventoryService/system/cluster/core/daemon]] Cluster Node [akka.tcp://[email protected]:8090] - Marking node(s) as UNREACHABLE [Member(address = akka.tcp://[email protected]:9090, status = Up]

Главный узел вызывает Cluster.Leave() и Cluster.Down() по адресу рабочего:

[DEBUG][07/12/2015 20:39:35][Thread 0021][[akka://InventoryService/system/cluster/core/daemon]] [Initialized] Received Akka.Cluster.ClusterUserAction+Leave
[INFO][07/12/2015 20:39:35][Thread 0021][[akka://InventoryService/system/cluster/core/daemon]] Marked address [akka.tcp://[email protected]:9090] as Leaving]
[DEBUG][07/12/2015 20:39:35][Thread 0021][[akka://InventoryService/system/cluster/core/daemon]] [Initialized] Received Akka.Cluster.ClusterUserAction+Down
[INFO][07/12/2015 20:39:35][Thread 0021][[akka://InventoryService/system/cluster/core/daemon]] Marking unreachable node [akka.tcp://[email protected]:9090] as Down
[DEBUG][07/12/2015 20:39:35][Thread 0020][[akka://InventoryService/system/cluster/core/daemon/heartbeatSender]] Cluster Node [akka.tcp://[email protected]:8090] - Heartbeat to [akka.tcp://[email protected]:9090]
[INFO][07/12/2015 20:39:36][Thread 0021][[akka://InventoryService/system/cluster/core/daemon]] Leader is removing unreachable node [akka.tcp://[email protected]:9090]

Мастер подтверждает, что старому узлу больше не будет разрешено присоединяться (хотя, похоже, есть ошибка, см. первую строку — gated instead for akka.tcp://[email protected]:9090 ms, которая, как я полагаю, будет временем, когда он должен быть закрыт):

[WARNING][07/12/2015 20:39:36][Thread 0013][remoting] Association to [akka.tcp://[email protected]:9090] with unknown UID is reported as quarantined, but address cannot be quarantined without knowing the UID, gated instead for akka.tcp://[email protected]:9090 ms
[DEBUG][07/12/2015 20:39:36][Thread 0015][[akka://InventoryService/system/endpointManager/reliableEndpointWriter-akka.tcp%3a%2f%2fInventoryService%400.0.0.0%3a9090-2/endpointWriter]] Disassociated [akka.tcp://[email protected]:8090] -> akka.tcp://[email protected]:9090
[DEBUG][07/12/2015 20:39:36][Thread 0020][[akka://InventoryService/system/cluster/core/daemon]] [Initialized] Received Association to [akka.tcp://[email protected]:9090] having UID [1198519768] is irrecoverably failed. UID is now quarantined and all messages to this UID will be delivered to dead letters. Remote actorsystem must be restarted to recover from this situation.
[WARNING][07/12/2015 20:39:36][Thread 0013][remoting] Association to [akka.tcp://[email protected]:9090] having UID [1198519768] is irrecoverably failed. UID is now quarantined and all messages to this UID will be delivered to dead letters. Remote actorsystem must be restarted to recover from this situation.

Рабочий загружается и пытается подключиться к мастеру:

[DEBUG][07/12/2015 20:40:20][Thread 0013][remoting] Associated [akka.tcp://[email protected]:8090] <- akka.tcp://[email protected]:9090
[DEBUG][07/12/2015 20:40:21][Thread 0023][[akka://InventoryService/system/cluster/core/daemon]] [Initialized] Received Akka.Cluster.InternalClusterAction+InitJoin
[DEBUG][07/12/2015 20:40:21][Thread 0020][[akka://InventoryService/system/cluster/core/daemon]] [Initialized] Received Akka.Cluster.InternalClusterAction+InitJoin
[DEBUG][07/12/2015 20:40:23][Thread 0021][[akka://InventoryService/system/cluster/core/daemon]] [Initialized] Received Akka.Cluster.InternalClusterAction+InitJoin
[DEBUG][07/12/2015 20:40:28][Thread 0020][[akka://InventoryService/system/cluster/core/daemon]] [Initialized] Received Akka.Cluster.InternalClusterAction+InitJoin
[DEBUG][07/12/2015 20:40:33][Thread 0023][[akka://InventoryService/system/cluster/core/daemon]] [Initialized] Received Akka.Cluster.InternalClusterAction+InitJoin
[DEBUG][07/12/2015 20:40:38][Thread 0022][[akka://InventoryService/system/cluster/core/daemon]] [Initialized] Received Akka.Cluster.InternalClusterAction+InitJoin
[DEBUG][07/12/2015 20:40:43][Thread 0021][[akka://InventoryService/system/cluster/core/daemon]] [Initialized] Received Akka.Cluster.InternalClusterAction+InitJoin
[DEBUG][07/12/2015 20:40:48][Thread 0020][[akka://InventoryService/system/cluster/core/daemon]] [Initialized] Received Akka.Cluster.InternalClusterAction+InitJoin
[DEBUG][07/12/2015 20:40:53][Thread 0023][[akka://InventoryService/system/cluster/core/daemon]] [Initialized] Received Akka.Cluster.InternalClusterAction+InitJoin
[DEBUG][07/12/2015 20:40:58][Thread 0022][[akka://InventoryService/system/cluster/core/daemon]] [Initialized] Received Akka.Cluster.InternalClusterAction+InitJoin
[DEBUG][07/12/2015 20:41:03][Thread 0021][[akka://InventoryService/system/cluster/core/daemon]] [Initialized] Received Akka.Cluster.InternalClusterAction+InitJoin
[DEBUG][07/12/2015 20:41:08][Thread 0021][[akka://InventoryService/system/cluster/core/daemon]] [Initialized] Received Akka.Cluster.InternalClusterAction+InitJoin
[DEBUG][07/12/2015 20:41:13][Thread 0020][[akka://InventoryService/system/cluster/core/daemon]] [Initialized] Received Akka.Cluster.InternalClusterAction+InitJoin
[DEBUG][07/12/2015 20:41:18][Thread 0023][[akka://InventoryService/system/cluster/core/daemon]] [Initialized] Received Akka.Cluster.InternalClusterAction+InitJoin

Что здесь происходит?


Рабочий:

Загрузка резервной копии после убийства:

[DEBUG][07/12/2015 20:40:18][Thread 0020][[akka://InventoryService/system/cluster/core/daemon]] [Uninitialized] Received Akka.Cluster.InternalClusterAction+JoinSeedNodes
[DEBUG][07/12/2015 20:40:18][Thread 0020][[akka://InventoryService/system/cluster/core/daemon]] [Uninitialized] Received Akka.Cluster.InternalClusterAction+Subscribe
[DEBUG][07/12/2015 20:40:18][Thread 0020][[akka://InventoryService/system/cluster/core/daemon]] [Uninitialized] Received Akka.Cluster.InternalClusterAction+JoinSeedNodes
[DEBUG][07/12/2015 20:40:20][Thread 0021][[akka://InventoryService/system/cluster/core/daemon]] [Uninitialized] Received Akka.Cluster.InternalClusterAction+Subscribe
[DEBUG][07/12/2015 20:40:18][Thread 0020][[akka://InventoryService/system/cluster/core/daemon]] [Uninitialized] Received Akka.Cluster.InternalClusterAction+Subscribe
[DEBUG][07/12/2015 20:40:21][Thread 0015][[akka://InventoryService/system/endpointManager/reliableEndpointWriter-akka.tcp%3a%2f%2fInventoryService%40127.0.0.1%3a8090-1/endpointWriter]] Drained buffer with maxWriteCount: 50, fullBackoffCount: 1,smallBackoffCount: 0, noBackoffCount: 0,adaptiveBackoff: 10000

И все... в лог больше ничего не записывается!


Полные файлы журнала:

Конфигурация главного кластера:

cluster {
    seed-nodes = ["master's address here"]
    roles = [ InventoryServiceMaster, InventoryServiceWorker ]
    failure-detector {
        acceptable-heartbeat-pause = 5s
        threshold = 10.0
    }
}

Конфигурация воркера такая же, но только с ролью InventoryServiceWorker.

Что мне здесь не хватает? Это проблема конфигурации? (Надеюсь, это не ошибка — я видел, как кто-то другой сообщил о похожей проблеме на Github).

РЕДАКТИРОВАТЬ:

Просто чтобы прояснить, я не использую Akka.dll из Nuget, поскольку он содержит ошибку сериализации — я проверил, применил ли текущий мастер исправление и выполнил сборку Release. В журналах есть отладочная информация, потому что я сохранил PDB из сборки.

РЕДАКТИРОВАТЬ 2:

В рабочем журнале после перезагрузки событие Akka.Cluster.InternalClusterAction+JoinSeedNodes появляется дважды, потому что у меня изначально был ручной вызов Cluster.JoinSeedNodes(). С тех пор я удалил это, но результат все тот же.


person easuter    schedule 07.12.2015    source источник
comment
Не могли бы вы рассказать что-нибудь еще об этой ошибке сериализации?   -  person Bartosz Sypytkowski    schedule 08.12.2015
comment
@Horusiath: github.com/akkadotnet/akka.net/pull/1508   -  person easuter    schedule 08.12.2015
comment
Как вы вообще решили эту проблему?   -  person Thulani Chivandikwa    schedule 08.09.2016
comment
В то время мне не удалось ее решить. Я реализовал хак, чтобы перезапустить кластер и убедиться, что все узлы воссоединились. Эта проблема может быть решена в текущем кластере Akka.NET, но если это не так, я бы рекомендовал сообщить об ошибке.   -  person easuter    schedule 16.09.2016


Ответы (1)


Это было решено в Akka.NET 1.1 — наша система UID не была правильно реализована до этого (1.0.5, на момент написания этого поста), но теперь она работает нормально.

person Aaronontheweb    schedule 08.11.2016