Ответ 1
Теория:
Это выборы лидера, которая представляет собой форму Консенсусная проблема, также иногда называемая Проблема двух генералов. При некоторых наборах допущений (полностью асинхронно и сообщения могут быть потеряны) это оказалось невозможным, и доказательство особенно элегантно.
Интуиция этой проблемы такова: представьте, что существует какой-то алгоритм, позволяющий достичь консенсуса в некотором фиксированном количестве сообщений. Поскольку ошибки терпимы, мы можем удалить одно сообщение из протокола, и оно должно работать. Мы можем повторить этот процесс до тех пор, пока не будет сообщений вообще, что явно невозможно.
На практике мы преодолеваем это, используя детекторы отказа для имитации синхронной системы.
Наиболее широко известный алгоритм, который разрешает консенсус, Paxos, который может терпеть отказ до половины участвующих узлов. Paxos имеет репутацию очень трудно реализовать, так как даже незначительные недоразумения в деталях протокола уничтожают его правильность.
Практические решения:
Хотя проблема в целом довольно сложная, получить рабочие системы намного проще. Доступны полные реализации Paxos или эквивалентные алгоритмы. Apache Zookeeper - лучшее, что я знаю. Для вашей конкретной проблемы я уверен, что это будет ваш самый быстрый маршрут. Другие реализации Paxos находятся вокруг, и также может быть возможно создать что-то в сетевых избыточных виртуальных ip-инструментах, таких как Wackamole. Я считаю, что версии большинства коммерческих баз данных высокого класса предлагают функции кворума как (дорогой) вариант.
Кроме того, для многих приложений приемлемо слегка ослабить правильность или иначе настроить проблему, чтобы обеспечить гораздо более простые решения.
Например, если одна точка отказа допустима, потому что восстановление, скорее всего, будет быстрым, тогда проблема тривиальна: просто выполните один специальный node.
Другим подходом может быть создание системы вокруг идемпотентных действий, поэтому дублирование обработки становится допустимым.
Наконец, вы можете разделить рабочую нагрузку на пул не избыточных систем: здесь отказы будут откладывать обработку до восстановления, но только для элементов с этим node, а не для всей рабочей нагрузки.
Эти виды компромиссов настолько проще, что они часто являются лучшим выбором. Нужно взвесить полезность полного решения против сложности его реализации и посмотреть, действительно ли это значение. Вот почему многие практические системы просто используют 2 Phase или 3 Phase Commit, хотя они блокируются в некоторых сценариях: снижение доступности является допустимым по сравнению со сложностью полной системы кворума.