Предполагая, что вы используете преобразователь с разделенным мозгом с открытым исходным кодом (бывший коммерческий Lightbend), стратегия static-quorum
кажется подходящей.
Решение может быть основано на узлы с настроенной ролью вместо всех узлов в кластере. Это может быть полезно, когда некоторые типы узлов более ценны, чем другие. Например, у вас могут быть некоторые узлы, отвечающие за постоянные данные, и некоторые узлы с рабочими службами без сохранения состояния. Тогда, вероятно, более важно сохранить как можно больше постоянных узлов данных, даже если это означает отключение большего количества рабочих узлов.
Есть еще одно использование этой роли. Определив роль для нескольких (например, 7) стабильных узлов в кластере и используя ее в конфигурации stati c -quorum, вы сможете динамически добавлять и удалять другие узлы без этой роли и по-прежнему принимать правильные решения о том, что узлы, которые нужно продолжать работать, и какие узлы отключать в случае сетевых разделов. Преимущество этого подхода по сравнению с контрольным большинством (описанным ниже) заключается в том, что вы не рискуете разделить кластер на два отдельных кластера, т. Е. Разделенный мозг *. Вы по-прежнему должны соблюдать правило не запускать слишком много узлов с этой ролью, как описано выше. Кроме того, существует риск отключения всех узлов в случае сбоя, когда в кластере недостаточно узлов с этой ролью, как описано выше.
Это может быть выполнено следующим образом в application.conf
:
akka.cluster.split-brain-resolver.active-strategy=static-quorum
akka.cluster.split-brain-resolver.static-quorum {
# one leader node at a time
quorum-size = 1
role = "leader"
}
akka.cluster.roles = [ ${AKKA_CLUSTER_ROLE} ]
Затем вы должны указать роль кластера для каждого экземпляра через переменную среды AKKA_CLUSTER_ROLE (установив ее на leader
на вашем ведущем узле и worker
или client
в зависимости от ситуации) .
Поскольку узлы должны согласовывать стратегию SBR, лучшее, что вы можете сделать, - это иметь клиентские узлы d ie, если лидер уйдет.
Я воспользуюсь этой возможностью в конце, чтобы указать, что наличие клиентских узлов, присоединяющихся к кластеру Akka, возможно, стоит пересмотреть проектное решение: мне кажется, что он находится на пути к созданию распределенного монолита. Я надеюсь, что клиенты, взаимодействующие с кластером через http или очередь сообщений, серьезно учтены.