Установка 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.

    Редактирование keepalived.conf

    Следующий шаг — редактирование глобального конфигурационного файла keepalived.conf. На обоих хостах содержимое файла одинаковое:

    sudo nano /etc/keepalived/keepalived.conf 
    BASH

    скопируйте и вставьте следующий текст в файл /etc/keepalived/keepalived.conf 

    global_defs {
        vrrp_version 3          # версия протокола VRRP (2 или 3)
        script_user nobody      # ограниченный в правах системный пользователь, от которого будут запускаться скрипты проверки доступности
        enable_script_security  # не запускать скрипты от root, если часть пути к ним доступна на запись для обычных пользователей
    }
    
    include /etc/keepalived/sip.conf
    include /etc/keepalived/mysql.conf
    
    YML

    Поскольку при создании репликации не была задействована автоматическая генерация конфигурации для mysql, то в конфигурационном файле необходимо сделать ссылку на mysql.conf:  include /etc/keepalived/mysql.conf

    Далее на обоих хостах создаются файлы /etc/keepalived/mysql.conf

    sudo nano /etc/keepalived/mysql.conf 
    BASH

    со следующим содержимым (каждый хост имеет индивидуальную информацию в этом файле)
    скопируйте и вставьте следующий текст в файл /etc/keepalived/mysql.conf

    Создание VRRP для MySQL

    /etc/keepalived/mysql.conf для ecss1/etc/keepalived/mysql.conf для ecss2
    # Конфигурация mysql первой ноды:
    
    vrrp_script check_mysql {
        script "/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e 'SELECT 1;'"  # Для Ubuntu-18.04
    #   script "/usr/bin/mysql --defaults-file=/etc/mysql/mariadb.cnf -e 'SELECT 1;'" # Для Astra Linux Smolensk
        user root
        interval 2
        fall 1
        timeout 2
    }
    
    vrrp_instance MySQL {
        state MASTER                     # Исходное состояние при старте
        interface net.10                 # Имя сетевого интерфейса, на котором будет работать протокол VRRP
        virtual_router_id 10             # Уникальный идентификатор роутера (0..255)
        priority 100                     # Приоритет (0..255) чем выше - тем больше
        advert_int 1                     # Интервал рассылки уведомлений (с)
        preempt_delay 60                 # Интервал ожидания мастера при старте демона (с) при исходном состоянии BACKUP
    
        unicast_src_ip  10.0.10.11       # Собственный реальный IP-адрес
        unicast_peer {
             10.0.10.12                  # Реальный IP-адрес соседа
        }
    
        virtual_ipaddress {
            # Виртуальный IP-адрес и маска
            # dev - сетевой интерфейс, на котором будет поднят виртуальный адрес
            # label - метка виртуального интерфейса (для удобства идентификации)
            10.0.10.10/24 dev net.10 label net.10:mysql
       }
    
        track_script {
            check_mysql
        }
    }
    YML


    # Конфигурация mysql второй ноды:
    
    vrrp_script check_mysql {
        script "/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e 'SELECT 1;'"  # Для Ubuntu-18.04
    #   script "/usr/bin/mysql --defaults-file=/etc/mysql/mariadb.cnf -e 'SELECT 1;'" # Для Astra Linux Smolensk
        user root
        interval 2
        fall 1
        timeout 2
    }
    
    vrrp_instance MySQL {
        state BACKUP                     # Исходное состояние при старте
        interface net.10                 # Имя сетевого интерфейса, на котором будет работать протокол VRRP
        virtual_router_id 10             # Уникальный идентификатор роутера (0..255)
        priority 50                      # Приоритет (0..255) чем выше - тем больше
        advert_int 1                     # Интервал рассылки уведомлений (с)
        preempt_delay 60                 # Интервал ожидания мастера при старте демона (с) при исходном состоянии BACKUP
    
        unicast_src_ip  10.0.10.12      # Собственный реальный IP-адрес
        unicast_peer {
             10.0.10.11                 # Реальный IP-адрес соседа
        }
    
        virtual_ipaddress {
            # Виртуальный IP-адрес и маска
            # dev - сетевой интерфейс, на котором будет поднят виртуальный адрес
            # label - метка виртуального интерфейса (для удобства идентификации)
            10.0.10.10/24 dev net.10 label net.10:mysql
       }
    
        track_script {
            check_mysql
        }
    }
    YML

    В данной конфигурации мы задаем ID для виртуального маршрутизатора, который будет являться балансером для своего хоста. Важно, чтобы virtual_router_id  совпадали у обоих хостов.

    После конфигурации необходимо перезапустить сервис keepalived на обоих хостах:

    sudo systemctl restart keepalived.service
    BASH

    проверьте наличие интерфейса и ip-адреса после рестарта сервиса командой ifconfig, на хосте ecss1 вы должны увидеть :

    abf@ecss1:~$ ifconfig
    
    . . . 
    net.10:mysql: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
    inet 10.0.10.10 netmask 255.255.255.0 broadcast 0.0.0.0
    ether 08:00:27:6d:4f:02 txqueuelen 1000 (Ethernet)
    
    BASH

  7. Проверяем статус сервиса ecss-mysql-checker.timer на обоих хостах, должен быть active:

    sudo systemctl status ecss-mysql-checker.timer

    Пример:

    sudo systemctl status ecss-mysql-checker.timer 
    ● ecss-mysql-checker.timer - Check replication status every minute
       Loaded: loaded (/lib/systemd/system/ecss-mysql-checker.timer; disabled; vendor preset: enabled)
       Active: active (waiting) since Fri 2023-11-03 15:17:20 +07; 1s ago
      Trigger: Fri 2023-11-03 15:18:00 +07; 37s left
  8. Для того чтобы доступ до реплицированного MySQL был прозрачен для клиентов, создайте виртуальный IP. Он будет переезжать между хостами ecss1, ecss2 средствами VRRP+keepalive, если на одном из них MySQL остановился. Для этого в конфигурационный файл keepalived.conf на каждой ноде добавить в конце следующую строку (см. раздел "Общая настройка keepalived"):

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

    sudo systemctl restart keepalived.service

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

  10. Настраиваем 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 'SELECT EVENT_SCHEMA, EVENT_NAME, STATUS FROM INFORMATION_SCHEMA.EVENTS;'

    На обоих хостах статус всех ивентов должен быть ENABLED. Пример:

    mysql> SELECT EVENT_SCHEMA, EVENT_NAME, STATUS FROM INFORMATION_SCHEMA.EVENTS;
    +-----------------+------------------------------+---------+
    | EVENT_SCHEMA    | EVENT_NAME                   | STATUS  |
    +-----------------+------------------------------+---------+
    | ecss_calls_db   | try_generate_count_cdr_event | ENABLED |
    | ecss_statistics | generate_aggregation_event   | ENABLED |
    | ecss_meeting_db | cleanup_event                | ENABLED |
    +-----------------+------------------------------+---------+
    11 rows in set (0.00 sec)
  3. Проверить таблицы состояний:

    Для мастера данное число будет равно 1, для slave 0.

    mysql> select * from ecss_system.events_status;
    +--------+---------+
    | lock   | enabled |
    +--------+---------+
    | events |       0 |
    +--------+---------+
    1 row in set (0.00 sec)

В случае возникновения ошибок репликации необходимо выполнить действия, описанные в разделе Восстановление репликации БД MySQL.

Для получения предупреждений при нарушении репликации необходимо раскомментировать следующие строки в конфигурационном файле медиатора /etc/ecss/ecss-mediator/ и перезапустить 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