Введение
При работе с распределенными системами нам часто необходимо поддерживать и управлять информацией о конфигурации кластера, обнаружением регистрации служб, общими блокировками и другими функциями, и ZooKeeper является хорошим решением этих проблем. ZAB (ZooKeeper Atomic Broadcast) — это атомарный широковещательный протокол, разработанный для ZooKeeper, который поддерживает восстановление после сбоя.
Прежде чем рассматривать ZAB, давайте рассмотрим протокол двухфазной фиксации.
двухэтапная фиксация
Двухэтапная фиксация, как следует из названия, в основном делится на две фазы.
Этап 1 (этап запроса)
Координатор сначала отправляет всем остальным участникам запрос на выполнение транзакции, а когда участник получает perpare-запрос, он проверяет себя и сообщает координатору, согласиться или отменить свое решение.
Этап 2 (Фаза подтверждения)
Координатор отправляет запрос на фиксацию или откат по результатам голосования первого этапа (как правило, все участники отправляют запрос на фиксацию, если они с этим согласны, в противном случае отправляют запрос на откат).
Конечно, двухфазный протокол фиксации не идеален, и есть такие проблемы, как несогласованность данных, блокировка синхронизации и одиночная точка, которые не входят в рамки этой статьи.
Введение протокола
Что ж, после рассмотрения протокола двухфазной фиксации, продолжим анализ протокола ZAB.
Многие ошибочно думают, что протокол ZAB — это особая реализация Paxos, на самом деле это два разных протокола. Самая большая разница между ZAB и Paxos заключается в том, что ZAB в основном предназначен для распределенных основных и вторичных систем, а Paxos реализован как согласованный конечный автомат (репликация конечного автомата).
Хотя ZAB не является реализацией Paxos, ZAB также ссылается на некоторые дизайнерские идеи Paxos, такие как:
-
Лидер делает предложение последователям
-
Лидер должен достичь кворума (более половины) последователей, чтобы подтвердить перед совершением
-
У каждого предложения есть номер эпохи, как в бюллетенях на Паксосе.
Особенности ЗАБ
-
Гарантия согласованности
-
Надежная доставка — если транзакция A зафиксирована сервером, она в конечном итоге будет зафиксирована всеми серверами.
-
Глобальный порядок (Общий порядок) — Предположим, что есть две транзакции A и B, и один сервер сначала выполняет A, а затем B, тогда можно гарантировать, что A всегда выполняется раньше B на всех серверах.
-
Причинный порядок — если отправитель отправляет B после совершения транзакции A, то B должен быть выполнен до A.
-
Пока работает большинство (кворум) узлов, система будет работать нормально.
-
Когда узел перезапускается после перехода в автономный режим, должна быть гарантирована возможность восстановления к текущей выполняемой транзакции.
Конкретная реализация ZAB
-
ZooKeeper состоит из двух частей: клиентской и серверной.
-
Клиент может выполнять операции чтения на любом узле сервера
-
Клиент может инициировать запрос на запись на любом узле сервера, а узел, не являющийся лидером, перенаправит запрос на запись узлу-лидеру. Выполняется ведущим узлом
-
ZooKeeper использует адаптированный протокол двухэтапной фиксации для обеспечения согласованности транзакций для серверных узлов.
ZXID
ZooKeeper генерирует для каждой транзакции уникальный ZXID с увеличенной длиной 64 бита, который состоит из двух частей: младшие 32 бита представляют собой счетчик, а старшие 32 бита — эпоху. Эпоха генерируется текущим лидером, когда он становится лидером, и гарантированно будет больше, чем эпоха предыдущего лидера.
Фактически, когда новый лидер будет успешно избран, он получит самый большой ZXID в текущем кластере, удалит эпоху этого ZXID и добавит 1 к этой эпохе как свою собственную эпоху.
очередь истории
Каждый подчиненный узел будет иметь очередь «первым поступил — первым обслужен» (FIFO) для хранения полученных запросов транзакций, чтобы обеспечить порядок выполнения транзакций.
Надежная фиксация гарантируется протоколом согласованности транзакций ZAB. Глобальный порядок гарантируется протоколом TCP. Причинный порядок гарантируется очередью истории последователя.
Режим работы ЗАБ
-
режим трансляции
-
режим восстановления
режим трансляции
-
Лидер получает запрос на запись от клиента
-
Лидер генерирует новую транзакцию и генерирует уникальный ZXID для этой транзакции,
-
Лидер отправляет эту транзакцию всем подписчикам
-
Узел-последователь добавляет полученный запрос транзакции в очередь истории и отправляет подтверждение лидеру.
-
Когда лидер получает сообщение подтверждения от большинства последователей (больше, чем кворум), лидер отправляет запрос на фиксацию
-
Когда подписчик получает запрос на фиксацию, он будет судить, меньше ли ZXID транзакции, чем ZXID любой транзакции в очереди истории, если да, отправьте, если нет, дождитесь фиксации транзакции меньше, чем он
режим восстановления
Режим восстановления можно условно разделить на четыре этапа.
-
выборы
-
Находить
-
Синхронизировать
-
транслировать
Этапы процесса восстановления можно условно разделить на
-
Когда лидер выходит из строя, кластер вступает в фазу выборов и начинает выбирать потенциального нового лидера (обычно это узел с наибольшим ZXID в кластере).
-
На этапе обнаружения последователь связывается с потенциальным новым лидером.Если будет обнаружено, что больше последователей, чем кворум, согласны, потенциальный новый лидер увеличит эпоху на 1 и войдет в новую эпоху. Создан новый лидер
-
Синхронизация данных между кластерами гарантирует согласованность транзакций каждого узла в кластере.
-
Кластер возвращается в широковещательный режим и начинает принимать клиентские запросы на запись.
Когда у лидера происходит сбой после коммита, но до отправки сообщения о коммите, то есть только старый лидер коммитится сам, а остальные фолловеры не получают сообщение о коммите, новый лидер также должен убедиться, что предложение отправлено (новый лидер повторно отправит предложение. Сообщение фиксации Prorosal)
Когда лидер вылетает после генерации определенного предложения, но до отправки сообщения, то есть это предложение есть только у старого лидера.При перезапуске старого лидера (последователи слева и справа в это время) новый лидер должен убедиться, что старый лидер должен отказаться от этого предложения (новый лидер уведомит старого лидера после выхода в сеть, чтобы обрезать позицию последнего коммита, соответствующую его эпохе).
использованная литература
«От Паксиса до ZooKeeper» (не рекомендуется)
Zab vs. Paxos
Архитектура ZAB — протокол ZooKeeper Atomic Broadcast