Схема развертывания 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-системы.
На обоих сервера, где устанавливаются пакеты 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>
После установки имен хостов, нужно добавить в файл hosts, чтобы сервера могли получать доступ до хостов системы по имени машины. На каждом хосте выполните следующую команду из под пользователя root для каждого из серверов (чтобы зайти из под root выполните "sudo su").
sudo echo '<HOST_1_IP> <HOST_1>' >> /etc/hosts sudo echo '<HOST_2_IP> <HOST_2>' >> /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 запустим скрипт создания репликации:
sudo /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_2_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".
Ручное конфигурирование keepalived:
Данный раздел необходимо выполнить только в том случае, если на вопрос "Настроить виртуальный IP-адрес? ("DO YOU WANT TO SET MASTER (VIRTUAL) IP address?")" был дан ответ "no". В этом случае, в процессе создания реплики, не был создан виртуальный адрес. Следовательно, не будет отрабатываться резервирование для ecss-mysql.Для того, чтобы доступ до реплицированного MySQL был прозрачен для клиентов, создаем виртуальный IP. Он будет переезжать между хостами ecss1, ecss2 средствами VRRP+keepalive, если на одном из них mysqld остановился. Для этого в конфигурационный файл keepalived.conf на каждой ноде добавить в конце следующую строку:
include ecss-mysql-replication.conf
Затем следует создать конфигурационный файл ecss-mysql-replication.conf по пути /etc/keepalived/ecss-mysql-replication.conf со следующим содержанием:
В секции vrrp_instance MySQL необходимо скорректировать свойства virtual_router_id, virtual_ipaddress под конкретную локацию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 на каждой из хостов ecss1, ecss2:
sudo systemctl restart keepalived.service
После этого на одном из хостов должен подняться интерфейс, по которому будет доступен MySQL. В случае, если на данном хосте остановить MySQL, то сетевой интерфейс переместится на соседний хост.
Настраиваем dnsmasq:
Данный пункт выполняется на хосте с установленным пакетом ecss-nodeДля того, чтобы подключить систему ECSS-10 к реплицированному MySQL необходимо настроить dnsmasq. Для этого нужно переконфигурировать пакет ecss-dns-env:
dpkg-reconfigure ecss-dns-env
В открывшимся окне конфигурации выбрать mysql, а затем ввести адрес <VIRTUAL_IP>.
Проверка корректности настройки репликации
Для проверки того, что репликация данных работает корректно необходимо выполнить следующие действия.
Проверить состояние реплики. Для этого выполните команду:
mysql -uroot -p -e 'show slave status \G;' | grep -E "Slave_IO_Running:|Slave_SQL_Running:"
Данная команда должна показывать на обоих хостах следующую информацию:
Slave_IO_Running: Yes Slave_SQL_Running: Yes
Проверить состояние событий. Для этого выполните команду:
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)
Восстановление реплики через mysqldump
Данный пункт необходимо выполнять в случае возникновения ошибок репликации. Рассмотрим пример восстановления данных на ecss2 на основе ecss1.
ecss1-mysql> STOP SLAVE; ecss1-mysql> RESET MASTER; ecss1-mysql> FLUSH TABLES WITH READ LOCK; ecss1-mysql> SHOW MASTER STATUS; # запомнить параметры File, Position (<FILE>, <POS>)
Не закрывая соединения с мастер базой следует сделать дамп необходимых данных. При закрытии соединения отключиться режим чтения.
ecss1-shell> mysqldump --verbose --single-transaction --quote-names --complete-insert --extended-insert --routines --events --triggers -uroot -proot --opt --databases ecss_audit ecss_address_book ecss_calls_db ecss_statistics ecss_subscribers history_db web_conf > ecss1.mysql.dump
Снять режим чтения командой:
ecss1-mysql> UNLOCK TABLES;
Скопировать файл ecss1.mysql.dump на ecss2. После этого зайти в mysql ecss2 и выполнить команду:
mysql-ecss2> STOP SLAVE;
Далее в shell ecss2 выполнить команду. Команда может выполняться длительное время.
mysql -uroot -p < ecss1.mysql.dump
Далее на слейве удалить все журналы от мастера и начать репликацию с момента, когда на мастере был сделан дамп:
mysql-ecss2> RESET SLAVE; mysql-ecss2> CHANGE MASTER TO MASTER_LOG_FILE='<FILE>', MASTER_LOG_POS=<POS>; mysql-ecss2> START SLAVE; mysql-ecss2> SHOW SLAVE STATUS \G;
Убедиться в том, что параметры Slave_IO_Running и Slave_SQL_Running установлены в значение Yes. Далее в mysql ecss2 выполняем:
mysql-ecss2> STOP SLAVE; mysql-ecss2> FLUSH TABLES WITH READ LOCK; mysql-ecss2> RESET MASTER; mysql-ecss2> SHOW MASTER STATUS;
Запомнить File и Position и в mysql ecss1 выполнить:
mysql-ecss1> CHANGE MASTER TO MASTER_LOG_FILE='<FILE>', MASTER_LOG_POS=<POS>; mysql-ecss1> START SLAVE; mysql-ecss1> SHOW SLAVE STATUS \G;
Убедиться в том, что параметры Slave_IO_Running и Slave_SQL_Running имеют значение Yes. Снять lock на ecss2 и запустить репликацию:
mysql-ecss2> UNLOCK TABLES; mysql-ecss2> START SLAVE;
Для получения предупреждений при нарушении репликации необходимо раскомментировать следующие строчки в конфигурационном файле медиатора /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} % ]}
Удаление репликации
Для того, чтобы удалить ранее созданную репликацию необходимо использовать специальный скрипт:
sudo /usr/lib/ecss/ecss-scripts/mysql-replication/remove_replication.sh