Схема развертывания 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.Для отказоустойчивости в кластере ECSS-10 используется режим репликации MySQL мастер-мастер. Это позволяет корректно переносить данные в любом направлении. Однако одновременная запись на оба сервера MySQL с одновременной репликацией во встречном направлении повышает вероятность коллизий, что снижает отказоустойчивость. Поэтому рекомендуется настроить выделенный виртуальный адрес для кластера MySQL, чтобы запись данных в один момент времени производилась на одну ноду.
Если создавать файлы /etc/keepalived/mysql.conf вручную, то при запуске скрипта создания репликации нужно отказаться от автоматической настройки при вопросе "Нужна ли настройка keepalive? ("DO YOU WANT TO SET REST OF keepalive CONFIG").
Конфигурацию виртуальных адресов для MySQL рекомендуется поместить в отдельный файл /etc/keepalived/mysql.conf.
# Конфигурация 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 <network_interface> # Имя сетевого интерфейса, на котором будет работать протокол VRRP virtual_router_id <ID> # Уникальный идентификатор роутера (0..255) priority 100 # Приоритет (0..255) чем выше — тем больше advert_int 1 # Интервал рассылки уведомлений (c) preempt_delay 60 # Интервал ожидания мастера при старте демона (с) при исходном состоянии BACKUP unicast_src_ip <src_real IP> # Собственный реальный IP-адрес unicast_peer { <real_remote IP> # Реальный IP-адрес соседа } virtual_ipaddress { # Виртуальный IP-адрес и маска # dev — сетевой интерфейс, на котором будет поднят виртуальный адрес # label — метка виртуального интерфейса (для удобства идентификации) <virtual_sip_IP>/<netmask> dev <> label <label> } track_script { check_mysql } }
# Конфигурация 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 <network_interface> # Имя сетевого интерфейса, на котором будет работать протокол VRRP virtual_router_id <ID> # Уникальный идентификатор роутера (0..255) priority 50 # Приоритет (0..255) чем выше — тем больше advert_int 1 # Интервал рассылки уведомлений (с) preempt_delay 60 # Интервал ожидания мастера при старте демона (с) при исходном состоянии BACKUP unicast_src_ip <src_real IP> # Собственный реальный IP-адрес unicast_peer { <real_remote IP> # Реальный IP-адрес соседа } virtual_ipaddress { # Виртуальный IP-адрес и маска # dev — сетевой интерфейс, на котором будет поднят виртуальный адрес # label — метка виртуального интерфейса (для удобства идентификации) <virtual_sip_IP>/<netmask> dev <> label <label> } track_script { check_mysql } }
Для того чтобы доступ до реплицированного 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 'use ecss_statistics; show events\G;' | grep Status
Оба из хостов (на котором присутствует виртуальный адрес keepalive) должен показать следующий статус:
Status: ENABLED
- Проверить таблицы состояний:
Для мастера данное число будет равно 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@ecss1.config и перезапустить ecss-mediator.0:
% ,{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