Почему рекомендуется создавать кластеры с нечетным количеством узлов

Есть несколько ресурсов о распределенных системах, таких как документация mongo db, которые рекомендуют нечетное количество узлов в кластере.

Каковы преимущества нечетного количества узлов?

3 ответа

Решение

Краткий ответ: в случае MongoDB нечетное количество узлов увеличивает доступность кластерной системы (время безотказной работы).

Посмотрите на таблицу в связанной документации MongoDB:

+-------------------+------------------------------------------+-----------------+
| Number of Members | Majority Required to Elect a New Primary | Fault Tolerance |
+-------------------+------------------------------------------+-----------------+
|         3         |                    2                     |        1        |
+-------------------+------------------------------------------+-----------------+
|         4         |                    3                     |        1        |
+-------------------+------------------------------------------+-----------------+
|         5         |                    3                     |        2        |
+-------------------+------------------------------------------+-----------------+
|         6         |                    4                     |        2        |
+-------------------+------------------------------------------+-----------------+

Обратите внимание: когда у вас нечетное количество участников и вы добавляете еще одного (чтобы стать четным), ваша отказоустойчивость не повышается! (Это означает, что ваш кластер не может терпеть больше отказавших участников, чем мог изначально)

Это связано с тем, что MongoDB требует, чтобы большинство участников было наверху, чтобы выбрать первичный. Это свойство не относится к MongoDB, а относится к любой кластерной системе, которая требует, чтобы большинство участников было активным (например, см. Также etcd).

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

Кроме того, наличие четного числа участников снижает вероятность того, что при наличии раздела сети некоторое подмножество ваших узлов сможет продолжить работу. Например, если у вас есть кластер из 6 узлов, это открывает возможность того, что сетевой раздел может разделить ваши узлы на 2 раздела по 3 узла. В таком случае ни один из разделов не сможет взаимодействовать с большинством участников, и ваш кластер станет недоступен.

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

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

рассмотрим кластер из 5 узлов. минимальное необходимое большинство - 3 (5/2 или 2 + 2 + 1- решающий момент).

Важно отметить, что для избрания лидера требуется большинство голосов кластера даже в условиях отказа.

Считайте, что 1 из 5 узлов вышел из строя. мы все еще можем избрать лидера с большинством голосов 3. Что ж, что, если из 4 узлов два лидера будут избраны с равными голосами 2? это остается на усмотрение алгоритма консенсуса для разрешения разногласий (возможно, просто повторно инициировать выборы)

допустим, 2 узла из 5 вышли из строя. мы все еще можем выбрать лидера с большинством голосов 3, т.е. когда все 3 доступных узла голосуют за один и тот же узел.

Обычно возникает путаница с достижением большинства, когда один из нечетных узлов выходит из строя, и их количество остается четным. К настоящему времени должно быть ясно, что для избрания лидера требуется большая часть первоначального размера кластера (желательно нечетного).

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

Пока часть кластера или количество рабочих узлов больше или равно полу (n/2)+1, для достижения консенсуса на основе большинства относительно начального размера кластера кластер может продолжать работу.

Краткий ответ: более высокая отказоустойчивость.

Это общий принцип, который применяется ко многим другим кластерам, использующим такие же алгоритмы выбора лидера RAFT , как кластеры Kubernetes ETCD.

Если он использует RAFT для выбора лидера, кластеру требуется большинство узлов, кворум, чтобы согласовать лидера. Для кластера из n членов кворум составляет (n / 2)+1.

С точки зрения отказоустойчивости добавление дополнительного узла к кластеру нечетного размера снижает отказоустойчивость. Как? У нас все еще есть такое же количество узлов, которые могут выйти из строя без потери кворума, однако у нас больше узлов, которые могут выйти из строя, что означает, что вероятность потери кворума на самом деле выше, чем раньше.

Для обеспечения отказоустойчивости, пожалуйста, проверьте этот официальный документ etcd для получения дополнительной информации.

Другие вопросы по тегам