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

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

Пример на GitHub: manual_leader

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

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

Перед началом этого руководства:

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

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

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

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

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

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

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

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

replication:  failover: manual

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

Определите топологию набора реплик в секции groups:

  • Параметр leader назначает экземпляр instance001 лидером набора реплик.

  • Параметр iproto.listen задает адрес для прослушивания входящих запросов, через который реплики взаимодействуют между собой.

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

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

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

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

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

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

iproto:  advertise:    peer:      login: replicator

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

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

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

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

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

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

    $ tt status manual_leaderINSTANCE                   STATUS   PID   MODE  CONFIG  BOX      UPSTREAMmanual_leader:instance001  RUNNING  8841  RW    ready   running  --manual_leader:instance002  RUNNING  8842  RO    ready   running  --

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

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

    $ tt connect manual_leader:instance001   • Connecting to the instance...   • Connected to manual_leader:instance001
  2. Убедитесь, что экземпляр находится в состоянии running, выполнив функцию box.info.status:

    manual_leader:instance001> box.info.status---- running...
  3. Проверьте, что экземпляр доступен для записи, с помощью функции box.info.ro:

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

    manual_leader:instance001> box.info.replication---- 1:    id: 1    uuid: 9bb111c2-3ff5-36a7-00f4-2b9a573ea660    lsn: 7    name: instance001  2:    id: 2    uuid: 4cfa6e3c-625e-b027-00a7-29b2f2182f23    lsn: 0    upstream:      status: follow      idle: 0.3893879999996      peer: replicator@127.0.0.1:3302      lag: 0.00028800964355469    name: instance002    downstream:      status: follow      idle: 0.37777199999982      vclock: {1: 7}      lag: 0...

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

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

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

  1. На instance001 создайте спейс и добавьте данные, как описано в примерах операций CRUD.

  2. Откройте второй терминал, подключитесь к instance002 с помощью команды tt connect и используйте операцию select, чтобы убедиться, что данные реплицируются.

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

    • instance001:

      manual_leader:instance001> box.info.vclock---- {1: 21}...
    • instance002:

      manual_leader:instance002> box.info.vclock---- {1: 21}...

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

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

Добавление экземпляра в конфигурацию

  1. Добавьте экземпляр instance003 в файл instances.yml:
instance001:instance002:
  1. Добавьте instance003 с заданным параметром iproto.listen в файл config.yaml:
groups:  group001:    replicasets:      replicaset001:        leader: instance001        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'

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

  1. Откройте третий терминал для работы с новым экземпляром. Запустите instance003 с помощью команды tt start:

    $ tt start manual_leader:instance003   • Starting an instance [manual_leader:instance003]...
  2. Проверьте статус набора реплик с помощью команды tt status:

    $ tt status manual_leaderINSTANCE                   STATUS   PID   MODE  CONFIG  BOX      UPSTREAMmanual_leader:instance001  RUNNING  8841  RW    ready   running  --manual_leader:instance002  RUNNING  8842  RO    ready   running  --manual_leader:instance003  RUNNING  8856  RO    ready   running  --

Перезагрузка конфигурации

После добавления instance003 в конфигурацию и его запуска необходимо перезагрузить конфигурацию на всех экземплярах. Это нужно, чтобы instance001 и instance002 могли получать данные с нового экземпляра, если он станет мастером.

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

    $ tt connect manual_leader:instance003   • Connecting to the instance...   • Connected to manual_leader:instance001
  2. Перезагрузите конфигурацию на всех трех экземплярах с помощью функции reload(), предоставляемой модулем config:

    • instance001:

      manual_leader:instance001> require('config'):reload()---...
    • instance002:

      manual_leader:instance002> require('config'):reload()---...
    • instance003:

      manual_leader:instance003> require('config'):reload()---...
  3. Выполните функцию box.info.replication, чтобы проверить состояние набора реплик. Убедитесь, что значения полей upstream.status и downstream.status равны follow для instance003.

    manual_leader:instance001> box.info.replication---- 1:    id: 1    uuid: 9bb111c2-3ff5-36a7-00f4-2b9a573ea660    lsn: 21    name: instance001  2:    id: 2    uuid: 4cfa6e3c-625e-b027-00a7-29b2f2182f23    lsn: 0    upstream:      status: follow      idle: 0.052655000000414      peer: replicator@127.0.0.1:3302      lag: 0.00010204315185547    name: instance002    downstream:      status: follow      idle: 0.09503500000028      vclock: {1: 21}      lag: 0.00026917457580566  3:    id: 3    uuid: 9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6    lsn: 0    upstream:      status: follow      idle: 0.77522099999987      peer: replicator@127.0.0.1:3303      lag: 0.0001838207244873    name: instance003    downstream:      status: follow      idle: 0.33186100000012      vclock: {1: 21}      lag: 0...

