Как правильно развернуть с помощью Akka Cluster

Сценарий

Сейчас у нас есть только один узел, на котором работает вся система. Мы хотим провести различие между «интерфейсными» узлами и одним «внутренним» узлом.

  • Узлы "Frontend" (N узлов): поддерживает постоянное соединение с клиентами через соединение WebSocket.
  • Узел «Backend» (1 узел): обрабатывает все запросы, поступающие от всех узлов внешнего интерфейса, которые запрашивают базу данных и обрабатывают необходимую логику домена.

Это различие необходимо по нескольким причинам:

Работа сделана

Мы соединили актеров, живущих на внешнем узле, с актерами, живущими на внутреннем интерфейсе. Мы сделали это, создав экземпляры серверного узла ActorRefs из внешнего интерфейса, используя akka.cluster.singleton.ClusterSingletonProxy и ClusterSingletonManager, а на самом деле создав их экземпляры в серверном интерфейсе.

Вопрос

Как мы выполняем развертывание с учетом уведомления о сбое узла кластера Akka?

Насколько я понял с помощью документацию по кластеру Akka о сбое и некоторые комментарии к списку рассылки akka, рекомендуемый подход при работе с этим процессом будет примерно таким:

  1. Загрузите дистрибутив akka со страницы http://akka.io/downloads/.
  2. Скопируйте и вставьте сценарий akka-cluster bash вместе с jmxsh-R5.jar в папку resources/bin/ (например)
  3. Включите эту папку в распространяемый пакет (я добавил следующие строки в build.sbt): mappings in Universal ++= (baseDirectory.value / "resources" / "bin" * "*" get) map (bin => bin -> ("bin/" + bin.getName))
  4. While deploying, set the node to be deployed as down manually calling the bash script like:
    • Execute bin/akka-cluster %node_to_be_deployed:port% down
    • Разверните новую версию кода
    • Выполнить bin/akka-cluster %deployed_node:port% join

Сомнения:

  1. Правильна ли эта пошаговая процедура?
  2. Если развертываемый узел будет иметь тот же IP-адрес и порт после развертывания, нужно ли делать down и join?
  3. Мы планируем установить один интерфейсный и серверный узлы в качестве начальных. Таким образом, весь кластер можно было реконструировать, выполняя развертывание только на интерфейсных узлах или только на серверных. Это правильно?

Спасибо!


person JavierCane    schedule 07.11.2016    source источник


Ответы (1)


Чтобы избежать сбоев вручную, очистку при завершении работы узла см. В разделе: http://doc.akka.io/docs/akka/current/scala/cluster-usage.html#How_To_Cleanup_when_Member_is_Removed

Что касается ваших очков:

  1. Эта процедура не требуется при перезапуске JVM и выполнении кода очистки. Только когда код очистки каким-то образом не сработал, вам нужно выключить его вручную, как описано в процедуре.
  2. Когда узел помечен как удаленный другими узлами (после выполнения кода очистки), та же комбинация IP-адреса и порта может использоваться для повторного присоединения к кластеру.
  3. Да, вы можете просто повторно развернуть интерфейсный узел.

PS .:
- Скоординированное завершение работы будет улучшено в akka 2.5, см .: https://github.com/akka/akka-meta/issues/38
- Если вы хотите управлять своим кластером с помощью http API, см. http://developer.lightbend.com/docs/akka-cluster-management/current/.

person Bennie Krijger    schedule 15.12.2016
comment
Привет @Bennie. Спасибо за ваш ответ. Насколько я понимаю, процесс очистки происходит при удалении узла и Документация по Akka Cluster Я понимаю это как следующий шаг (вверх - ›недоступен -› вниз - ›удален). У меня вопрос, как пометить узел как неработающий (вверх - ›недоступен -› внизу). Я играл с ConstructR & Consul, но он не касается шага вниз ( только с перечислением начальных узлов при присоединении к новому члену). - person JavierCane; 16.01.2017