Простые выборы лидера (выборы лидера без гражданства)

Я создаю приложение на голанге, которое должно быть отказоустойчивым. Я посмотрел на различные алгоритмы, такие как RAFT и Paxos, и их реализации в golang (etcd's raft, hashicorp's raft), но мне кажется, что они могут быть излишними для моего конкретного случая использования.

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

Если узел является лидером:

  • Запустить заданный код

Если узел не является лидером:

  • Подождите, пока лидер потерпит неудачу
  • Переизбрать лидера, если существующий лидер потерпит неудачу

Какие-либо предложения?


person Aibek    schedule 20.04.2020    source источник
comment
Покататься на плоту etcd - хорошая идея. Думаю, вы можете посмотреть аренду.   -  person George Leung    schedule 20.04.2020
comment
Это привлекательно, но у меня все еще есть проблема. Нет Клиента, который бы делал запросы к этому приложению. И, следовательно, я на самом деле не пытаюсь реплицировать какие-либо журналы между экземплярами приложения (и мне кажется, что RAFT был построен с учетом этих предположений). Все, что я пытаюсь сделать, это убедиться, что одновременно работает только один экземпляр, и если этот экземпляр выйдет из строя, его подхватит другой экземпляр.   -  person Aibek    schedule 21.04.2020


Ответы (2)


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

Если вы можете принимать случайные случаи дублирования лидеров, тогда вам может подойти более простой протокол. Однако, если вы абсолютно не можете терпеть наличие более чем одного лидера одновременно, вам придется объединить свой протокол выборов лидера с некоторой репликацией состояния, и проверенная реализация Paxos или Raft или аналогичного - очень хороший способ сделать это. . Для этого существует множество тонко разных протоколов, но все они в основном делают одно и то же.

Основная проблема здесь состоит в том, чтобы определить, что означает «сразу» в реальной сети, в которой сообщения могут иногда доставляться с очень большой задержкой. Обычно предполагается, что сеть полностью асинхронна без временных ограничений на доставку, и действительно, все Paxos, Raft и т. Д. Спроектированы для правильной работы в этом предположении. Эти алгоритмы работают над этим, определяя собственное внутреннее понятие времени (бюллетени в Paxos, термины в Raft) и прикрепляя это «внутреннее время» ко всем переходам между состояниями, находящимся под их контролем. Это дает некоторые очень сильные гарантии и, в частности, гарантирует, что никакие два узла не могут действовать в качестве лидера в одно и то же «внутреннее время».

Если вы не реплицируете какое-либо состояние с помощью чего-то вроде Paxos или Raft, вы не сможете использовать это сильное понятие внутреннего времени.

person Dave Turner    schedule 03.05.2020

Вы можете использовать библиотеку client go Kubernetes, если вы будете развертывать ее в кластере Kubernetes для вашего конкретного случая использования. https://github.com/kubernetes-client/go

person coder    schedule 30.06.2020