Мастер-реплика: ручное переключение при сбое
Пример на GitHub: manual_leader
В этом руководстве показано, как настроить набор реплик с ручным переключением при сбое и работать с ним.
Перед началом этого руководства:
-
Установите утилиту tt.
-
Создайте окружение tt в текущем каталоге, выполнив команду tt init.
-
Внутри каталога
instances.enabledсозданного окружения tt создайте каталогmanual_leader. -
Внутри каталога
instances.enabled/manual_leaderсоздайте файлыinstances.ymlиconfig.yaml:-
instances.ymlопределяет экземпляры для запуска в текущем окружении и должен выглядеть так:instance001:instance002: -
Файл
config.yamlпредназначен для хранения конфигурации набора реплик.
-
В этом разделе описана настройка набора реплик в файле config.yaml.
Сначала задайте значение manual для параметра
replication.failover:
replication:failover: manual
Определите топологию набора реплик в секции groups:
-
Параметр leader назначает экземпляр
instance001лидером набора реплик. -
Параметр iproto.listen задает адрес для прослушивания входящих запросов, через который реплики взаимодействуют между собой.
groups:group001:replicasets:replicaset001:leader: instance001instances:instance001:iproto:listen:- uri: '127.0.0.1:3301'instance002:iproto:listen:- uri: '127.0.0.1:3302'
В секции credentials
создайте пользователя replicator с ролью replication:
credentials:users:replicator:password: 'topsecret'roles: [replication]
Определите iproto.advertise.peer, чтобы объявить URI текущего экземпляра другим участникам набора реплик:
iproto:advertise:peer:login: replicator
Итоговая конфигурация набора реплик должна выглядеть так:
-
После настройки набора реплик выполните команду tt start из каталога окружения tt:
$ tt start manual_leader• Starting an instance [manual_leader:instance001]...• Starting an instance [manual_leader:instance002]... -
Убедитесь, что экземпляры находятся в статусе
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 --
-
Подключитесь к экземпляру
instance001с помощью команды tt connect:$ tt connect manual_leader:instance001• Connecting to the instance...• Connected to manual_leader:instance001 -
Убедитесь, что экземпляр находится в состоянии
running, выполнив функцию box.info.status:manual_leader:instance001> box.info.status---- running... -
Проверьте, что экземпляр доступен для записи, с помощью функции
box.info.ro:manual_leader:instance001> box.info.ro---- false... -
Выполните функцию
box.info.replication, чтобы проверить статус набора реплик. Для экземпляраinstance002значения полейupstream.statusиdownstream.statusдолжны быть равныfollow.manual_leader:instance001> box.info.replication---- 1:id: 1uuid: 9bb111c2-3ff5-36a7-00f4-2b9a573ea660lsn: 7name: instance0012:id: 2uuid: 4cfa6e3c-625e-b027-00a7-29b2f2182f23lsn: 0upstream:status: followidle: 0.3893879999996peer: replicator@127.0.0.1:3302lag: 0.00028800964355469name: instance002downstream:status: followidle: 0.37777199999982vclock: {1: 7}lag: 0...
Схемы соединений upstream и downstream см. в разделе
Мониторинг набора реплик.
Чтобы убедиться, что реплика (instance002) получает все обновления от мастера, выполните следующие шаги:
-
На
instance001создайте спейс и добавьте данные, как описано в примерах операций CRUD. -
Откройте второй терминал, подключитесь к
instance002с помощью командыtt connectи используйте операциюselect, чтобы убедиться, что данные реплицируются. -
Проверьте, что значения функции box.info.vclock совпадают на обоих экземплярах:
-
instance001:manual_leader:instance001> box.info.vclock---- {1: 21}... -
instance002:manual_leader:instance002> box.info.vclock---- {1: 21}...
-
В этом разделе описано, как добавить новую реплику в набор реплик.
- Добавьте экземпляр
instance003в файлinstances.yml:
instance001:instance002:
- Добавьте
instance003с заданным параметромiproto.listenв файлconfig.yaml:
groups:group001:replicasets:replicaset001:leader: instance001instances: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'
-
Откройте третий терминал для работы с новым экземпляром. Запустите
instance003с помощью командыtt start:$ tt start manual_leader:instance003• Starting an instance [manual_leader:instance003]... -
Проверьте статус набора реплик с помощью команды
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 могли получать данные с нового экземпляра, если он станет мастером.
-
Подключитесь к
instance003с помощью командыtt connect:$ tt connect manual_leader:instance003• Connecting to the instance...• Connected to manual_leader:instance001 -
Перезагрузите конфигурацию на всех трех экземплярах с помощью функции
reload(), предоставляемой модулем config:-
instance001:manual_leader:instance001> require('config'):reload()---... -
instance002:manual_leader:instance002> require('config'):reload()---... -
instance003:manual_leader:instance003> require('config'):reload()---...
-
-
Выполните функцию
box.info.replication, чтобы проверить состояние набора реплик. Убедитесь, что значения полейupstream.statusиdownstream.statusравныfollowдляinstance003.manual_leader:instance001> box.info.replication---- 1:id: 1uuid: 9bb111c2-3ff5-36a7-00f4-2b9a573ea660lsn: 21name: instance0012:id: 2uuid: 4cfa6e3c-625e-b027-00a7-29b2f2182f23lsn: 0upstream:status: followidle: 0.052655000000414peer: replicator@127.0.0.1:3302lag: 0.00010204315185547name: instance002downstream:status: followidle: 0.09503500000028vclock: {1: 21}lag: 0.000269174575805663:id: 3uuid: 9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6lsn: 0upstream:status: followidle: 0.77522099999987peer: replicator@127.0.0.1:3303lag: 0.0001838207244873name: instance003downstream:status: followidle: 0.33186100000012vclock: {1: 21}lag: 0...
В этом разделе показано, как выполнить ручное переключение при сбое и сменить лидера набора реплик.
-
В файле
config.yamlизмените лидера набора реплик сinstance001наnull:replicaset001:leader: null -
Перезагрузите конфигурации на всех трех экземплярах с помощью функции config:reload() и проверьте, что экземпляры находятся в режиме только для чтения. В примере ниже показано, как это сделать для
instance001:manual_leader:instance001> require('config'):reload()---...manual_leader:instance001> box.info.ro---- true...manual_leader:instance001> box.info.ro_reason---- config... -
Убедитесь, что значения функции 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}...
-
-
Измените лидера набора реплик в
config.yamlнаinstance002:replicaset001:leader: instance002 -
Перезагрузите конфигурацию на всех экземплярах с помощью функции config:reload().
-
Убедитесь, что
instance002стал новым мастером:manual_leader:instance002> box.info.ro---- false... -
Проверьте статус репликации с помощью функции
box.info.replication.
В этом разделе описан процесс удаления экземпляра из набора реплик.
Перед удалением экземпляра убедитесь, что он находится в режиме только для чтения. Если экземпляр является мастером, выполните ручное переключение.
-
Очистите параметр
iprotoдляinstance003, задав для него значение{}:instance003:iproto: {} -
Перезагрузите конфигурации на
instance001иinstance002:-
instance001:manual_leader:instance001> require('config'):reload()---... -
instance002:manual_leader:instance002> require('config'):reload()---...
-
-
Убедитесь, что секция
upstreamотсутствует дляinstance003, выполнив функциюbox.info.replication[3]:manual_leader:instance001> box.info.replication[3]---- id: 3uuid: 9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6lsn: 0downstream:status: followidle: 0.4588760000006vclock: {1: 21}lag: 0name: instance003...
-
Остановите
instance003с помощью команды tt stop:$ tt stop manual_leader:instance003• The Instance manual_leader:instance003 (PID = 15551) has been terminated. -
Проверьте, что для
instance003значение поляdownstream.status–stopped:manual_leader:instance001> box.info.replication[3]---- id: 3uuid: 9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6lsn: 0downstream:status: stoppedmessage: '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 pipename: instance003...
-
Удалите
instance003из файлаinstances.yml: -
Удалите
instance003изconfig.yaml:instances:instance001:iproto:listen:- uri: '127.0.0.1:3301'instance002:iproto:listen:- uri: '127.0.0.1:3302' -
Перезагрузите конфигурации на
instance001иinstance002:-
instance001:manual_leader:instance001> require('config'):reload()---... -
instance002:manual_leader:instance002> require('config'):reload()---...
-
Чтобы навсегда удалить экземпляр из набора реплик, его следует удалить из системного спейса box.space._cluster:
-
Выберите все кортежи в системном спейсе
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']... -
Удалите кортеж, соответствующий
instance003:manual_leader:instance002> box.space._cluster:delete(3)---- [3, '9a3a1b9b-8a18-baf6-00b3-a6e5e11fd8b6', 'instance003']... -
Выполните функцию
box.info.replication, чтобы проверить состояние работоспособности:manual_leader:instance002> box.info.replication---- 1:id: 1uuid: 9bb111c2-3ff5-36a7-00f4-2b9a573ea660lsn: 21upstream:status: followidle: 0.73316000000159peer: replicator@127.0.0.1:3301lag: 0.00016212463378906name: instance001downstream:status: followidle: 0.7269320000014vclock: {2: 1, 1: 21}lag: 0.000833988189697272:id: 2uuid: 4cfa6e3c-625e-b027-00a7-29b2f2182f23lsn: 1name: instance002...