Мастер-реплика: автоматическое переключение при сбое
Пример на GitHub: auto_leader
В этом руководстве показано, как настроить набор реплик с автоматическим переключением при сбое и работать с ним.
Перед началом работы:
-
Установите утилиту tt.
-
Создайте окружение tt в текущем каталоге, выполнив команду tt init.
-
В каталоге
instances.enabledсозданного окружения tt создайте каталогauto_leader. -
Внутри
instances.enabled/auto_leaderсоздайте файлыinstances.ymlиconfig.yaml:instances.ymlсодержит список экземпляров для запуска в текущем окружении и должен выглядеть так:
instance001:instance002:instance003:- Файл
config.yamlпредназначен для хранения конфигурации набора реплик.
В этом разделе описана настройка набора реплик в config.yaml.
Сначала задайте параметру
replication.failover
значение election:
replication:failover: election
Определите топологию набора реплик в разделе 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'
В разделе credentials
создайте пользователя replicator с ролью replication:
credentials:users:replicator:password: 'topsecret'roles: [replication]
Определите iproto.advertise.peer, чтобы сообщить другим участникам набора реплик о текущем экземпляре:
iproto:advertise:peer:login: replicator
Итоговая конфигурация набора реплик должна выглядеть так:
-
После настройки набора реплик выполните команду 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]... -
Проверьте, что экземпляры находятся в статусе
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 --
-
Подключитесь к экземпляру
instance001с помощью команды tt connect:$ tt connect auto_leader:instance001• Connecting to the instance...• Connected to auto_leader:instance001 -
Проверьте состояние экземпляра в контексте выбора лидера с помощью функции box.info.election. Вывод ниже показывает, что
instance001– ведомый, а экземплярinstance002– лидер набора реплик.auto_leader:instance001> box.info.election---- leader_idle: 0.77491499999815leader_name: instance002state: followervote: 0term: 2leader: 1... -
Проверьте, что
instance001находится в режиме чтения, с помощью функцииbox.info.ro:auto_leader:instance001> box.info.ro---- true... -
Выполните функцию
box.info.replication, чтобы проверить статус набора реплик. Убедитесь, что поляupstream.statusиdownstream.statusимеют значениеfollowдляinstance002и экземпляраinstance003.auto_leader:instance001> box.info.replication---- 1:id: 1uuid: 4cfa6e3c-625e-b027-00a7-29b2f2182f23lsn: 9upstream:status: followidle: 0.8257709999998peer: replicator@127.0.0.1:3302lag: 0.00012326240539551name: instance002downstream:status: followidle: 0.81174199999805vclock: {1: 9}lag: 02:id: 2uuid: 9bb111c2-3ff5-36a7-00f4-2b9a573ea660lsn: 0name: instance0013:id: 3uuid: 9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6lsn: 0upstream:status: followidle: 0.83125499999733peer: replicator@127.0.0.1:3303lag: 0.00010204315185547name: instance003downstream:status: followidle: 0.83213399999659vclock: {1: 9}lag: 0...
Схемы соединений upstream и downstream см. в разделе
Мониторинг набора реплик.
Чтобы убедиться, что реплики (instance001 и instance003) получают все обновления от мастера (instance002),
выполните следующие шаги:
-
Подключитесь к
instance002с помощью командыtt connect:$ tt connect auto_leader:instance002• Connecting to the instance...• Connected to auto_leader:instance002 -
Создайте спейс и добавьте данные, как описано в примерах операций CRUD.
-
Выполните операцию
selectнаinstance001иinstance003, чтобы убедиться, что данные реплицированы. -
Проверьте, что компонент
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}...
-
Чтобы проверить, как работает автоматическое переключение при сбое, когда останавливается текущий мастер, выполните следующие шаги:
-
Остановите текущий мастер-экземпляр (
instance002) с помощью командыtt stop:$ tt stop auto_leader:instance002• The Instance auto_leader:instance002 (PID = 24769) has been terminated. -
На
instance001проверьте функциюbox.info.election. В этом примере новым лидером набора реплик становитсяinstance001.auto_leader:instance001> box.info.election---- leader_idle: 0leader_name: instance001state: leadervote: 2term: 3leader: 2... -
Проверьте статус репликации с помощью функции
box.info.replicationдляinstance002:- поле
upstream.statusимеет значениеdisconnected. - поле
downstream.statusимеет значениеstopped.
auto_leader:instance001> box.info.replication---- 1:id: 1uuid: 4cfa6e3c-625e-b027-00a7-29b2f2182f23lsn: 32upstream:peer: replicator@127.0.0.1:3302lag: 0.00032305717468262status: disconnectedidle: 48.352504000002message: 'connect, called on fd 20, aka 127.0.0.1:62575: Connection refused'system_message: Connection refusedname: instance002downstream:status: stoppedmessage: '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 pipe2:id: 2uuid: 9bb111c2-3ff5-36a7-00f4-2b9a573ea660lsn: 1name: instance0013:id: 3uuid: 9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6lsn: 0upstream:status: followidle: 0.18620999999985peer: replicator@127.0.0.1:3303lag: 0.00012516975402832name: instance003downstream:status: followidle: 0.19718099999955vclock: {2: 1, 1: 32}lag: 0.00051403045654297... - поле
На диаграмме ниже показано, как выглядят соединения upstream и downstream:

-
Запустите
instance002снова с помощью командыtt start:$ tt start auto_leader:instance002• Starting an instance [auto_leader:instance002]...
-
Убедитесь, что значения функции 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}...
-
-
На
instance002выполните функцию box.ctl.promote(), чтобы назначить его новым лидером набора реплик:auto_leader:instance002> box.ctl.promote()---... -
Проверьте функцию
box.info.election, чтобы убедиться, чтоinstance002теперь лидер:auto_leader:instance002> box.info.election---- leader_idle: 0leader_name: instance002state: leadervote: 1term: 4leader: 1...
Процесс добавления экземпляров в набор реплик и их удаления одинаков для всех режимов отказоустойчивости. Подробности см. в руководстве Мастер-реплика: ручное переключение при сбое:
Перед удалением экземпляра из набора реплик с параметром
replication.failover,
установленным в значение election, убедитесь, что экземпляр находится в режиме чтения. Если экземпляр является мастером,
выберите нового лидера вручную.