Выбор лидера для хранилища значений ключей на основе paxos

Я собираюсь реализовать хранилище значений ключей с несколькими Paxos. У меня было бы несколько узлов, один из которых является основным узлом. Этот первичный узел получает запросы на обновление и реплицирует значения на подчиненные узлы.

У меня вопрос, как выбран основной узел (или лидер)? Могу ли я по-прежнему использовать алгоритм Паксоса? Если да, то считаете ли вы необходимым абстрагировать реализацию paxos в единое целое, которое может использоваться не только единицей репликации, но и единицей выбора лидера?

Если я использую узел с наименьшим идентификатором, чтобы быть лидером? Как я могу реализовать мастер аренды?

Спасибо за любые ответы.

2 ответа

Решение

Прежде чем перейти к конкретному вопросу, я хотел бы предложить, чтобы в системе, подобной paxos, вы рассматривали ее не как отношения "хозяин-раб", а как отношения "равный равный". Basic Paxos даже не имеет концепции лидера. Multi-paxos выбирает лидера для оптимизации производительности, выбирая этого лидера как часть протокола.

Multi-Paxos сводится к Paxos внизу: есть фаза подготовки и фаза принятия. Идея Multi-Paxos состоит в том, что, как только узел выигрывает раунд принятия, он одновременно выигрывает выборы лидера, и после этого фаза подготовки не требуется от этого лидера, пока он не обнаружит, что другой узел принял лидерство.


А теперь несколько практических советов. У меня многолетний опыт работы с несколькими паксо, мультипаксо и другими системами консенсуса.

Сначала я предлагаю не использовать ни Paxos, ни Multi-paxos. Оптимизировать производительность систем Paxos, сохраняя их правильность, очень сложно, особенно если у вас возникают такие вопросы. Вместо этого я бы посмотрел на реализацию протокола Raft.

Принимая оба протокола как есть, протокол Raft может иметь гораздо лучшую пропускную способность, чем Multi-Paxos. Авторы Raft (и другие) предполагают, что Raft легче понять и реализовать.

Вы также можете изучить использование одной из систем Raft с открытым исходным кодом. У меня нет опыта ни с одним из них, чтобы сказать вам, как легко поддерживать. Я слышал, однако, о боли в поддержании экземпляров Zookeeper. (Я также слышал жалобы на доказательство правильности Zookeeper.)

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

Наконец, проверьте ваши потребности в пропускной способности. Если ваша пропускная способность достаточно высока, вам необходимо выяснить, как распределить между несколькими консенсусными кластерами. И это еще один шарик воска.

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

  • Серийный номер
  • Текущий идентификатор лидера
  • Отметка времени истечения срока аренды текущего лидера
  • Список одноранговых идентификаторов

Вы можете использовать стандартную реализацию paxos и поместить всю необходимую логику на сетевой уровень:

  • Отбросьте все сообщения Подготовить и Принять, полученные от любого узла, кроме лидера, до истечения срока аренды.
  • Проактивно увеличьте серийный номер и время аренды вашего лидера незадолго до истечения срока аренды.
Другие вопросы по тегам