Схема развертывания MySQL master-master replication с использованием keepalive
Конфигурация ecss-mysql и создание репликации
Для корректной отработки скрипта настройки репликации MySQL необходимо следующее:
- Версия ОС: Ubuntu 18.04;
- Версия MySQL: mysql-server-5.7;
- Два хоста для настройки репликации (по умолчанию имена хостов ecss1, ecss2);
- На каждом из хостов должен быть пользователь с одинаковым именем, имеющим root-права (нужен только на этапе выполнения скрипта). В рассматривающейся ниже инструкции будет использоваться имя пользователя support.
Используемые переменные:
- <DB_ROOT_LOGIN> — имя root MySQL-сервера (root)
- <DB_ROOT_PASSWORD> — пароль root MySQL-сервера
- <HOST_1_IP> — IP-адрес хоста ecss1
- <HOST_2_IP> — IP-адрес хоста ecss2
- <HOST_1> — имя первого хоста (ecss1)
- <HOST_2> — имя второго хоста (ecss2)
- <REPLICA_USER> — пользователь, который будет использоваться для репликации данных (replica)
- <REPLICA_USER_PASSWORD> — пароль для REPLICA_USER
- <HOST_2_USER> — пользователь для доступа к shell ecss2
- <MEDIATOR_HOST> — хост, на котором развернут mediator (127.0.0.1)
- <SNMP_PORT> — SNMP-порт медиатора (162)
- Установка имен хостов.
Проверьте текущие имена хостов, где будет установлена ecss-mysql. Если сервера будут установлены на одном хосте с основной системой (ecss-node), то имя должно соответствовать ecss1/ecss2 соответственно. Если MySQL будут установлены на отдельные сервера, то имя хоста может быть любым. Воспользуйтесь следующей командой на обоих серверах, чтобы изменить имя хостов:
hostnamectl set-hostname <HOST_NAME>
После установки имен на каждом сервере в конец файла /etc/hosts нужно добавить IP-адрес и имя соседнего сервера, например на ecss1 выполнить:
sudo sh -c 'echo "192.168.1.22 ecss2" >> /etc/hosts'
Если MySQL установлены на отдельных серверах, то добавьте в файл /etc/hosts имена и IP-адреса серверов с ecss-node, а также серверов с ecss-mysql.
Поддержка доступа между серверами с ecss-mysql через ssh по rsa-ключам без использования пароля.
На хосте ecss1 сгенерируйте rsa-ключ следующей командой (выполняйте команду без sudo, чтобы ключ сгенерировался для текущего пользователя):
ssh-keygen
Передайте ключ на ecss2:
ssh-copy-id support@ecss2
Аналогичным образом сгенерируйте ключ на хосте ecss2 и скопируйте его на первый хост:
ssh-keygen ssh-copy-id support@ecss1
После успешной установки пакета ecss-mysql на обоих хостах требуется настроить репликацию между базами данных MySQL. Для этого на хосте ecss1 запустите скрипт создания репликации:
/usr/lib/ecss/ecss-scripts/mysql-replication/install_replication.sh
Продублируйте ответы из пункта с установкой пакета до вопроса о настройке репликации:
- Логин root пользователя ("Enter db root login") — пользователь для доступа к MySQL.
- Пароль root пользователя ("Enter db root password") — пароль для доступа к MySQL.
- Логин для пользователя replica ("Login for replica user") — с этим логином в MySQL будет создан пользователь. Данный пользователь используется для входа в MySQL при репликации системы. Пароль нужно запомнить, он используется в процессе восстановления репликации.
- Пароль для пользователя replica ("Password for replica user") — этот пароль будет установлен для пользователя, указанного в ответе на предыдущий вопрос. Пароль нужно запомнить, так как он используется в процессе восстановления репликации.
- IP-адрес локального хоста ("Local host IP address") — IP-адрес хоста, на котором запускается репликация. В приведенном примере это <HOST_1_IP>.
- IP-адрес удаленного хоста ("Remote host IP address") — IP-адрес второго хоста, на котором развернут MySQL и с которым происходит репликация. В приведенном примере это <HOST_2_IP>.
- Имя удаленного хоста ("Remote host name") — имя соседнего хоста с установленным пакетом ecss-mysql. В приведенном примере это ecss2.
- Логин для входа на удаленный хост ("Login for remote host") — имя пользователя, которое будет использоваться для входа по ssh на соседний хост с ecss-mysql. В приведенном примере это support.
- IP-адрес хоста с Mediator ("Mediator host IP address") — IP-адрес хоста, на котором будет развернут пакет ecss-node. В приведенном примере это <HOST_1_IP>. Однако, если в разворачиваемой системе ecss-node и ecss-mysql буду находить на различных серверах, требуется указать IP-адрес хоста с ecss-node.
- SNMP-порт Mediator ("Mediator SNMP port") — порт, на котором сервер с mediator слушает SNMP-трафик. Оставьте значение по умолчанию, равное 162.
Следующая секция предлагает автоматическую настройку виртуального IP-адреса в keepalive для доступа к базе данных. В случаи отработки резерва, виртуальный адрес будет автоматически переезжать на другой хост.
- Настроить виртуальный IP-адрес? ("DO YOU WANT TO SET MASTER (VIRTUAL) IP address?") — если ответ "yes", то данный скрипт самостоятельно создаст настройки для виртуального адреса MySQL, если "no", то настройки необходимо задать вручную.
- Определить, какой из хостов будем мастером ("WHICH HOST WILL BE MASTER?") (опционально, появляется, если предыдущий ответ на вопрос "нет") — указывает, кто из хостов будет мастером.
По завершению установки скрипт выводит значения переменных Slave_IO_Running, Slave_SQL_Running на ecss1, ecss2. Если переменные равны "yes" — значит репликация запустилась. Шаблон автоматического создания файла находится по пути /usr/lib/ecss/ecss-scripts/mysql-replication/keepalived.conf :
Ручное конфигурирование keepalived,в случае, если на вопрос "Настроить виртуальный IP-адрес? ("DO YOU WANT TO SET MASTER (VIRTUAL) IP address?")" был дан ответ "no":
Проверяем статус сервиса ecss-mysql-checker.timer на обоих хостах, должен быть active:
sudo systemctl status ecss-mysql-checker.timer
Пример:
sudo systemctl status ecss-mysql-checker.timer ● ecss-mysql-checker.timer - Check replication status every minute Loaded: loaded (/lib/systemd/system/ecss-mysql-checker.timer; disabled; vendor preset: enabled) Active: active (waiting) since Fri 2023-11-03 15:17:20 +07; 1s ago Trigger: Fri 2023-11-03 15:18:00 +07; 37s left
Настраиваем dnsmasq:
Данный пункт выполняется на хосте с установленным пакетом ecss-node .Для того чтобы подключить систему ECSS-10 к реплицированному MySQL, необходимо настроить dnsmasq. Для этого нужно переконфигурировать пакет ecss-dns-env:
sudo dpkg-reconfigure ecss-dns-env
В открывшимся окне конфигурации выбрать mysql, а затем ввести адрес <VIRTUAL_IP>.
Проверка корректности настройки репликации
Для проверки того, что репликация данных работает корректно необходимо выполнить следующие действия:
Проверить состояние реплики. Для этого выполните команду:
sudo mysql -uroot -p -e 'show slave status \G;' | grep -E "Slave_IO_Running:|Slave_SQL_Running:"
Данная команда должна показывать на обоих хостах следующую информацию:
Slave_IO_Running: Yes Slave_SQL_Running: Yes
Проверить состояние событий. Для этого выполните команду:
sudo mysql -uroot -p -e 'SELECT EVENT_SCHEMA, EVENT_NAME, STATUS FROM INFORMATION_SCHEMA.EVENTS;'
На обоих хостах статус всех ивентов должен быть ENABLED. Пример:
mysql> SELECT EVENT_SCHEMA, EVENT_NAME, STATUS FROM INFORMATION_SCHEMA.EVENTS; +-----------------+------------------------------+---------+ | EVENT_SCHEMA | EVENT_NAME | STATUS | +-----------------+------------------------------+---------+ | ecss_calls_db | try_generate_count_cdr_event | ENABLED | | ecss_statistics | generate_aggregation_event | ENABLED | | ecss_meeting_db | cleanup_event | ENABLED | +-----------------+------------------------------+---------+ 11 rows in set (0.00 sec)
- Проверить таблицы состояний:
Для мастера данное число будет равно 1, для slave 0.
mysql> select * from ecss_system.events_status; +--------+---------+ | lock | enabled | +--------+---------+ | events | 0 | +--------+---------+ 1 row in set (0.00 sec)
В случае возникновения ошибок репликации необходимо выполнить действия, описанные в разделе Восстановление репликации БД MySQL.
Для получения предупреждений при нарушении репликации необходимо раскомментировать следующие строки в конфигурационном файле медиатора /etc/ecss/ecss-mediator/md1.config и перезапустить ecss-mediator:
% ,{manager, [
% {config, [
% {dir, "/etc/ecss/snmp/manager/"},
% {verbosity, silence},
% {db_dir, "/var/lib/ecss/snmp/"}
% ]},
% {def_user_mod, snmp_alarm_user}
% ]}
Удаление репликации
Для того чтобы удалить ранее созданную репликацию, необходимо использовать специальный скрипт:
/usr/lib/ecss/ecss-scripts/mysql-replication/remove_replication.sh