Схема развертывания 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)
Установка пакетов с MySQL, конфигурацией баз данных, а также keepalive на обоих хостах:
sudo aptitude install ecss-mysql keepalived
При инсталляции ecss-mysql будут запрошены следующие данные:
IP-маска для прав MySQL-таблиц ("IP pattern for MySQL permission") — эта маска указывает, из-под какого пула IP-адресов будет доступен вход в базу данных. Необходимо указать пул адресов, в который будет входить адрес серверов, где будет установлен ecss-node, а также адрес другого сервера ecss-mysql.
Пример:
Если оба MySQL-сервера находятся на хостах, где будет установлен ecss-node:
ecss1 ecss2 ecss-mysql 192.168.1.1 192.168.1.2 ecss-node 192.168.1.1 192.168.1.2 Для этого примера в качестве маски для прав MySQL нужно указать 192.168.1.%.
Однако MySQL может быть вынесен на отдельные сервера, тогда маска сети должна быть сконфигурирована таким образом, чтобы хосты имели доступ друг к другу:
ecss1 ecss2 mysql-server-1 mysql-server-2 ecss-mysql 192.168.2.1 192.168.2.2 ecss-node 192.168.1.1 192.168.1.2 Для этого примера в качестве маски для прав MySQL нужно указать 192.168.%.
- Логин для администратора MySQL ("Login for MySQL root") — этот логин будет установлен для сервера mysql. Логин нужно запомнить, так как он потребуется в ходе установки других нод. Также он используется в процессе создания backup-системы.
Пароль для администратора MySQL ("Password for MySQL root") — этот пароль будет установлен для пользователя, указанного в ответе на предыдущий вопрос. Пароль нужно запомнить, так как он потребуется в ходе установки других нод. Также он используется в процессе создания backup-системы.
На обоих сервераx, где устанавливаются пакеты ecss-mysql, должны использоваться одинаковые логины и пароли.
Базы данных MySQL, используемых системой ECSS-10, после установки будут храниться по пути /var/lib/ecss-mysql. При установке пакета ecss-mysql aptitude задаст вопрос о разрешении изменения конфигурационного файла "Configuration file '/etc/apparmor.d/local/usr.sbin.mysqld'", чтобы изменить путь до баз mysql по умолчанию. Для успешной установки ecss-mysql требуется согласиться (ввести "Y"). Чтобы избежать ввода ответа на вопрос при установке пакета, допускается использовать дополнительные ключи при вводе команды установки:sudo apt-get -o Dpkg::Options::="--force-confnew" install ecss-mysql
Конфигурация bind-address для mysql.
Откройте конфигурационный файл mysql: /etc/mysql/mysql.conf.d/mysqld.cnf и добавьте туда следующую строку:bind-address = 0.0.0.0
Перезапустите сервис mysql:
sudo systemctl restart mysql.service
Данный пункт нужно выполнить на обоих хостах.
- Установка имен хостов.
Проверьте текущие имена хостов, где будет установлена ecss-mysql. Если сервера будут установлены на одном хосте с основной системой (ecss-node), то имя должно соответствовать ecss1/ecss2 соответственно. Если MySQL будут установлены на отдельные сервера, то имя хоста может быть любым. Воспользуйтесь следующей командой на обоих серверах, чтобы изменить имя хостов:
hostnamectl set-hostname <HOST_NAME>
После установки имен на каждом сервере в конец файла /etc/hosts нужно добавить IP-адрес и имя соседнего сервера, например на ecss1 выполнить:
sudo sh -c 'echo "192.168.1.2 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", то настройки необходимо задать вручную согласно 6 пункту.
- Определить, какой из хостов будем мастером ("WHICH HOST WILL BE MASTER?") (опционально, появляется, если предыдущий ответ на вопрос "нет") — указывает, кто из хостов будет мастером.
- Введите виртуальный IP-адрес ("ENTER VIRTUAL IP address") — введите виртуальный IP-адрес. Этот адрес будет общим для двух баз MySQL и будет располагаться на одном их хостов. После настройки именно этот адрес должен быть указан во всех сервисах ECSS, которым необходим доступ к базе данных. Если один из хостов с mysql станет недоступным, то адрес посредством keepalived переедет на второй хост, и база данных останется доступной.
- Нужна ли настройка keepalive? ("DO YOU WANT TO SET REST OF keepalive CONFIG") — при положительном ответе запускает конфигурацию keepalived.
- Введите маску для виртуального адреса ("ENTER VIRTUAL MASK (0-32)") — маска виртуального адреса.
- Введите router ID ("ENTER VIRTUAL ROUTER ID") — идентификатор Router-ID используется в конфигурации keepalived для соотношения секций виртуальных адресов. Если до установки ecss-mysql на хосте не производилась настройка keepalived, то используйте любой целочисленный ID (104). Если до установки ecss-mysql уже проводились какие либо настройки сервиса keepalived, то перед вводом параметра убедитесь, что значение уже не задействовано в других секциях конфигураций keepalived.
- Введите интерфейс ("ENTER INTERFACE") — интерфейс, на котором необходимо развернуть виртуальный IP-адрес ecss-mysql.
- Введите описание для интерфейса ("ENTER INTERFACE DESCRIPTION") — описание интерфейса. Укажите корректное и явное название, например: "<INTERFACE>:mysql".
По завершению установки скрипт выводит значения переменных Slave_IO_Running, Slave_SQL_Running на ecss1, ecss2. Если переменные равны "yes" — значит репликация запустилась. Шаблон автоматического создания файла находится по пути /usr/lib/ecss/ecss-scripts/mysql-replication/keepalived.conf :
vrrp_script check_mysqld { script "nc -z localhost 3306" # cheaper than pidof interval 2 # check every 2 seconds fall 1 rise 2 } !For MySQL vrrp_instance MySQL { state BACKUP interface <INTERFACE> virtual_router_id <VIRTUAL_ROUTER_ID> priority 100 advert_int 3 smtp_alert nopreempt authentication { auth_type PASS auth_pass keepmysql } virtual_ipaddress { <VIRTUAL_IP>/<VIRTUAL_MASK> dev <INTERFACE> label <INTERFACE_DESCRIPTION> } track_script { check_mysqld } }
Где автоматически подставятся введенные значения:
- <INTERFACE> — физический или виртуальный интерфейс сервера, где установлен пакет ecss-mysql. С этого интерфейса будет осуществляться обмен трафиком и мониторинг доступности второго сервера с MySQL. Соответственно через интерфейсы, указанные в конфигурациях на обоих хостах, должен быть доступ до хостов с ecss-mysql, а также до ecss-node, если сервер с MySQL вынесен от основной системы.
- <VIRTUAL_IP>/<VIRTUAL_MASK> — IP-адрес и маска виртуального адреса, через который будет осуществляться доступ к базе данных MySQL. После завершения конфигурации keepalived данный IP-адрес должен подняться на одном из хостов. В случае аварии на данном хосте IP-адрес должен динамически подняться на втором хосте. Таким образом, MySQL будет всегда доступен.
- <INTERFACE_DESCRIPTION> — описание интерфейса. Укажите корректное и явное название, например: "<INTERFACE>:mysql".
Ручное конфигурирование keepalived:
Данный пункт необходимо выполнить в случае, если на вопрос "Настроить виртуальный IP-адрес? ("DO YOU WANT TO SET MASTER (VIRTUAL) IP address?")" был дан ответ "no". В этом случае в процессе создания реплики не будет создан виртуальный адрес. Следовательно, не будет отрабатываться резервирование для ecss-mysql.Редактирование keepalived.conf
Следующий шаг — редактирование глобального конфигурационного файла keepalived.conf. На обоих хостах содержимое файла одинаковое:
sudo nano /etc/keepalived/keepalived.conf
BASHскопируйте и вставьте следующий текст в файл /etc/keepalived/keepalived.conf
global_defs { vrrp_version 3 # версия протокола VRRP (2 или 3) script_user nobody # ограниченный в правах системный пользователь, от которого будут запускаться скрипты проверки доступности enable_script_security # не запускать скрипты от root, если часть пути к ним доступна на запись для обычных пользователей } include /etc/keepalived/sip.conf include /etc/keepalived/mysql.conf
YMLПоскольку при создании репликации не была задействована автоматическая генерация конфигурации для mysql, то в конфигурационном файле необходимо сделать ссылку на mysql.conf: include /etc/keepalived/mysql.conf
Далее на обоих хостах создаются файлы /etc/keepalived/mysql.conf
sudo nano /etc/keepalived/mysql.conf
BASHсо следующим содержимым (каждый хост имеет индивидуальную информацию в этом файле)
скопируйте и вставьте следующий текст в файл /etc/keepalived/mysql.confСоздание VRRP для MySQL
/etc/keepalived/mysql.conf для ecss1 /etc/keepalived/mysql.conf для ecss2 # Конфигурация mysql первой ноды: vrrp_script check_mysql { script "/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e 'SELECT 1;'" # Для Ubuntu-18.04 # script "/usr/bin/mysql --defaults-file=/etc/mysql/mariadb.cnf -e 'SELECT 1;'" # Для Astra Linux Smolensk user root interval 2 fall 1 timeout 2 } vrrp_instance MySQL { state MASTER # Исходное состояние при старте interface net.10 # Имя сетевого интерфейса, на котором будет работать протокол VRRP virtual_router_id 10 # Уникальный идентификатор роутера (0..255) priority 100 # Приоритет (0..255) чем выше - тем больше advert_int 1 # Интервал рассылки уведомлений (с) preempt_delay 60 # Интервал ожидания мастера при старте демона (с) при исходном состоянии BACKUP unicast_src_ip 10.0.10.11 # Собственный реальный IP-адрес unicast_peer { 10.0.10.12 # Реальный IP-адрес соседа } virtual_ipaddress { # Виртуальный IP-адрес и маска # dev - сетевой интерфейс, на котором будет поднят виртуальный адрес # label - метка виртуального интерфейса (для удобства идентификации) 10.0.10.10/24 dev net.10 label net.10:mysql } track_script { check_mysql } }
YML# Конфигурация mysql второй ноды: vrrp_script check_mysql { script "/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e 'SELECT 1;'" # Для Ubuntu-18.04 # script "/usr/bin/mysql --defaults-file=/etc/mysql/mariadb.cnf -e 'SELECT 1;'" # Для Astra Linux Smolensk user root interval 2 fall 1 timeout 2 } vrrp_instance MySQL { state BACKUP # Исходное состояние при старте interface net.10 # Имя сетевого интерфейса, на котором будет работать протокол VRRP virtual_router_id 10 # Уникальный идентификатор роутера (0..255) priority 50 # Приоритет (0..255) чем выше - тем больше advert_int 1 # Интервал рассылки уведомлений (с) preempt_delay 60 # Интервал ожидания мастера при старте демона (с) при исходном состоянии BACKUP unicast_src_ip 10.0.10.12 # Собственный реальный IP-адрес unicast_peer { 10.0.10.11 # Реальный IP-адрес соседа } virtual_ipaddress { # Виртуальный IP-адрес и маска # dev - сетевой интерфейс, на котором будет поднят виртуальный адрес # label - метка виртуального интерфейса (для удобства идентификации) 10.0.10.10/24 dev net.10 label net.10:mysql } track_script { check_mysql } }
YMLВ данной конфигурации мы задаем ID для виртуального маршрутизатора, который будет являться балансером для своего хоста. Важно, чтобы virtual_router_id совпадали у обоих хостов.
После конфигурации необходимо перезапустить сервис keepalived на обоих хостах:
sudo systemctl restart keepalived.service
BASHпроверьте наличие интерфейса и ip-адреса после рестарта сервиса командой ifconfig, на хосте ecss1 вы должны увидеть :
abf@ecss1:~$ ifconfig . . . net.10:mysql: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.10.10 netmask 255.255.255.0 broadcast 0.0.0.0 ether 08:00:27:6d:4f:02 txqueuelen 1000 (Ethernet)
BASHПроверяем статус сервиса 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
Для того чтобы доступ до реплицированного MySQL был прозрачен для клиентов, создайте виртуальный IP. Он будет переезжать между хостами ecss1, ecss2 средствами VRRP+keepalive, если на одном из них MySQL остановился. Для этого в конфигурационный файл keepalived.conf на каждой ноде добавить в конце следующую строку (см. раздел "Общая настройка keepalived"):
include /etc/keepalived/mysql.conf
Перезапустите keepalived на каждом из хостов ecss1, ecss2:
sudo systemctl restart keepalived.service
После этого на одном из хостов должен подняться интерфейс, по которому будет доступен MySQL. В случае, если на данном хосте остановить MySQL, то сетевой интерфейс переместится на соседний хост.
Настраиваем 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