Используемая ОС: Ubuntu 16.04
Mysql-server-5.7
Имя хостов: ecss1, ecss2
Имя пользователя на хостах с Root-правами: ssw
Используемые переменные:
- <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-3.10 keepalived
В процессе установки пакета ecss-mysql вас попросят установить IP-маску для доступа к базам ecss. Необходимо указать маску сети, которая используется для внутреннего взаимодействия нод. Например, если HOST_1_IP = 192.168.2.1, а HOST_2_IP = 192.168.2.2, то при установке ecss-mysql нужно указать следующую маску 192.168.2.%. Запрещается устанавливать маску в 127.0.0.% для системы, которая будет работать в кластере.Данный пункт нужно выполнить на обоих хостах.
Конфигурируем bind-address для mysql.
Откройте конфигурационный файл mysql: /etc/mysql/mysql.conf.d/mysqld.cnf и добавьте туда следующую строку:bind-address = 0.0.0.0
перезапустите mysql.
sudo systemctl restart mysql.service
Данный пункт нужно выполнить на обоих хостах.
На ecss1 выполняем команды:
Генерируем ключ для авторизации на ecss1 с ecss2:
ssh-keygen
Передаем ключ на ecss2:
ssh-copy-id ssw@ecss2
На ecss2 выполняем команды:
Генерируем ключ для авторизации на ecss2 с ecss1:
ssh-keygen
Передаем ключ на ecss1:
ssh-copy-id ssw@ecss1
На ecss1 переходим в директорию /usr/lib/ecss/ecss-scripts/mysql-replication/
cd /usr/lib/ecss/ecss-scripts/mysql-replication
Запускаем скрипт настройки репликации данных ./install_replication.sh. Во время работы скрипт попросит указать необходимые параметры для настройки репликации, а также несколько раз попросит ввести пароль от bash пользователя. Это необходимо для перезапуска mysql сервиса и копирования его конфигурационных файлов. Пример исполнения скрипта:
[sudo] пароль для ssw: ENTER DB_ROOT_LOGIN (default: root): ENTER DB_ROOT_PASSWORD: ENTER REPLICA_USER (default: replica): ENTER REPLICA_USER_PASSWORD: ENTER HOST_1 IP address:192.168.56.101 ENTER HOST_2 IP address:192.168.56.102 ENTER HOST_1 (default: ecss1): ENTER HOST_2 (default: ecss2): ENTER HOST_2_USER (default: ssw): ENTER MEDIATOR_HOST IP address (default: 127.0.0.1): ENTER SNMP_PORT (default: 162): Проверьте введённые значения: DB_ROOT_LOGIN: root REPLICA_USER: replica HOST_1_IP: 192.168.56.101 HOST_2_IP: 192.168.56.102 HOST_1_NAME: ecss1 HOST_2_NAME: ecss2 HOST_2_USER: ssw MEDIATOR_IP: 127.0.0.1 SNMP_PORT: 162 Выберите действиe [c/r/a]: c-продолжить r-перенастроить параметры a-выход из скрипта конфигурации c Enter password: The authenticity of host 'ecss2 (192.168.56.102)' can't be established. ECDSA key fingerprint is SHA256:a9K7bSxTQiKVpRFBDzil9hgMSwlS7A4UWP8+fLkkT5g. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'ecss2,192.168.56.102' (ECDSA) to the list of known hosts. ssw@ecss2's password: mysql: [Warning] Using a password on the command line interface can be insecure. make replica user at ecss1 mysql: [Warning] Using a password on the command line interface can be insecure. grant replica user at ecss1 mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. make replica user at ecss2 mysql: [Warning] Using a password on the command line interface can be insecure. grant replica user at ecss2 mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. ssw@ecss2's password: ecss2_replica.cnf 100% 1553 1.5KB/s 00:00 ssw@ecss2's password: [sudo] пароль для ssw: Connection to ecss2 closed. Restarting MySQL at ecss1 Restarting MySQL at ecss2 ssw@ecss2's password: [sudo] пароль для ssw: Connection to ecss2 closed. ------------------------------------------------------ mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. MASTER_LOG_FILE on ecss2: server-mysql-bin.000001 MASTER_LOG_POS on ecss2: 154 mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. SLAVE_IO_RUNNING on ecss1: Yes SLAVE_SQL_RUNNING on ecss1: Yes mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. MASTER_LOG_FILE on ecss1: server-mysql-bin.000001 MASTER_LOG_POS on ecss1: 154 mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. SLAVE_IO_RUNNING on ecss2: Yes SLAVE_SQL_RUNNING on ecss2: Yes ssw@ecss2's password: mysql: [Warning] Using a password on the command line interface can be insecure. Enter password: Replacing MySQL login and password in keepalive's scripts at ecss1 Replacing MySQL login and password in keepalive's scripts at ecss2 ssw@ecss2's password: [sudo] пароль для ssw: Connection to ecss2 closed. Setting Replication violation notifications... * Reloading configuration files for periodic command scheduler cron [ OK ] ssw@ecss2's password: [sudo] пароль для ssw: * Reloading configuration files for periodic command scheduler cron [ OK ] Connection to ecss2 closed
По завершению установки скрипт выводит значения переменных Slave_IO_Running, Slave_SQL_Running на ecss1, ecss2. Если переменные равны Yes - значит репликация запустилась.
- Опциональный пункт: если необходимо реплицировать базу данных для web_conf, то на данном этапе нужно установить пакет web_conf на одном их хостов. В этом случае база данных будет прореплицирована на второй хост.
Для того, чтобы доступ до реплицированного MySQL был прозрачен для клиентов, создаем виртуальный IP. Он будет переезжать между хостами ecss1, ecss2 средствами VRRP+keepalive, если на одном из них mysqld остановился. Для этого в конфигурационный файл keepalived.conf на каждой ноде добавить следующую секцию:
В секции vrrp_instance MySQL необходимо скорректировать свойства virtual_router_id, virtual_ipaddress под конкретную локациюvrrp_script check_mysqld { script "killall -0 mysqld" # cheaper than pidof interval 1 # check every 1 seconds } !For MySQL vrrp_instance MySQL { state BACKUP interface eth0 virtual_router_id 226 priority 100 advert_int 1 smtp_alert nopreempt authentication { auth_type PASS auth_pass keepmysql } virtual_ipaddress { 192.168.23.181/24 dev eth0 label eth0:11 } track_script { check_mysqld } notify_master /usr/lib/ecss/ecss-scripts/mysql-replication/ecss_reset_mysql_events_to_master.sh notify_backup /usr/lib/ecss/ecss-scripts/mysql-replication/ecss_reset_mysql_events_to_backup.sh }
Перезапускаем keepalived на каждой из хостов ecss1, ecss2:
sudo systemctl restart keepalived.service
После этого на одном из хостов должен подняться интерфейс, по которому будет доступен MySQL. В случае, если на данном хосте остановить MySQL, то сетевой интерфейс переместится на соседний хост.
Настраиваем dnsmasq:
Для того, чтобы подключить систему ECSS-10 к реплицированному MySQL необходимо настроить dnsmasq. Для этого нужно прописать keepalive адрес, настроенный в пункте 8, в следующие конфигурационные файлы:
/etc/dnsmasq.d/ecss-cocon-mysql /etc/dnsmasq.d/ecss-statistic /etc/dnsmasq.d/ecss-tts
После внесения изменений сохраните конфигурационные файлы и перезапустите dnsmasq командой:
sudo systemctl restart dnsmasq.service
Пример конфигурационного файла /etc/dnsmasq.d/ecss-cocon-mysql:
address=/cocon.mysql.ecss/192.168.23.181
Проверка корректности настройки репликации
Для проверки того, что репликация данных работает корректно необходимо выполнить следующие действия.
Проверить состояние реплики. Для этого выполните команду:
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
тогда статус соседнего хоста должен быть:
Status: SLAVESIDE_DISABLED
Восстановление реплики через 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-3.8.0.
% ,{manager, [ % {config, [ % {dir, "/etc/ecss/snmp/manager/"}, % {verbosity, silence}, % {db_dir, "/var/lib/ecss/snmp/"} % ]}, % {def_user_mod, snmp_alarm_user} % ]}