Статус orphan
Начиная с версии Tarantool 1.9, изменена процедура присоединения
экземпляра к набору реплик. Во время выполнения box.cfg() экземпляр
пытается присоединиться ко всем узлам, указанным в
box.cfg.replication. Если экземпляру не
удается подключиться к необходимому числу узлов (см.
bootstrap_strategy), он переходит
в статус orphan. Пока экземпляр находится в статусе orphan, он
доступен только для чтения.
Чтобы «присоединиться» к мастеру, реплика должна «подключиться» к мастер-узлу, а затем «синхронизоваться».
«Подключение» означает установление связи с мастером по физической сети и получение подтверждения. Если подтверждение не получено в течение box.replication_connect_timeout секунд (обычно 4 секунды) и повторные попытки не увенчались успехом, шаг подключения считается неудачным.
«Синхронизация» означает получение обновлений от мастера для создания
локальной копии базы данных. Синхронизация завершается, когда реплика
получила все обновления или, по крайней мере, получила достаточно
обновлений, чтобы отставание реплики (см.
replication.upstream.lag в
box.info()) было меньше или равно количеству секунд, указанному в
box.cfg.replication_sync_lag.
Если replication_sync_lag не задан (nil) или равен TIMEOUT_INFINITY,
реплика пропускает состояние «синхронизации» и сразу переходит в
состояние «следования» (follow).
Чтобы выйти из режима orphan, необходимо синхронизоваться с достаточным числом экземпляров (bootstrap_strategy). Для этого можно:
- Сбросить
box.cfg.replication, исключив узлы, недоступные для подключения или синхронизации. - Задать для
box.cfg.replicationзначение""(пустая строка).
Возможны следующие ситуации.
Ситуация 1: начальная загрузка
Здесь box.cfg{} вызывается впервые. Реплика присоединяется, но набор
реплик еще не существует.
-
Установить статус 'orphan'.
-
Попытаться подключиться ко всем узлам из
box.cfg.replication. Реплика пытается подключиться в течение replication_connect_timeout секунд и повторяет попытки каждые replication_timeout секунд при необходимости. -
Прервать выполнение и выдать ошибку, если реплика не подключена к большинству узлов из
box.cfg.replication. -
Этот экземпляр может быть выбран в качестве «лидера» набора реплик. Критерии выбора лидера включают значение vclock (чем больше, тем лучше), а также режим доступа – только для чтения или на чтение и запись (предпочтительнее режим на чтение и запись, если нет другого выбора). Лидер – это мастер, к которому должны присоединяться другие экземпляры. Лидер – это мастер, который выполняет функции box.once().
-
Если этот экземпляр выбран лидером набора реплик, выполнить «автоматическую начальную загрузку»:
a. Установить статус 'running'.
b. Вернуться из
box.cfg{}.В противном случае этот экземпляр будет репликой, присоединяющейся к существующему набору реплик, поэтому:
a. Выполнить начальную загрузку от лидера. Примеры см. в разделе Начальная загрузка набора реплик.
b. В фоновом режиме синхронизоваться со всеми остальными узлами в наборе реплик.
Ситуация 2: восстановление
Здесь box.cfg{} вызывается не впервые. Он вызывается снова для
выполнения восстановления.
-
Выполнить восстановление на основе последнего локального снимка и WAL-файлов.
-
Попытаться установить соединения со всеми остальными узлами в течение replication_connect_timeout секунд. После истечения
replication_connect_timeoutили установления всех соединений перейти в состояние «синхронизации» со всеми установленными соединениями. -
При наличии подключений синхронизоваться со всеми подключенными узлами, пока разница не составит не более replication_sync_lag секунд.
Ситуация 3: обновление конфигурации
Здесь box.cfg{} вызывается не впервые. Он вызывается снова, поскольку
изменился какой-либо параметр репликации или что-то в наборе реплик.
-
Попытаться подключиться ко всем узлам из
box.cfg.replicationв течение времени, указанного в replication_connect_timeout. -
Попытаться синхронизоваться с подключенными узлами в течение времени, указанного в replication_sync_timeout.
-
Если предыдущие шаги завершились неудачей, изменить статус на 'orphan'. (Попытки синхронизации будут продолжаться в фоновом режиме, и при их успешном завершении статус 'orphan' будет снят.)
-
Если предыдущие шаги завершились успешно, установить статус 'running' (мастер) или 'follow' (реплика).
Ситуация 4: повторная начальная загрузка
Здесь box.cfg{} не вызывается. Реплика успешно подключилась в какой-то
момент в прошлом и теперь готова к получению обновлений от мастера. Но
мастер не может предоставить обновления. Это может произойти случайно
или, что более вероятно, из-за того, что реплика работает медленно (ее
отставание велико), и WAL-файлы
(.xlog), содержащие обновления, были удалены. Это не критично. Реплика
может отбросить то, что получила ранее, и запросить содержимое
последнего снимка мастера (.snap). Поскольку это фактически повторное
прохождение процесса начальной загрузки, такой процесс называется
«повторной начальной загрузкой» (rebootstrap). Однако есть одно отличие
от обычной начальной загрузки –
идентификатор реплики останется прежним. Если
бы он изменился, мастер счел бы реплику новым узлом в кластере и
сохранял бы запись об идентификаторе экземпляра реплики, которая
перестала существовать. Повторная начальная загрузка была добавлена в
Tarantool версии 1.10.2 и выполняется полностью автоматически.