Установка 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)
  1. Установка пакетов с 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: 


      ecss1ecss2
      ecss-mysql192.168.1.1192.168.1.2
      ecss-node192.168.1.1192.168.1.2

      Для этого примера в качестве маски для прав MySQL нужно указать 192.168.1.%.

      Однако MySQL может быть вынесен на отдельные сервера, тогда маска сети должна быть сконфигурирована таким образом, чтобы хосты имели доступ друг к другу:


      ecss1ecss2mysql-server-1mysql-server-2
      ecss-mysql

      192.168.2.1192.168.2.2
      ecss-node192.168.1.1192.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 
  2. Конфигурация bind-address для mysql. 
    Откройте конфигурационный файл mysql: /etc/mysql/mysql.conf.d/mysqld.cnf и добавьте туда следующую строку:

    bind-address            = 0.0.0.0

    Перезапустите сервис mysql:

    sudo systemctl restart mysql.service

    Данный пункт нужно выполнить на обоих хостах.

  3. Установка имен хостов.
    1. Проверьте текущие имена хостов, где будет установлена ecss-mysql. Если сервера будут установлены на одном хосте с основной системой (ecss-node), то имя должно соответствовать ecss1/ecss2 соответственно. Если MySQL будут установлены на отдельные сервера, то имя хоста может быть любым. Воспользуйтесь следующей командой на обоих серверах, чтобы изменить имя хостов:

      hostnamectl set-hostname <HOST_NAME>
    2. После установки имен на каждом сервере в конец файла /etc/hosts нужно добавить IP-адрес и имя соседнего сервера, например на ecss1 выполнить:

      sudo sh -c 'echo "192.168.1.2 ecss2" >> /etc/hosts'
      

      Если MySQL установлены на отдельных серверах, то добавьте в файл /etc/hosts имена и IP-адреса серверов с ecss-node, а также серверов с ecss-mysql.

  4. Поддержка доступа между серверами с ecss-mysql через ssh по rsa-ключам без использования пароля.

    1. На хосте ecss1 сгенерируйте rsa-ключ следующей командой (выполняйте команду без sudo, чтобы ключ сгенерировался для текущего пользователя):

      ssh-keygen
    2. Передайте ключ на ecss2:

      ssh-copy-id support@ecss2
    3. Аналогичным образом сгенерируйте ключ на хосте ecss2 и скопируйте его на первый хост:

      ssh-keygen
      ssh-copy-id support@ecss1
  5. После успешной установки пакета 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
        }
    }

    Где автоматически подставятся введенные значения:

    1.  <INTERFACE> — физический или виртуальный интерфейс сервера, где установлен пакет ecss-mysql. С этого интерфейса будет осуществляться обмен трафиком и мониторинг доступности второго сервера с MySQL. Соответственно через интерфейсы, указанные в конфигурациях на обоих хостах, должен быть доступ до хостов с ecss-mysql, а также до ecss-node, если сервер с MySQL вынесен от основной системы.
    2. <VIRTUAL_IP>/<VIRTUAL_MASK> — IP-адрес и маска виртуального адреса, через который будет осуществляться доступ к базе данных MySQL. После завершения конфигурации keepalived данный IP-адрес должен подняться на одном из хостов. В случае аварии на данном хосте IP-адрес должен динамически подняться на втором хосте. Таким образом, MySQL будет всегда доступен.
    3. <INTERFACE_DESCRIPTION> — описание интерфейса. Укажите корректное и явное название, например: "<INTERFACE>:mysql".
  6. Ручное конфигурирование 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;'"
        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;'"
        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
        }
    }
    

  7. Для того чтобы доступ до реплицированного MySQL был прозрачен для клиентов, создайте виртуальный IP. Он будет переезжать между хостами ecss1, ecss2 средствами VRRP+keepalive, если на одном из них MySQL остановился. Для этого в конфигурационный файл keepalived.conf на каждой ноде добавить в конце следующую строку (см. раздел "Общая настройка keepalived"):

    include /etc/keepalived/mysql.conf
  8. Перезапустите keepalived на каждом из хостов ecss1, ecss2:

    sudo systemctl restart keepalived.service

    После этого на одном из хостов должен подняться интерфейс, по которому будет доступен MySQL. В случае, если на данном хосте остановить MySQL, то сетевой интерфейс переместится на соседний хост.

  9. Настраиваем dnsmasq:

    Данный пункт выполняется на хосте с установленным пакетом ecss-node .

    Для того чтобы подключить систему ECSS-10 к реплицированному MySQL, необходимо настроить dnsmasq. Для этого нужно переконфигурировать пакет ecss-dns-env:

    sudo dpkg-reconfigure ecss-dns-env
    

    В открывшимся окне конфигурации выбрать mysql, а затем ввести адрес <VIRTUAL_IP>.

Проверка корректности настройки репликации

Для проверки того, что репликация данных работает корректно необходимо выполнить следующие действия:

  1. Проверить состояние реплики. Для этого выполните команду:

    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
  2. Проверить состояние событий. Для этого выполните команду:

    sudo mysql -uroot -p -e 'use ecss_statistics; show events\G;' | grep Status

    Оба из хостов (на котором присутствует виртуальный адрес keepalive) должен показать следующий статус:

    Status: ENABLED
  3. Проверить таблицы состояний:

    Для мастера данное число будет равно 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 и выполнить команду:

sudo mysql-ecss2> STOP SLAVE;

Далее в shell ecss2 выполнить команду (может выполняться длительное время):

sudo mysql -uroot -p < ecss1.mysql.dump

Далее на slave удалить все журналы от мастера и начать репликацию с момента, когда на мастере был сделан дамп:

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-файлы на этом хосте (sudo rm /var/lib/mysql/slave-mysql-relay-bin.*). Затем повторить RESET SLAVE.

Продолжаем на 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.config и перезапустить ecss-mediator:

%   ,{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