Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

Мастер-реплика: автоматическое переключение при сбое

Пример на GitHub: auto_leader

В этом руководстве показано, как настроить набор реплик с автоматическим переключением при сбое и работать с ним.

Предварительные требования

Перед началом работы:

  1. Установите утилиту tt.

  2. Создайте окружение tt в текущем каталоге, выполнив команду tt init.

  3. В каталоге instances.enabled созданного окружения tt создайте каталог auto_leader.

  4. Внутри instances.enabled/auto_leader создайте файлы instances.yml и config.yaml:

    • instances.yml содержит список экземпляров для запуска в текущем окружении и должен выглядеть так:
    instance001:instance002:instance003:

Настройка набора реплик

В этом разделе описана настройка набора реплик в config.yaml.

Шаг 1: Настройка режима отказоустойчивости

Сначала задайте параметру replication.failover значение election:

replication:  failover: election

Шаг 2: Определение топологии набора реплик

Определите топологию набора реплик в разделе groups. Параметр iproto.listen задает адрес для прослушивания входящих запросов и позволяет репликам взаимодействовать друг с другом.

groups:  group001:    replicasets:      replicaset001:        instances:          instance001:            iproto:              listen:              - uri: '127.0.0.1:3301'          instance002:            iproto:              listen:              - uri: '127.0.0.1:3302'          instance003:            iproto:              listen:              - uri: '127.0.0.1:3303'

Шаг 3: Создание пользователя для репликации

В разделе credentials создайте пользователя replicator с ролью replication:

credentials:  users:    replicator:      password: 'topsecret'      roles: [replication]

Шаг 4: Указание advertise URI

Определите iproto.advertise.peer, чтобы сообщить другим участникам набора реплик о текущем экземпляре:

iproto:  advertise:    peer:      login: replicator

Итоговая конфигурация

Итоговая конфигурация набора реплик должна выглядеть так:

Работа с набором реплик

Запуск экземпляров

  1. После настройки набора реплик выполните команду tt start из каталога окружения tt:

    $ tt start auto_leader   • Starting an instance [auto_leader:instance001]...   • Starting an instance [auto_leader:instance002]...   • Starting an instance [auto_leader:instance003]...
  2. Проверьте, что экземпляры находятся в статусе RUNNING, с помощью команды tt status:

    $ tt status auto_leaderINSTANCE                 STATUS   PID   MODE  CONFIG  BOX      UPSTREAMauto_leader:instance001  RUNNING  9170  RO    ready   running  --auto_leader:instance002  RUNNING  9171  RO    ready   running  --auto_leader:instance003  RUNNING  9172  RW    ready   running  --

Проверка статуса набора реплик

  1. Подключитесь к экземпляру instance001 с помощью команды tt connect:

    $ tt connect auto_leader:instance001   • Connecting to the instance...   • Connected to auto_leader:instance001
  2. Проверьте состояние экземпляра в контексте выбора лидера с помощью функции box.info.election. Вывод ниже показывает, что instance001 – ведомый, а экземпляр instance002 – лидер набора реплик.

    auto_leader:instance001> box.info.election---- leader_idle: 0.77491499999815  leader_name: instance002  state: follower  vote: 0  term: 2  leader: 1...
  3. Проверьте, что instance001 находится в режиме чтения, с помощью функции box.info.ro:

    auto_leader:instance001> box.info.ro---- true...
  4. Выполните функцию box.info.replication, чтобы проверить статус набора реплик. Убедитесь, что поля upstream.status и downstream.status имеют значение follow для instance002 и экземпляра instance003.

    auto_leader:instance001> box.info.replication---- 1:    id: 1    uuid: 4cfa6e3c-625e-b027-00a7-29b2f2182f23    lsn: 9    upstream:      status: follow      idle: 0.8257709999998      peer: replicator@127.0.0.1:3302      lag: 0.00012326240539551    name: instance002    downstream:      status: follow      idle: 0.81174199999805      vclock: {1: 9}      lag: 0  2:    id: 2    uuid: 9bb111c2-3ff5-36a7-00f4-2b9a573ea660    lsn: 0    name: instance001  3:    id: 3    uuid: 9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6    lsn: 0    upstream:      status: follow      idle: 0.83125499999733      peer: replicator@127.0.0.1:3303      lag: 0.00010204315185547    name: instance003    downstream:      status: follow      idle: 0.83213399999659      vclock: {1: 9}      lag: 0...

Схемы соединений upstream и downstream см. в разделе Мониторинг набора реплик.

