Выбор лидера для хранилища значений ключей на основе 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 и поместить всю необходимую логику на сетевой уровень:
- Отбросьте все сообщения Подготовить и Принять, полученные от любого узла, кроме лидера, до истечения срока аренды.
- Проактивно увеличьте серийный номер и время аренды вашего лидера незадолго до истечения срока аренды.