Синхронная репликация
Синхронная репликация защищает данные при отказе мастер-узла: механизм гарантирует, что транзакция считается успешно завершенной только после того, как запись в журнал
упреждающей записи (WAL) выполнена на лидере и подтверждена кворумом реплик.
Для стабильной работы синхронной репликации необходимо соблюдение следующих условий:перевести кластер в режим election_mode = 'manual' и увеличить
значение параметра replication_synchro_timeout:
-
кластер работает в режиме
election_mode = 'manual'. Роль узлаmanualв наборе реплик позволяет явно контролировать выбор узла-лидера; -
увеличено значение параметра
replication_synchro_timeout— количество секунд ожидания репликации кворума синхронной транзакции до признания ее неудачной и отката. -
отключен механизм ограждения лидера с помощью параметра
election_fencing_mode = 'off'. Ограждение лидера (fencing) означает автоматический уход лидера с роли при потере связи с кворумом (когда остаётся меньшеreplication_synchro_quorumживых соединений с репликами).{note;info} При работе синхронной репликации ограждение лидера должно быть отключено, поскольку этот механизм несовместим с работой Cartridge. {/note}
Вместе параметры election_mode = 'manual' и replication_synchro_timeout защищают при смене мастер-узла от возникновения split-brain — появления двух и более лидер-узлов в одном наборе реплик.
В этом разделе описано, как задать настройки синхронной репликации при развертывании нового кластера, а также как задать их для уже существующего кластера:
- включение синхронной репликации при развертывании нового кластера;
- перевод существующего кластера в режим
election_mode = 'manual'.
Для корректной работы синхронного кластера необходимы следующие условия:
- работа автоматического восстановления после отказа в режиме
stateful; - внешний координатор аварийного переключения (failover coordinator), например etcd;
- несколько реплик в каждом наборе реплик;
- большинство реплик доступно во время записи.
Для набора реплик из трёх узлов кворум равен двум.
При развертывании нового кластера включите синхронный режим с помощью переменной enable_synchro_mode.
Это можно сделать одним из способов ниже:
-
в инвентаре ATE через переменную
cartridge_defaults:cartridge_defaults:enable_synchro_mode: trueelection_mode: "manual"replication_synchro_quorum: "N / 2 + 1" # N / 2 + 1 — значение по умолчанию для синхронного режима.replication_synchro_timeout: 432000 # 5 дней, примерelection_fencing_mode: "off" -
через переменную окружения сервиса Tarantool:
TARANTOOL_ENABLE_SYNCHRO_MODE: "true"TARANTOOL_ELECTION_MODE: "manual"TARANTOOL_REPLICATION_SYNCHRO_TIMEOUT: 432000TARANTOOL_ELECTION_FENCING_MODE: "off"
Здесь:
-
enable_synchro_mode = true— включен синхронный режим в кластере; -
election_mode = manual— режим работы выбора лидера; -
replication_synchro_quorum— число подтверждений, необходимых для коммита синхронной транзакции. Значение по умолчанию:N / 2 + 1. Для асинхронного кластера явно задают значение1; -
replication_synchro_timeoutзадаётся в секундах. Выбирайте его по максимальному теоретическому времени отключения и восстановления одного хранилища. Например, пять дней — это432000секунд.Пока кворум недоступен, синхронные транзакции остаются в синхронной очереди. Если время ожидания (
replication_synchro_timeout) истечет раньше восстановления хранилища, очередь откатится. Слишком низкое значение времени ожидания при сетевом разделении может привести к расхождению старого и нового лидера; -
election_fencing_mode=off— отключено ограждение лидера.
Чтобы создать синхронный пользовательский спейс, определите его в миграции через опцию space_opts.is_sync со значением true:
local orders = box.schema.space.create('orders', {is_sync = true,if_not_exists = true,})
При определении режима работы через опцию cartridge_defaults.enable_synchro_mode (TARANTOOL_ENABLE_SYNCHRO_MODE) кластер
выбирается целиком: он работает либо в синхронном режиме, либо в асинхронном.
Использовать эту настройку как способ разделить данные одного кластера на «критичные синхронные» и «некритичные асинхронные»
нельзя, это приведет к нарушению корректной работы кластера.
Чтобы настроить асинхронный кластер, проверьте, что соблюдены все настройки ниже:
- отключен синхронный режим в
cartridge_defaults.enable_synchro_mode; - для опции
cartridge_defaults.replication_synchro_quorumустановлено значение1; - не используются синхронные миграции и адрес обработки запросов
/sync.
Пользовательский спейс при миграции создаётся с включенным синхронным режимом (is_sync = true).
При этом системные спейсы после запуска по умолчанию ещё не переведены в синхронный режим.
Для перевода системных спейсов в синхронный режим выполните запрос /sync к HTTP API любого роутера:
curl -X POST http://localhost:8081/sync
Этот адрес обработки запросов (endpoint):
- находит активный мастер-узел в каждом наборе реплик хранилища;
- переводит подходящие спейсы в синхронный режим через опцию
is_sync = true; - обрабатывает системные спейсы, включая
_schema,_space,_index,_bucket,_migrationsи другие метаданные; - возвращает успешный ответ (
success) для лидеров хранилища; - возвращает ответ
skippedдля роутеров, так как они не владеют синхронной очередью; - безопасен для повторного вызова.
Локальные и временные спейсы, а также системный спейс _sequence_data остаются асинхронными.
Они не участвуют в этой операции по устройству TDB.
После развертывания синхронного кластера проверьте, что выполнены все условия ниже:
- в кластере нет критических ошибок;
- в каждом наборе реплик ровно один лидер;
- запрос
/syncвернул успешный ответ (success) для лидеров хранилища; - в ответе
/syncнужные спейсы находятся в секцииsync_spaces; - запись в синхронный спейс завершается только при наличии кворума.
Если большинство реплик остановить, запись должна ожидать восстановления кворума и не подтверждаться как успешно выполненная.
В режиме election_mode = 'off' повышение узла до роли лидера может выполняться без полноценного голосования Raft.
Отставшая или изолированная реплика в таком случае может стать лидером и начать принимать записи.
Эта ситуация создаёт риск возникновения split-brain.
В режиме manual повышение узла до лидера проходит через выборы Raft. Узел должен получить кворум голосов,
поэтому отставшая реплика не сможет стать лидером самостоятельно.
Перевод в режим работы manual не меняет режим работы Cartridge failover: автоматическое восстановление после отказа продолжает работать в режиме stateful.
Для перевода кластера в режим manual используется один из способов ниже:
Перед изменением режима election_mode убедитесь, что соблюдены все условия ниже:
- кластер здоров;
- реплики доступны и догнали лидеров;
- в каждом наборе реплик ровно один мастер-узел;
- автоматическое переключение после отказа работает в режиме
stateful; - нет ошибок репликации и синхронной очереди.
Проверьте текущие значения параметров:
box.cfg.election_modebox.cfg.election_fencing_moderequire('cartridge').failover_get_params().mode
Обычно перед миграцией ожидаются следующие значения:
election_mode = offfailover mode = stateful
Не меняйте режим во время уже запущенного аварийного переключения.
Переменные окружения применяются при запуске процесса, поэтому изменение конфигурации само по себе не переключает режим работы без повторного запуска.
Задайте на всех узлах значения параметров следующим образом:
TARANTOOL_ELECTION_MODE: "manual"TARANTOOL_REPLICATION_SYNCHRO_TIMEOUT: 432000TARANTOOL_ELECTION_FENCING_MODE: "off"
После этого выполните по шагам инструкцию ниже по очереди на каждом наборе реплик:
- Обновите конфигурацию сервисов.
- Перезапустите сервисы одного набора реплик за раз.
- Внутри набора реплик перезапускайте узлы по одному, не все одновременно.
- После каждого перезапуска дождитесь состояния
alive. - Проверьте репликацию и наличие одного лидера.
- Перейдите к следующему набору реплик.
Этот способ требует простоя, но исключает частично применённую конфигурацию. С точки зрения последовательности действий это наиболее простой способ переключить кластер.
Для перевода кластера в режим manual выполните последовательно шаги ниже:
- Остановите клиентскую нагрузку.
- Остановите кластер.
- Задайте на всех узлах параметр
TARANTOOL_ELECTION_MODE=manual. - Увеличьте значение параметра
TARANTOOL_REPLICATION_SYNCHRO_TIMEOUTдо 86400 или более. - Задайте параметр
TARANTOOL_ELECTION_FENCING_MODE=off. - Выполните полное повторное развертывание кластера.
- Запустите кластер.
- Дождитесь восстановления репликации.
- Проверьте текущий режим работы и лидер-узлы.
После переключения режима проверьте на всех узлах текущие значения параметров:
box.cfg.election_modebox.cfg.election_fencing_moderequire('cartridge').failover_get_params().modebox.info.election
После этого убедитесь, что соблюдены все условия ниже:
- в каждом наборе реплик ровно один мастер-узел;
- лидер меняется через штатное аварийное переключение в режиме
stateful; - отставшая реплика не становится лидером;
- режим
manualсохраняется после повторного запуска.
При работе в режиме stateful не используйте прямой вызов box.ctl.promote() как замену координатору:
результат может быть отменён Cartridge.
Для переключения лидера используйте штатное аварийное переключение Cartridge.