Режим работы кластера Bridge
Функциональность Корпоративной СУБД Яндекса
Данная функциональность доступна только в Корпоративной СУБД Яндекса. В open-source версии YDB она отсутствует.
Эта статья описывает особый режим работы кластера YDB, при котором хранение данных осуществляется с синхронной репликацией между несколькими частями кластера, называемыми pile.
Режим bridge является надстройкой над базовыми режимами распределённого хранилища: каждый pile строится по одному из поддерживаемых YDB режимов работы (например, mirror-3-dc или block-4-2) и сам по себе отказоустойчив; bridge добавляет поверх этого синхронную репликацию между pile и управляемый failover/switchover нагрузки между ними. Это обеспечивает дополнительный слой отказоустойчивости поверх выбранных топологий. Режим bridge требует больше оборудования и сложнее в эксплуатации; он особенно полезен для кластеров, размещённых в двух дата-центрах, и систем с повышенными требованиями к доступности — например, когда необходимо сохранять доступность при отказе трёх дата-центров из четырёх.
Описание режима
В режиме bridge узлы кластера разделяются на несколько pile (обычно — по одному pile в датацентре). При отказе одного из pile кластер становится недоступным до тех пор, пока не будет выполнена команда отключения этого pile. После отключения кластер возобновляет работу.
YDB поддерживается произвольное количество pile, однако для простоты изложения далее рассматривается случай с двумя pile.
На уровне распределённого хранилища в режиме bridge реализуется синхронная репликация по схеме Active / Active между pile. На уровне узлов баз данных возможно резервирование по схеме Active / Passive.
Для хранения данных используются пары групп хранения из разных pile. При этом для хранения данных в каждом из pile могут применяться любые поддерживаемые YDB режимы работы.
В режиме bridge может быть достигнут zero-downtime switchover. При failover кластер требует явного отключения репликации в отказавший pile для возобновления работы. При отключении любого pile происходит приостановка обслуживания запросов до выполнения команды отключения репликации в этот pile.
Pile не являются самостоятельными кластерами YDB, а представляют собой части одного кластера со сложной топологией:
- таблетки в режиме bridge запускаются в единственном экземпляре;
- в каждом pile работает отдельная статическая группа и набор независимых групп хранения с обычными VDisk. Доступ к группам хранения осуществляется через DS-proxy-proxy, который предоставляет таблеткам интерфейс DS-proxy и выполняет операции с использованием двух DS-proxy — по одной для групп в каждом pile;
- в каждом pile работает свой набор реплик StateStorage, SchemeBoard и Board. Доступ к StateStorage, SchemeBoard и Board осуществляется через аналогичные proxy-proxy.
Состояния Pile
Режим работы кластера определяется состояниями всех его pile. Например, для кластера из pile А и pile Б состояния pile указываются как (А, Б), где порядок имеет значение.
Каждый pile может находиться в одном из следующих состояний:
-
PRIMARY. Основной pile, в котором работают таблетки. Только один pile может находиться в состоянииPRIMARY. -
SYNCHRONIZED. Ведомый pile, в котором все группы хранения синхронизированы сPRIMARY. -
DISCONNECTED. Отключённый отPRIMARY, не участвует в выполнении операций. -
NOT_SYNCHRONIZED. Pile, в котором группы хранения ещё не синхронизированы сPRIMARY. При завершении синхронизации YDB автоматически переключает pile в состояниеSYNCHRONIZED. -
PROMOTED. Pile, который необходимо плавно переключить из состоянияSYNCHRONIZEDв состояниеPRIMARY. Pile пребывает в этом состоянии до завершения плавного переключения, после чего YDB автоматически переключает его в состояниеPRIMARY. -
SUSPENDED. Pile, который необходимо плавно переключить в состояниеDISCONNECTED. По завершении переключения YDB автоматически переводит pile в состояниеDISCONNECTED.
В норме пара pile работает в режиме PRIMARY/SYNCHRONIZED или SYNCHRONIZED/PRIMARY. То есть один из pile — PRIMARY, в нём работают таблетки, второй pile — SYNCHRONIZED, все его группы хранения синхронизированы с PRIMARY. Операция записи считается завершённой при таком состоянии pile только после успешного выполнения записи в группы хранения каждого pile с необходимой избыточностью.
Переходы между состояниями
| Состояние до | Состояние после | Как происходит | Пояснение |
|---|---|---|---|
PRIMARY |
SYNCHRONIZED |
Автоматически | Завершение планового переключения. |
PRIMARY |
DISCONNECTED |
Вручную — failover | Аварийное отключение недоступного PRIMARY с выбором нового PRIMARY. |
PRIMARY |
SUSPENDED |
Вручную — takedown | Плановое отключение текущего PRIMARY с выбором нового PRIMARY. |
SYNCHRONIZED |
PRIMARY |
Вручную — failover | Аварийное отключение недоступного PRIMARY с выбором нового PRIMARY. |
SYNCHRONIZED |
DISCONNECTED |
Вручную — failover | Аварийное отключение недоступного SYNCHRONIZED. |
SYNCHRONIZED |
PROMOTED |
Вручную — switchover | Старт плановой смены PRIMARY. |
SYNCHRONIZED |
SUSPENDED |
Вручную — takedown | Старт планового отключения SYNCHRONIZED pile. |
DISCONNECTED |
NOT_SYNCHRONIZED |
Вручную — rejoin | Возврат pile в кластер после обслуживания/восстановления. |
NOT_SYNCHRONIZED |
SYNCHRONIZED |
Автоматически | Завершение синхронизации данных. |
NOT_SYNCHRONIZED |
DISCONNECTED |
Вручную — failover | Аварийное отключение недоступного NOT_SYNCHRONIZED. |
PROMOTED |
PRIMARY |
Автоматически | Завершение планового переключения. |
PROMOTED |
PRIMARY |
Вручную — failover | Аварийное отключение недоступного PRIMARY с выбором нового PRIMARY. |
PROMOTED |
DISCONNECTED |
Вручную — failover | Аварийное отключение недоступного PROMOTED. |
SUSPENDED |
NOT_SYNCHRONIZED |
Вручную — rejoin | Отмена планового отключения pile. |
SUSPENDED |
DISCONNECTED |
Автоматически | Завершение планового отключения. |
SUSPENDED |
DISCONNECTED |
Вручную — failover | Аварийное отключение недоступного SUSPENDED. |
Сценарии изменения состояния
Отказ pile
При отказе pile кластер становится недоступным. Для возобновления работы кластера необходимо отключить отказавший pile, переведя его в состояние DISCONNECTED.
Администратор может подать команду переключения из состояния PRIMARY/SYNCHRONIZED или SYNCHRONIZED/PRIMARY в одно из состояний PRIMARY/DISCONNECTED или DISCONNECTED/PRIMARY. Команда изменяет конфигурацию групп хранения и приводит к изменению способа записи в эти группы. Interconnect разрывает сессии со всеми узлами pile в состоянии DISCONNECTED; при этом сессии для обмена данными не устанавливаются (TCP-соединения для обмена метаданными о состояниях pile могут оставаться активными). Дальнейшие операции записи и чтения выполняются без участия pile в состоянии DISCONNECTED. Если изменился PRIMARY pile, таблетки перезапускаются в нём.
Аналогичным образом выполняется переключение, если отказавший pile находился в любом состоянии, а назначаемый PRIMARY pile — в одном из допустимых состояний: PRIMARY, SYNCHRONIZED, PROMOTED.
Если назначаемый PRIMARY pile находился в состоянии DISCONNECTED, NOT_SYNCHRONIZED или SUSPENDED, штатное переключение невозможно, поскольку pile может не содержать полной и актуальной реплики данных.
Восстановление pile
После восстановления работоспособности узлов отказавшего pile его необходимо повторно подключить к кластеру, переведя в состояние NOT_SYNCHRONIZED.
Администратор может подать команду переключения из состояния PRIMARY/DISCONNECTED в PRIMARY/NOT_SYNCHRONIZED или из DISCONNECTED/PRIMARY в NOT_SYNCHRONIZED/PRIMARY. Произойдёт обмен конфигурацией между узлами; сессии interconnect устанавливаются только между узлами с одинаковой конфигурацией. Команда запускает синхронизацию групп хранения. По завершении синхронизации происходит автоматическое переключение из состояния PRIMARY/NOT_SYNCHRONIZED в PRIMARY/SYNCHRONIZED или из NOT_SYNCHRONIZED/PRIMARY в SYNCHRONIZED/PRIMARY.
Плановое переключение PRIMARY pile
Для плановой смены PRIMARY pile необходимо перевести назначаемый новым PRIMARY pile в состояние PROMOTED.
Администратор может подать команду переключения из состояния PRIMARY/SYNCHRONIZED в PRIMARY/PROMOTED или из SYNCHRONIZED/PRIMARY в PROMOTED/PRIMARY. Команда не изменяет способ записи в группы хранения, но обновляет их конфигурацию и инициирует смену PRIMARY pile с плавным переносом таблеток в новый PRIMARY. По завершении переключения состояние PRIMARY сменяется на SYNCHRONIZED, а PROMOTED - на PRIMARY.
Плановое отключение pile
Для планового отключения pile его необходимо перевести в состояние SUSPENDED.
Администратор может подать команду переключения из состояния PRIMARY/SYNCHRONIZED в PRIMARY/SUSPENDED или из SYNCHRONIZED/PRIMARY в SUSPENDED/PRIMARY. Будет выполнено плановое отключение узлов pile, переведённого в состояние SUSPENDED, с переводом их в режим DISCONNECTED. Система стремится минимизировать влияние этого процесса на работу кластера. После завершения перевода pile в состояние DISCONNECTED его узлы могут быть выключены для технического обслуживания.
После этого необходимо выполнить штатное восстановление pile, переключив его в состояние NOT_SYNCHRONIZED.
Восстановление при разделении кластера на две части с несовместимой конфигурацией (split brain)
Может возникнуть ситуация, когда администратор привёл кластер в состояние, при котором pile А и Б оказались изолированы друг от друга, а затем pile А был переконфигурирован так, что стал PRIMARY, а pile Б — SYNCHRONIZED, и одновременно pile Б был переконфигурирован так, что стал PRIMARY, а pile А — SYNCHRONIZED. Это приводит к разделению кластера на две части с несовместимой конфигурацией (split-brain). В таком состоянии каждая часть кластера может оставаться работоспособной.
Для восстановления единого кластера необходимо выбрать, какой из pile будет очищен. После этого нужно остановить все узлы этого pile, дождаться их полной остановки, очистить все диски на всех узлах, а затем снова включить узлы очищаемого pile.
После этого следует выполнить штатное восстановление pile, переведя его в состояние NOT_SYNCHRONIZED.
Нештатное восстановление pile
В сложных ситуациях, например при последовательных отказах pile, может возникнуть следующий сценарий: сначала отказал pile А, он был переведён в состояние DISCONNECTED, и кластер продолжил работу; затем произошёл необратимый отказ pile Б; после этого удалось восстановить работоспособность pile А. В таких случаях возможно восстановление кластера на основе pile А.
Если необходимо возобновить работу кластера, когда работоспособность сохранил только pile, находящийся в состоянии DISCONNECTED, NOT_SYNCHRONIZED или SUSPENDED, администратор может выполнить команду переключения из PRIMARY/DISCONNECTED в DISCONNECTED/PRIMARY (или аналогично для NOT_SYNCHRONIZED или SUSPENDED) с указанием специального параметра force. Это приведёт к разделению кластера на две части с несовместимой конфигурацией. В зависимости от фактического состояния данных в pile, который переводится в состояние PRIMARY, кластер может быть восстановлен в корректное или внутренне неконсистентное состояние. Работоспособность такого кластера не гарантируется.
Если кластер оказался работоспособным, можно продолжить восстановление до нормального состояния. Перед восстановлением отключённого pile необходимо полностью очистить данные и метаданные на всех его узлах, после чего перевести pile в состояние NOT_SYNCHRONIZED.
Особенности реализации режима bridge
Подробнее об устройстве режима bridge см. в Устройство режима bridge.