Выполнение ручного переключения при сбое

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

Переключение экземпляров в режим только для чтения

  1. В файле config.yaml измените лидера набора реплик с instance001 на null:

    replicaset001:  leader: null
  2. Перезагрузите конфигурации на всех трех экземплярах с помощью функции config:reload() и проверьте, что экземпляры находятся в режиме только для чтения. В примере ниже показано, как это сделать для instance001:

    manual_leader:instance001> require('config'):reload()---...manual_leader:instance001> box.info.ro---- true...manual_leader:instance001> box.info.ro_reason---- config...
  3. Убедитесь, что значения функции box.info.vclock совпадают на всех экземплярах:

    • instance001:

      manual_leader:instance001> box.info.vclock---- {1: 21}...
    • instance002:

      manual_leader:instance002> box.info.vclock---- {1: 21}...
    • instance003:

      manual_leader:instance003> box.info.vclock---- {1: 21}...

Настройка нового лидера

  1. Измените лидера набора реплик в config.yaml на instance002:

    replicaset001:  leader: instance002
  2. Перезагрузите конфигурацию на всех экземплярах с помощью функции config:reload().

  3. Убедитесь, что instance002 стал новым мастером:

    manual_leader:instance002> box.info.ro---- false...
  4. Проверьте статус репликации с помощью функции box.info.replication.

Удаление экземпляров

В этом разделе описан процесс удаления экземпляра из набора реплик.

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

Отключение экземпляра

  1. Очистите параметр iproto для instance003, задав для него значение {}:

    instance003:  iproto: {}
  2. Перезагрузите конфигурации на instance001 и instance002:

    • instance001:

      manual_leader:instance001> require('config'):reload()---...
    • instance002:

      manual_leader:instance002> require('config'):reload()---...
  3. Убедитесь, что секция upstream отсутствует для instance003, выполнив функцию box.info.replication[3]:

    manual_leader:instance001> box.info.replication[3]---- id: 3  uuid: 9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6  lsn: 0  downstream:    status: follow    idle: 0.4588760000006    vclock: {1: 21}    lag: 0  name: instance003...

Остановка экземпляра

  1. Остановите instance003 с помощью команды tt stop:

    $ tt stop manual_leader:instance003   • The Instance manual_leader:instance003 (PID = 15551) has been terminated.
  2. Проверьте, что для instance003 значение поля downstream.statusstopped:

    manual_leader:instance001> box.info.replication[3]---- id: 3  uuid: 9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6  lsn: 0  downstream:    status: stopped    message: 'unexpected EOF when reading from socket, called on fd 27, aka 127.0.0.1:3301,      peer of 127.0.0.1:54185: Broken pipe'    system_message: Broken pipe  name: instance003...

Удаление экземпляра из конфигурации

  1. Удалите instance003 из файла instances.yml:

  2. Удалите instance003 из config.yaml:

    instances:  instance001:    iproto:      listen:      - uri: '127.0.0.1:3301'  instance002:    iproto:      listen:      - uri: '127.0.0.1:3302'
  3. Перезагрузите конфигурации на instance001 и instance002:

    • instance001:

      manual_leader:instance001> require('config'):reload()---...
    • instance002:

      manual_leader:instance002> require('config'):reload()---...

Удаление экземпляра из спейса '_cluster'

Чтобы навсегда удалить экземпляр из набора реплик, его следует удалить из системного спейса box.space._cluster:

  1. Выберите все кортежи в системном спейсе box.space._cluster:

    manual_leader:instance002> box.space._cluster:select{}---- - [1, '9bb111c2-3ff5-36a7-00f4-2b9a573ea660', 'instance001']  - [2, '4cfa6e3c-625e-b027-00a7-29b2f2182f23', 'instance002']  - [3, '9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6', 'instance003']...
  2. Удалите кортеж, соответствующий instance003:

    manual_leader:instance002> box.space._cluster:delete(3)---- [3, '9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6', 'instance003']...
  3. Выполните функцию box.info.replication, чтобы проверить состояние работоспособности:

    manual_leader:instance002> box.info.replication---- 1:    id: 1    uuid: 9bb111c2-3ff5-36a7-00f4-2b9a573ea660    lsn: 21    upstream:      status: follow      idle: 0.73316000000159      peer: replicator@127.0.0.1:3301      lag: 0.00016212463378906    name: instance001    downstream:      status: follow      idle: 0.7269320000014      vclock: {2: 1, 1: 21}      lag: 0.00083398818969727  2:    id: 2    uuid: 4cfa6e3c-625e-b027-00a7-29b2f2182f23    lsn: 1    name: instance002...