Подтвердить что ты не робот

Как выбрать мастер node среди узлов, работающих в кластере?

Я пишу управляемый стек облака (поверх облачных провайдеров аппаратного уровня, таких как EC2), и проблема, с которой я столкнусь, - это:

Как несколько идентичных узлов определяют, какой из них становится мастером? (Например, подумайте о 5 серверах, работающих на EC2. Один из них должен стать мастером, а другие должны стать подчиненными.)

Я прочитал описание алгоритма, используемого MongoDB, и кажется довольно сложным, а также зависит от концепции голосов - то есть двух узлы, оставленные одни, не смогут ничего решить. Также их подход имеет значительную задержку, прежде чем он даст результаты.

  • Интересно, существуют ли менее сложные подходы KISS-embrasing? Используются ли они широко или они рискованны для принятия?

  • Предположим, что у нас уже есть список серверов. Затем мы можем просто выбрать ту, которая находится вверху и имеет численно наименьший IP-адрес. Каковы недостатки этого подхода?

  • Почему алгоритм MongoDB настолько сложный?

Это дубликат Как выбрать нового мастера в кластере?, который дает меньше деталей и не получил ответа в течение 6 месяцев, поэтому я считаю, что это подходит для начала нового вопроса.

(Стек, над которым я работаю, является открытым исходным кодом, но он находится на очень ранней стадии разработки, поэтому не дает ссылки здесь.)

UPDATE: на основе ответов я разработал простой консенсусный алгоритм, вы можете найти реализацию JavaScript (CoffeeScript) на GitHub: majority.js.

4b9b3361

Ответ 1

Лидерские алгоритмы выборов обычно рассматривают разделить мозг как проблему, чтобы поддержать. Если вы предполагаете, что это не узлы, которые терпят неудачу, кроме сети, вы можете столкнуться с тем, что все узлы вверх, но не могут разговаривать друг с другом. Затем у вас могут быть два мастера.

Если вы можете исключить "раздвоенный мозг" из вашей модели ошибки (т.е. если вы рассматриваете только ошибки node), ваш алгоритм (лидер - тот, у которого наименьший адрес) в порядке.

Ответ 3

Если вашим узлам также необходимо согласовать вещи и их общий порядок, вы можете рассмотреть Paxos. Это сложно, но никто не придумал более легкое решение для распределенного консенсуса.

Ответ 4

Мне нравится этот алгоритм:

  • Каждый node вычисляет самый низкий известный идентификатор node и отправляет голосование за руководство для этого node
  • Если a node получает достаточно много голосов, а node также проголосовал за себя, то он берет на себя роль лидера и начинает публиковать состояние кластера.

и в приведенном ниже ссылке есть несколько алгоритмов выбора - node в кластере: https://www.elastic.co/blog/found-leader-election-in-general#the-zen-way

Также можно увидеть алгоритм Raft: https://raft.github.io