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

    При инсталляцииe 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 системы. 

      На обоих сервера, где устанавливаются пакеты 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. После установки имен хостов, нужно добавить в файл 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.

  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 запустим  скрипт создания репликации:

    sudo /usr/lib/ecss/ecss-scripts/mysql-replication/install_replication.sh

    Продублируйте ответы из пункта с установкой пакета до вопроса о настройке репликации:

    • Настроить репликацию? ("Configure replication?") — репликация резервирует сервер ecss-mysql. Укажите в качестве ответа "Да" ("Yes").
    • Логин для пользователя replica ("Login for replica user") — с этим логином в MySQL будет создан пользователь. Данный пользователь используется для входа в MySQL при репликации системы. Пароль нужно запомнить он используется в процессе восстановления репликации. 
    • Пароль для пользователя replica ("Password for replica user") — этот пароль будет установлен для пользователя, указанного в ответе на предыдущий вопрос. Пароль нужно запомнить, так как он используется в процессе восстановления репликации. 
    • Имя удаленного хоста ("Remote host name") — имя соседнего хоста с установленным пакетом ecss-mysql. В приведенном примере это ecss2.
    • Логин для входа на удаленный хост ("Login for remote host") — имя пользователя, которое будет использоваться для входа по ssh на соседний хост с ecss-mysql. В приведенном примере это  support.
    • IP адрес локального хоста ("Local host IP address") — IP адрес хоста на котором запускается репликация. В приведенном примере это <HOST_1_IP>.
    • IP адрес удаленного хоста ("Remote host IP address") — IP адрес второго хоста на котором развернут MySQL и с которым происходит репликация. В приведенном примере это <HOST_2_IP>.
    • IP  адрес хоста с Mediator ("Mediator host IP address") — IP адрес хоста, на котором будет развернут пакет ecss-node. В приведенном примере это <HOST_2_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 пункту. 
    • Введите виртуальный IP адрес ("ENTER VIRTUAL IP address") — введите виртуальный IP адрес. Этот адрес будет общим для двух баз MySQL и будет располагаться на одном их хостов. После настройки именно этот адрес должен быть указан во всех сервисах ECSS  которым необходим доступ к базе данных. Если один из хостов с mysql станет недоступным, то адрес по средствам 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 — значит репликация запустилась.
  6. Ручное конфигурирование 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
            }
    }

    Где требуется подставить свои значения:

    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".
  7. Перезапускаем keepalived на каждой из хостов ecss1, ecss2:

    sudo systemctl restart keepalived.service

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

  8. Настраиваем 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>

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

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

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

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

    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 выполняем:

Если после 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/ и перезапустить 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