Для корректной отработки скрипта настройки репликации MySQL необходимо удовлетворять следующим требованиям:
Используемые переменные:
Устанавливаем пакеты с MySQL, конфигурацией баз данных, а также keepalive на обоих хостах:
sudo aptitude install ecss-mysql keepalived |
При инсталляцииe 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 ("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 |
Продублируйте ответы из пункта с установкой пакета до вопроса о настройке репликации:
Следующая секция предлагает автоматическую настройку виртуального IP адреса в keepalive для доступа к базе данных. В случаи отработки резерва, виртуальный адрес будет автоматически переезжать на другой хост.
Ручное конфигурирование 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
}
!For MySQL
vrrp_instance MySQL {
state BACKUP
interface <INTERFACE>
virtual_router_id 226
priority 100
advert_int 1
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
}
} |
Где требуется подставить свои значения:
Перезапускаем keepalived на каждой из хостов ecss1, ecss2:
sudo systemctl restart keepalived.service |
После этого на одном из хостов должен подняться интерфейс, по которому будет доступен MySQL. В случае, если на данном хосте остановить MySQL, то сетевой интерфейс переместится на соседний хост.
Настраиваем dnsmasq:
| Данный пункт выполняется на хосте с установленным пакетом ecss-node |
Для того, чтобы подключить систему ECSS-10 к реплицированному MySQL необходимо настроить dnsmasq. Для этого нужно прописать keepalive адрес (<VIRTUAL_IP>), в следующие конфигурационные файлы:
/etc/dnsmasq.d/ecss-cocon-mysql /etc/dnsmasq.d/ecss-dialer /etc/dnsmasq.d/ecss-statistic /etc/dnsmasq.d/ecss-tts /etc/dnsmasq.d/ecss-statistic /etc/dnsmasq.d/ecss-address-book-mysql /etc/dnsmasq.d/ecss-sp-mysql /etc/dnsmasq.d/ecss-tc |
После внесения изменений сохраните конфигурационные файлы и перезапустите dnsmasq командой:
sudo systemctl restart dnsmasq.service |
Пример конфигурационного файла /etc/dnsmasq.d/ecss-cocon-mysql:
address=/cocon.mysql.ecss/<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 |
тогда статус соседнего хоста должен быть:
Status: SLAVESIDE_DISABLED |
Данный пункт необходимо выполнять в случае возникновения ошибок репликации. Рассмотрим пример восстановления данных на 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 выполняем:
| Если после RESET SLAVE выдается ошибка, что relay-файл не найден, необходимо удалить все relay-файлы на этом хосте. Затем повторить RESET SLAVE. |
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 |