В статье будет рассмотрена настройка резервирования 2 серверов EMS при помощи протокола vrrp и репликации баз данных.
Предварительная подготовка:
Для начала потребуется 2 сервера с Ubuntu 20 или более новой и установленными на них EMS одинаковой версии, в примере будет использоваться версия 3.35.
Шаг 1: Установка и настройка keepalived
Описание пакет
Пакет keepalived - это open source программное обеспечение, предназначенное для обеспечения функций высокой надежности (high availabilitty) и балансировки нагрузки (load-balancing). За первую функцию отвечает реализация протокола VRRP, а вторая основывается на модуле ядра Linux Vitrual Server (IPVS). Keepalived не разрабатывается сотрудниками Eltex и не включает доработок, за исключением конфигурации. Keepalived используется для организации резервирования контроллеров SoftWLC, при этом используется только функционал VRRP.
Установка keepalived
Для установки пакета, необходимо загрузить его на сервер и выполнить следующую команду (установка должна производиться от имени суперпользователя root на обоих серверах):
|
После установки необходимо добавить демона Keepalived в автозагрузку и запустить его:
|
Основной файл конфигурации
На обоих серверах в файле /etc/keepalived/keepalived.conf меняем следующие параметры:
<interface> - наименование сетевого интерфейса (свой для каждого сервера);
<virtual_ip> - виртуальный ip-адрес (с указанием префикса);
<ip_адрес другого сервера> - ip-адрес другого сервера;
Шаг 2: Создание и настройка конфигурационного файла:
Создать файл конфигурации для keepalived в папке /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs { script_user root enable_script_security } vrrp_script check_network { script "/etc/keepalived/check_mysql.sh" interval 5 weight 50 fall 3 rise 3 init_fail user root } vrrp_instance VI_SWLC { # state MASTER interface <interface> virtual_router_id 1 track_script { check_network } track_interface { <interface> weight 50 } priority 150 advert_int 1 nopreempt # Uncomment and comment "nopreempt" if preemption needed #preempt_delay 180 authentication { auth_type PASS auth_pass eltex } virtual_ipaddress { <virtual ip> dev <interface> label <interface>:1 } notify_master "/etc/keepalived/keep_notify.sh master" notify_backup "/etc/keepalived/keep_notify.sh backup" notify_fault "/etc/keepalived/keep_notify.sh fault" unicast_peer { <ip address 2 server> } }
Шаг 3 Настройка скриптов проверки состояния 2 сервера и изменения мастера при помощи скриптов:
Скрипт проверяет активность mysql server соседней машины и возвращает код результата. Таким образом, при успешном выполнении скрипта, гарантируется, что SoftWLC достижим для внешних клиентов.
В текущей реализации на обоих серверах, в качестве тестового скрипта, предлагается использовать следующий:
/etc/keepalived/check_mysql.sh
где <default_ip> - шлюз по умолчанию для этого сервера аналогично записи.
#!/bin/bash # host to ping # there - default gw HOST=<default_ip> # -q quiet # -c nb of pings to perform mysqladmin -ujavauser -pjavapassword ping -h $HOST > /dev/null # $? var keeping result of execution # previous command if [ $? -eq 0 ] then echo `date +"%T %F"` "OK mysql reachable" EXIT_CODE=0 else echo `date +"%T %F"` "ERROR mysql unreacheble!" EXIT_CODE=1 fi exit $EXIT_CODE
Конфигурация смены роли
При смене состояния сервера, выполняется скрипт keep_notify.sh.
/etc/keepalived/keep_notify.sh
#!/bin/bash if ! lockfile-create --use-pid -r 5 /tmp/keep.mode.lock; then echo "Unable to lock" echo "Unable to lock" > /tmp/keep.mode.lock.fail exit 0 fi case "$1" in master) echo "MASTER" > /tmp/keep.mode service eltex-ems restart ;; backup) echo "BACKUP" > /tmp/keep.mode service eltex-ems stop ;; fault) echo "FAULT" > /tmp/keep.mode ;; *) echo "Usage: $0 {master|backup|fault}" exit 1 esac lockfile-remove /tmp/keep.mode.lock; exit 0
Необходимо добавить права
|
Шаг 4:Выделение лога в отдельный файл
По умолчанию keepalived записывает лог в файл /var/log/syslog . Для удобства отладки, мониторинга и контроля работы keepalived, можно настроить ведение собственного, отдельного лог-файла.
Ниже приведен пример настройки rsyslog:
|
Добавьте в файл 10-keepalived.conf следующее:
/etc/rsyslog.d/10-keepalived.conf
|
Затем, нужно перезапустить rsyslog командой:
|
Теперь сообщения от демона keepalived попадут только в лог-файл /var/log/keepalived.log и не попадут в /var/log/syslog .
4.1 Способ запуска/остановки keepalived
Для запуска сервиса воспользуйтесь командой:
|
Остановка сервиса:
|
Проверить состояние сервиса можно командой:
|
Шаг 5: Настройка репликации MariaDB
Резервирование данных, хранящихся СУБД MySQL, осуществляется путём встречной репликации по принципу master-master (ведущий-ведущий). То есть, каждый из серверов одновременно является и master и slave. При такой схеме работы, все изменения в БД на одном сервере записываются в специальный бинарный лог, который в реальном времени вычитывает второй сервер и применяет изменения. Второй сервер реплицирует данные с первого, а первый со второго. Это позволяет получить актуальную копию БД на двух хостах одновременно. При разрыве связи, изменения накапливаются, после восстановления происходит синхронизация.
5.1 Перенос дампа данных и перенос на второй сервер
При настройке резервирования в процессе эксплуатации (то есть если в MySQL на действующем сервере уже имеются данные), необходимо перенести эти данные на второй сервер. Это можно сделать при помощи утилиты mysqldump.
Для этого, необходимо на первом сервере заблокировать таблицы, снять дамп, разблокировать таблицы и скопировать получившийся файл на второй сервер:
|
Затем, развернуть dump на втором сервере:
|
5.2 Настройка конфигурациионного файла MariaDB
Конфигурация самого демона mysqld заключается в настройке параметров ведения бинарных логов. Обозначения первый сервер и второй сервер далее условны, и применяются лишь для обозначения различий в конфигурации серверов.
В секции [mysqld] файла конфигурации /etc/mysql/mariadb.conf.d/50-server.cnf произвести следующие изменения:
Закомментировать либо удалить строку на обоих серверах:
|
Указать server-id. Для серверов необходимо задать уникальные идентификаторы, к примеру, для первого:
|
для второго:
|
Включить бинарные логи на обоих серверах:
|
Включаем GTID и обеспечиваем согласованность на обоих серверах
|
Перезапустить сервис mysql на каждом сервер и создать БД для репликации:
|
5.3 Создание учетных записей
Для работы репликации необходима служебная учетная запись на каждом из серверов. Под этой учетной записью, сервер будет подключаться к master-серверу и получать изменения в данных.
Создать в консоли MySQL учетную запись для репликации на первом сервере:
Выполнять из mysql-client (mysql -uroot -proot)
|
Создать в консоли MySQL учетную запись для репликации на втором сервере:
Выполнять из mysql-client (mysql -uroot -proot)
|
Привилегия SELECT необходима для работы проверки репликации из GUI EMS
5.4 Выдача прав сервисным пользователям
Открыть /usr/lib/eltex-ems/conf/config.txt, посмотреть какие username / password используются (по умолчанию - javauser / javapassword)
Выдаем им права на внешний доступ на обоих серверах:
Выполнять из mysql-client (mysql -uroot -proot)
|
5.5 Включение репликации
Настроить и запустить репликацию второго сервера с первого (выполнить действия на втором сервере):
|
Проверить состояние репликации:
|
Выведем состояние параметров gtid:
|
Структура значения GTID выглядит следующим образом:
X-Y-Z:
X - номер домена кластера;
Y - server_id ноды кластера;
Z - gjpbwbz
На 1-ом сервере
|
Проверить состояние репликации:
|
После сохранения изменений, состояние репликации можно отслеживать в GUI EMS в разделе Информация → Состояние системы резервирования → MySQL.
Шаг 6: Проверка корректной настройки MariaDB
Проверить что реплиакация работает можно как через GUI ems перейдя на вкладку Информация >> состояние системы резервирования >> MySQL.
Еще можно проверить непосредственно перейдя в саму БД. На обоих серверах должен быть статус слейва
Выполнять из mysql-client (mysql -uroot -proot)
|
Slave_IO_Running — состояние работы получения бинарного лога с сервера Master. Если состояние будет NO, то репликация не работает.
Slave_SQL_Running — статус выполнения команд из лога на сервере Slave. Если состояние будет NO, то репликация не работает.