Добавление данных

Чтобы убедиться, что реплики (instance001 и instance003) получают все обновления от мастера (instance002), выполните следующие шаги:

  1. Подключитесь к instance002 с помощью команды tt connect:

    $ tt connect auto_leader:instance002   • Connecting to the instance...   • Connected to auto_leader:instance002
  2. Создайте спейс и добавьте данные, как описано в примерах операций CRUD.

  3. Выполните операцию select на instance001 и instance003, чтобы убедиться, что данные реплицированы.

  4. Проверьте, что компонент 1 значений функции box.info.vclock одинаков на всех экземплярах:

    • instance001:

      auto_leader:instance001> box.info.vclock---- {0: 1, 1: 32}...
    • instance002:

      auto_leader:instance002> box.info.vclock---- {0: 1, 1: 32}...
    • instance003:

      auto_leader:instance003> box.info.vclock---- {0: 1, 1: 32}...

Тестирование автоматического отказоустойчивого режима

Чтобы проверить, как работает автоматическое переключение при сбое, когда останавливается текущий мастер, выполните следующие шаги:

  1. Остановите текущий мастер-экземпляр (instance002) с помощью команды tt stop:

    $ tt stop auto_leader:instance002   • The Instance auto_leader:instance002 (PID = 24769) has been terminated.
  2. На instance001 проверьте функцию box.info.election. В этом примере новым лидером набора реплик становится instance001.

    auto_leader:instance001> box.info.election---- leader_idle: 0  leader_name: instance001  state: leader  vote: 2  term: 3  leader: 2...
  3. Проверьте статус репликации с помощью функции box.info.replication для instance002:

    • поле upstream.status имеет значение disconnected.
    • поле downstream.status имеет значение stopped.
    auto_leader:instance001> box.info.replication---- 1:    id: 1    uuid: 4cfa6e3c-625e-b027-00a7-29b2f2182f23    lsn: 32    upstream:      peer: replicator@127.0.0.1:3302      lag: 0.00032305717468262      status: disconnected      idle: 48.352504000002      message: 'connect, called on fd 20, aka 127.0.0.1:62575: Connection refused'      system_message: Connection refused    name: instance002    downstream:      status: stopped      message: 'unexpected EOF when reading from socket, called on fd 32, aka 127.0.0.1:3301,        peer of 127.0.0.1:62204: Broken pipe'      system_message: Broken pipe  2:    id: 2    uuid: 9bb111c2-3ff5-36a7-00f4-2b9a573ea660    lsn: 1    name: instance001  3:    id: 3    uuid: 9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6    lsn: 0    upstream:      status: follow      idle: 0.18620999999985      peer: replicator@127.0.0.1:3303      lag: 0.00012516975402832    name: instance003    downstream:      status: follow      idle: 0.19718099999955      vclock: {2: 1, 1: 32}      lag: 0.00051403045654297...

На диаграмме ниже показано, как выглядят соединения upstream и downstream:

статус репликации на новом мастере

  1. Запустите instance002 снова с помощью команды tt start:

    $ tt start auto_leader:instance002   • Starting an instance [auto_leader:instance002]...

Выбор лидера вручную

  1. Убедитесь, что значения функции box.info.vclock (за исключением компонента 0) одинаковы на всех экземплярах:

    • instance001:

      auto_leader:instance001> box.info.vclock---- {0: 2, 1: 32, 2: 1}...
    • instance002:

      auto_leader:instance002> box.info.vclock---- {0: 2, 1: 32, 2: 1}...
    • instance003:

      auto_leader:instance003> box.info.vclock---- {0: 3, 1: 32, 2: 1}...
  2. На instance002 выполните функцию box.ctl.promote(), чтобы назначить его новым лидером набора реплик:

    auto_leader:instance002> box.ctl.promote()---...
  3. Проверьте функцию box.info.election, чтобы убедиться, что instance002 теперь лидер:

    auto_leader:instance002> box.info.election---- leader_idle: 0  leader_name: instance002  state: leader  vote: 1  term: 4  leader: 1...

Добавление и удаление экземпляров

Процесс добавления экземпляров в набор реплик и их удаления одинаков для всех режимов отказоустойчивости. Подробности см. в руководстве Мастер-реплика: ручное переключение при сбое:

Перед удалением экземпляра из набора реплик с параметром replication.failover, установленным в значение election, убедитесь, что экземпляр находится в режиме чтения. Если экземпляр является мастером, выберите нового лидера вручную.