Поддержка репликации данных Мессенджер и ВКС
Назначение документа
Для обеспечения отказоустойчивости Мессенджер и ВКС реализованы механизмы копирования всех сервисов и данных. При выходе из строя мастера (отсутствие сети, ошибки в коде) нагрузка переключается на реплику, и Мессенджер и ВКС продолжает работать «бесшовно». Для эксплуатации такой инфраструктуры обязательным условием является репликация данных между основной (main) и резервной (slave) частью бэкенда, чтобы в обеих частях были одинаковые данные в любой момент времени.
В документе описано, как отслеживать проблемы репликации данных и устранять их. Документ предназначен для использования администраторами организации.
Дополнительная документация
Инструкция по подключению к внешней системе мониторинга — в документе описана настройка интеграции с внешними системами мониторинга — VictoriaMetrics и Prometheus.
Мониторинг Мессенджер и ВКС — в документе описана параметры инсталляции Мессенджер и ВКС, которые необходимо контролировать.
Проблемы репликации сервисов и контроллера
Чтобы узнать о проблемах репликации, используйте систему мониторинга согласно документации — она будет мгновенно присылать алерты в случае обнаружения проблем. Ниже описаны примеры алертов конкретных ошибок разрыва репликации и шагов для восстановления репликации данных.
Внимание
Проблемы репликации могут приводить к потерям данных. Их нужно решать в кратчайшие сроки.
У сервиса типа KUST реплика не получает данных из мастера
Алерт:
2 snmpexec_mon_cox_1_status - - - replfailed (first: 2023-05-10/10:08:27, last: 2023-05-10/11:34:02, total: 3406)
Ниже рассмотрим, как устранить проблему репликации на примере сервиса Cox, инстанс 1:
-
Посмотрите карту сервиса при помощи команды:
-
Найдите в карте slave для нужного инстанса:
-
Подключитесь к slave-ноде (в нашем примере это нода vkt-4vm-879-standart-02) и выполните команду:
-
В выводе команды будет видно, что происходит удаление ряда файлов. Это нормально. В конце вывод должен быть таким:
Если вывод отличается, обратитесь в техническую поддержку.
У сервиса типа Tarantool нарушена репликация данных
Алерт:
2 tarantool_badger_3_repl_master1 slave_lag=0.01s;500.0;1000.0 slave_lag=0.01s;500.0;1000.0 replication status stopped(!!)
2 tarantool_badger_3_replication - - problems on upstreams:1
Ниже рассмотрим, как устранить проблему репликации на примере сервиса Badger, инстанс 3:
-
Посмотрите карту проблемного сервиса:
-
Найдите в карте slave для нужного инстанса для ноды, на которой запускали скрипт mon.sh. В нашем примере это нода vkt-4vm-675-standart-01, сервис Badger, инстанс 3:
-
Подключитесь к slave-ноде и выполните команду:
Дождитесь завершения процесса. Вывод в конце должен быть следующего вида:
-
Если вывод команды НЕ такой, то дальше для текущего сервиса ничего НЕ делаем. Обратитесь в техническую поддержку.
Если получен нужный вывод, через 5 минут на той же ноде, где выполняли шаг 3, выполните команду:
В выводе команды должно быть «started» или «ОК».
Если возникла ошибка, повторите выполнение команды через 5 минут. Если ошибка снова повторилась, обратитесь в техническую поддержку.
-
Если шаг 4 выполнился успешно, через 5 минут на той же ноде, где выполняли шаг 3, выполните команду:
и проверьте, что slave стал main, а main стал slave.
-
Если пункт 4 выполнился успешно, подключитесь по SSH к бывшей main-ноде и выполните команду:
У сервиса типа MySQL проблемы с топологией кластера
Алерт:
Чтобы проверить, есть ли проблема с репликацией у MySQL, посмотрите детали по топологии MySQL — выполните команду /usr/local/bin/orch_topo.sh на любой ноде.
Штатный вывод должен быть таким:
files-mysql-mysql-cluster-im-db-mysql-0.mysql.files:3306 (files-mysql-mysql-cluster-im-db-mysql-0) [0s,ok,8.0.27-18,rw,ROW,>>,GTID]
+ files-mysql-mysql-cluster-im-db-mysql-1.mysql.files:3306 (files-mysql-mysql-cluster-im-db-mysql-1) [0s,ok,8.0.27-18,ro,ROW,>>,GTID]
keycloak-mysql-mysql-cluster-im-db-mysql-0.mysql.keycloak:3306 (keycloak-mysql-mysql-cluster-im-db-mysql-0) [0s,ok,8.0.27-18,rw,ROW,>>,GTID]
+ keycloak-mysql-mysql-cluster-im-db-mysql-1.mysql.keycloak:3306 (keycloak-mysql-mysql-cluster-im-db-mysql-1) [0s,ok,8.0.27-18,ro,ROW,>>,GTID]
store-mysql-mysql-cluster-im-db-mysql-0.mysql.store:3306 (store-mysql-mysql-cluster-im-db-mysql-0) [0s,ok,8.0.27-18,rw,ROW,>>,GTID]
+ store-mysql-mysql-cluster-im-db-mysql-1.mysql.store:3306 (store-mysql-mysql-cluster-im-db-mysql-1) [0s,ok,8.0.27-18,ro,ROW,>>,GTID]
Инстансы без символов "+" в начале являются мастерами, с "+" — рабочими репликами.
Если в выводе видим, что запущено запущено 2 мастера:
files-mysql-mysql-cluster-im-db-mysql-0.mysql.files:3306 (files-mysql-mysql-cluster-im-db-mysql-0) [0s,ok,8.0.27-18,rw,ROW,>>,GTID]
files-mysql-mysql-cluster-im-db-mysql-1.mysql.files:3306 (files-mysql-mysql-cluster-im-db-mysql-1) [null,nonreplicating,8.0.27-18,ro,ROW,>>,GTID:errant]
keycloak-mysql-mysql-cluster-im-db-mysql-0.mysql.keycloak:3306 (keycloak-mysql-mysql-cluster-im-db-mysql-0) [0s,ok,8.0.27-18,rw,ROW,>>,GTID]
+ keycloak-mysql-mysql-cluster-im-db-mysql-1.mysql.keycloak:3306 (keycloak-mysql-mysql-cluster-im-db-mysql-1) [0s,ok,8.0.27-18,ro,ROW,>>,GTID]
store-mysql-mysql-cluster-im-db-mysql-0.mysql.store:3306 (store-mysql-mysql-cluster-im-db-mysql-0) [0s,ok,8.0.27-18,rw,ROW,>>,GTID]
+ store-mysql-mysql-cluster-im-db-mysql-1.mysql.store:3306 (store-mysql-mysql-cluster-im-db-mysql-1) [0s,ok,8.0.27-18,ro,ROW,>>,GTID]
или запущена реплика без мастера (статус null, nonreplicating):
files-mysql-mysql-cluster-im-db-mysql-1.mysql.files:3306 (files-mysql-mysql-cluster-im-db-mysql-1) [null,nonreplicating,8.0.27-18,ro,ROW,>>,GTID:errant]
keycloak-mysql-mysql-cluster-im-db-mysql-0.mysql.keycloak:3306 (keycloak-mysql-mysql-cluster-im-db-mysql-0) [0s,ok,8.0.27-18,rw,ROW,>>,GTID]
+ keycloak-mysql-mysql-cluster-im-db-mysql-1.mysql.keycloak:3306 (keycloak-mysql-mysql-cluster-im-db-mysql-1) [0s,ok,8.0.27-18,ro,ROW,>>,GTID]
store-mysql-mysql-cluster-im-db-mysql-0.mysql.store:3306 (store-mysql-mysql-cluster-im-db-mysql-0) [0s,ok,8.0.27-18,rw,ROW,>>,GTID]
+ store-mysql-mysql-cluster-im-db-mysql-1.mysql.store:3306 (store-mysql-mysql-cluster-im-db-mysql-1) [0s,ok,8.0.27-18,ro,ROW,>>,GTID]
То нужно обратиться в техническую поддержку.
Если в выводе видно некорректно работающую реплику (с символом "-" в начале строки):
files-mysql-mysql-cluster-im-db-mysql-0.mysql.files:3306 (files-mysql-mysql-cluster-im-db-mysql-0) [0s,ok,8.0.27-18,rw,ROW,>>,GTID]
- files-mysql-mysql-cluster-im-db-mysql-1.mysql.files:3306 (files-mysql-mysql-cluster-im-db-mysql-1) [null,nonreplicating,8.0.27-18,ro,ROW,>>,GTID:errant]
то имеются проблемы с репликацией, которые надо устранить.
Для этого:
-
Выполните на любой ноде команду:
где
— имя реплики, которую нужно перереплицировать с мастера, например, files-mysql-mysql-cluster-im-db-mysql-1.mysql.files:3306. Вывод должен быть таким:
# im_utils --reup-mysql-replica files-mysql-mysql-cluster-im-db-mysql-1.mysql.files:3306 25 Feb 25 15:29:31 854622 | WARN | pkg/weave/report.go:134 > assuming weave is ready | 25 Feb 25 15:29:31 854622 | INFO | pkg/weave/weave.go:140 > weave is ready | 25 Feb 25 15:29:31 854622 | WARN | pkg/weave/report.go:134 > assuming weave is ready | 25 Feb 25 15:29:31 854622 | INFO | cmd/utils/main.go:497 > deleting pvc files:data-files-mysql-mysql-cluster-im-db-mysql-1 | 25 Feb 25 15:29:31 854622 | INFO | cmd/utils/main.go:499 > deleting pod files:files-mysql-mysql-cluster-im-db-mysql-1 |
-
Дождитесь запуска нового пода. Чтобы вывести список подов, на любой из master-нод выполните команду:
где namespace — имя Kubernetes namespace, в котором запущена база. Определить namespace можно из вывода выше после фразы «deleting pvc» или «deleting pod».
Дождитесь, когда у нового пода появится READY 5/5:
-
Выполните команду /usr/local/bin/orch_topo.sh и проверьте, что больше нет ошибки «nonreplicating». Корректный вывод выглядит так:
files-mysql-mysql-cluster-im-db-mysql-0.mysql.files:3306 (files-mysql-mysql-cluster-im-db-mysql-0) [0s,ok,8.0.27-18,rw,ROW,>>,GTID] + files-mysql-mysql-cluster-im-db-mysql-1.mysql.files:3306 (files-mysql-mysql-cluster-im-db-mysql-1) [0s,ok,8.0.27-18,ro,ROW,>>,GTID] keycloak-mysql-mysql-cluster-im-db-mysql-0.mysql.keycloak:3306 (keycloak-mysql-mysql-cluster-im-db-mysql-0) [0s,ok,8.0.27-18,rw,ROW,>>,GTID] + keycloak-mysql-mysql-cluster-im-db-mysql-1.mysql.keycloak:3306 (keycloak-mysql-mysql-cluster-im-db-mysql-1) [0s,ok,8.0.27-18,ro,ROW,>>,GTID] store-mysql-mysql-cluster-im-db-mysql-0.mysql.store:3306 (store-mysql-mysql-cluster-im-db-mysql-0) [0s,ok,8.0.27-18,rw,ROW,>>,GTID] + store-mysql-mysql-cluster-im-db-mysql-1.mysql.store:3306 (store-mysql-mysql-cluster-im-db-mysql-1) [0s,ok,8.0.27-18,ro,ROW,>>,GTID]
Чтобы проверить, есть ли на реплике MySQL транзации, которых нет на мастере, выполните команду /usr/local/bin/orch_topo.sh на любой ноде. Если в выводе есть статус «errant», то такие транзакции есть. Например:
files-mysql-mysql-cluster-im-db-mysql-0.mysql.files:3306 (files-mysql-mysql-cluster-im-db-mysql-0) [0s,ok,8.0.27-18,rw,ROW,>>,GTID]
+ files-mysql-mysql-cluster-im-db-mysql-1.mysql.files:3306 (files-mysql-mysql-cluster-im-db-mysql-1) [0s,ok,8.0.27-18,ro,ROW,>>,GTID:errant]
В данном примере проблемный инстанс — files-mysql-mysql-cluster-im-db-mysql-1.mysql.files:3306.
Чтобы исправить эту ошибку:
-
Выполните на любой ноде команду:
где replica — имя реплики, на которой нужно исправить errant-транзакции, например, files-mysql-mysql-cluster-im-db-mysql-1.mysql.files:3306.
-
Через 2 минуты выполните команду /usr/local/bin/orch_topo.sh. Проверьте, что в выводе больше нет ошибок. Корректный вывод выглядит так:
files-mysql-mysql-cluster-im-db-mysql-0.mysql.files:3306 (files-mysql-mysql-cluster-im-db-mysql-0) [0s,ok,8.0.27-18,rw,ROW,>>,GTID] + files-mysql-mysql-cluster-im-db-mysql-1.mysql.files:3306 (files-mysql-mysql-cluster-im-db-mysql-1) [0s,ok,8.0.27-18,ro,ROW,>>,GTID] keycloak-mysql-mysql-cluster-im-db-mysql-0.mysql.keycloak:3306 (keycloak-mysql-mysql-cluster-im-db-mysql-0) [0s,ok,8.0.27-18,rw,ROW,>>,GTID] + keycloak-mysql-mysql-cluster-im-db-mysql-1.mysql.keycloak:3306 (keycloak-mysql-mysql-cluster-im-db-mysql-1) [0s,ok,8.0.27-18,ro,ROW,>>,GTID] store-mysql-mysql-cluster-im-db-mysql-0.mysql.store:3306 (store-mysql-mysql-cluster-im-db-mysql-0) [0s,ok,8.0.27-18,rw,ROW,>>,GTID] + store-mysql-mysql-cluster-im-db-mysql-1.mysql.store:3306 (store-mysql-mysql-cluster-im-db-mysql-1) [0s,ok,8.0.27-18,ro,ROW,>>,GTID]
Проблемы с репликацией контроллера
Алерт:
В данном случае алерт указывает на проблему с репликой на ноде vkt04 сервиса Ctlr. Убедитесь, что мастер сервиса Ctlr запущен и работает на ноде vkt03:
vkt03# echo ipros_cluster_show |nc $(fgrep compot_bind /usr/local/etc/ctlr-1.conf |cut -d' ' -f2 |cut -d':' -f1) 4020
vkt03.weave.local 10.32.88.0:2410 self main
vkt04.weave.local 10.32.96.0:2410 dead
В выводе ожидается строка вида:
Она означает, что мастер контроллера запущен на ноде vkt03.
Чтобы восстановить репликацию на vkt04, выполните:
vkt04# cp -rp /data/ctlr-1 /data/ctlr-1.$(date +%Y%m%d_%H%M)
vkt04# /usr/local/bin/im_deployer --ctlr-repl --update
vkt04# systemctl disable ctlr-1
После выполнения команды выше проверьте топологию контроллера:
vkt03# /usr/lib/check_mk_agent/local/ctlr_topo_check.sh
0 ctlr_topo_check - ctlr topology is OK
vkt03# echo ipros_cluster_show |nc $(fgrep compot_bind /usr/local/etc/ctlr-1.conf |cut -d' ' -f2 |cut -d':' -f1) 4020
vkt03.weave.local 10.32.88.0:2410 self main
vkt04.weave.local 10.32.96.0:2410 alive
В выводе обе ноды контроллера должны иметь статус «self main» или «alive».
Проблемы с ролями контроллера
В кластере Мессенджер и ВКС штатно работает 2 инстанса контроллера. Один из этих контроллеров имеет роль мастера, второй — реплики. Роль контроллера задается в конфигурационном файле /usr/loca/etc/ctlr-1.conf, например:
vkt03# fgrep ipros_cluster /usr/local/etc/ctlr-1.conf
ipros_clustered true
ipros_cluster_add vkt04.weave.local 10.32.96.0:2410
ipros_cluster_add vkt03.weave.local 10.32.32.0:2410
ipros_cluster_main vkt03.weave.local
В данном случае мастером является инстанс контроллера, запущенный на vkt03.
Эти параметры должны быть согласованы между двумя инстансами контроллера. То есть на vkt04 конфигурационный файл будет выглядеть так же:
vkt04# fgrep ipros_cluster /usr/local/etc/ctlr-1.conf
ipros_clustered true
ipros_cluster_add vkt04.weave.local 10.32.96.0:2410
ipros_cluster_add vkt03.weave.local 10.32.32.0:2410
ipros_cluster_main vkt03.weave.local
Алерт:
может указывать на наличие двух запущенных мастеров сервиса Сtlr.
Внимание
Нельзя допускать ситуации, когда в кластере запущено два инстанса контроллера с ролью мастер — это может приводить к потере данных и к различным нарушениями в работе кластера.
Посмотреть текущую топологию контроллера можно командой:
vkt03# echo ipros_cluster_show |nc $(fgrep compot_bind /usr/local/etc/ctlr-1.conf |cut -d' ' -f2 |cut -d':' -f1) 4020
vkt03.weave.local 10.32.88.0:2410 self main
vkt04.weave.local 10.32.96.0:2410 alive
Если по какой-то причине в кластере запущено 2 мастера, вывод будет следующим:
vkt03# echo ipros_cluster_show |nc $(fgrep compot_bind /usr/local/etc/ctlr-1.conf |cut -d' ' -f2 |cut -d':' -f1) 4020
vkt03.weave.local 10.32.88.0:2410 self main
vkt04.weave.local 10.32.96.0:2410 dead
vkt04# echo ipros_cluster_show |nc $(fgrep compot_bind /usr/local/etc/ctlr-1.conf |cut -d' ' -f2 |cut -d':' -f1) 4020
vkt03.weave.local 10.32.88.0:2410 dead
vkt04.weave.local 10.32.96.0:2410 self main
То есть контроллер на vkt03 считает себя мастером и контроллер на vkt04 тоже считает себя мастером. Таким образом, мы обнаружили проблему с ролями контроллеров вручную.
В данной ситуации нужно принять один из контроллеров за мастер, а второй переключить на реплику и перереплицировать (удалить данные реплики и подтянуть их из мастера).
Какой из контроллеров выбирать мастером — зависит от истории инцидента. Правильнее всего выбрать мастером тот контроллер, который штатно получил роль мастера, а за реплику принять контроллер, который ошибочно получил роль мастера (как правило недавно, контроллер получает ошибочную роль в последнюю очередь).
Например, мы принимаем за мастер контроллер на vkt04.
На vkt03 выполните:
systemctl stop ctlr-1
cp -rp /data/ctlr-1 /data/ctlr-1.$(date +%Y%m%d_%H%M)
/usr/local/bin/im_deployer --ctlr-repl --update
systemctl disable ctlr-1
После выполнения команды проверьте топологию контроллера:
vkt03# /usr/lib/check_mk_agent/local/ctlr_topo_check.sh
0 ctlr_topo_check - ctlr topology is OK
vkt03# echo ipros_cluster_show |nc $(fgrep compot_bind /usr/local/etc/ctlr-1.conf |cut -d' ' -f2 |cut -d':' -f1) 4020
vkt03.weave.local 10.32.88.0:2410 self
vkt04.weave.local 10.32.96.0:2410 alive main
Если команды выполняются на vkt03, в выводе нода vkt03 должна быть в статусе «self», а vkt04 — «alive main».