Установка ECSS-10 в кластере

При установке системы ECSS-10 в кластере необходимо выполнить следующие действия.

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

    3.14.4 Установка пакетов ECSS сначала выполняется полностью на одном из серверов кластера.
  2. Выполнить установку необходимых пакетов для всех серверов в кластере.

    Пакет ecss-web-conf достаточно установить на один из серверов.
  3. Установить имя кластера. Для этого откройте файл mycelium1.config текстовым редактором:

    sudo nano /etc/ecss/ecss-mycelium/mycelium1.config

    Если у вас в поле "cluster_name" указано "undefined", то необходимо задать произвольное имя для данного параметра, например:

    {cluster_name, my_cluster}
    Данная операция производится на обоих хостах при установке ECSS-10 с резервированием. Если установка производится без резерва, то данную операцию выполнять не обязательно.
  4. Настроить доступ к серверам системы. Для этого необходимо отредактировать файл /etc/dnsmasq.d/ecss-broker.

    Пример настройки доступа в соответствии с конфигурацией сети, приведён в разделе 3.14.4 Руководство по настройке.
    Файл /etc/dnsmasq.d/ecss-broker на ecss1:

    address=/primary.broker.ecss/192.168.1.1
    address=/secondary.broker.ecss/192.168.1.2

    Файл /etc/dnsmasq.d/ecss-broker на ecss2:

    address=/primary.broker.ecss/192.168.1.1
    address=/secondary.broker.ecss/192.168.1.2
    В качестве primary.broker.ecss и secondary.broker.ecss нельзя использовать адреса, которые были сконфигурированы в keepalived.conf.
  5. Настроить RestFS (подробнее см. раздел 3.14.4 Настройка RestFS).

Для проверки полноты установки и настройки можно использовать Чек-лист по установке ECSS-10.

Настройка VRRP

Для настройки механизма резервирования сервера посредством протокола VRRP используется функционал, который предоставляет приложение keepalived.

  1. На первом сервере нужно создать файл конфигурации /etc/keepalived/keepalived.conf со следующим содержимым (адреса и имена интерфейсов прописать свои):

    Пример:

    vrrp_script chk_sip {
        script "/usr/bin/ecss_pa_sip_port 65535"
        interval 2
        timeout 2
    }
    
    vrrp_script check_core {
           script "nc -z localhost 8085"
           interval 2                      # check every 2 seconds
    }
    
    #For domain_bsk_ecss1 SIP
    vrrp_instance VI_SIP_61 {
        state MASTER
        interface bond1.2
        virtual_router_id 61
        priority 100
        advert_int 1
        preempt_delay 60
        unicast_src_ip 192.168.2.21
        unicast_peer {
            192.168.2.22
        }
    
        authentication {
            auth_type PASS
            auth_pass kassw2
            }
        virtual_ipaddress {
            192.168.2.61/24 dev bond1.2 label bond1.2:SIP61
            }
        track_script {
            chk_sip
            }
        }
    
    #For domain_bsk_ecss2 SIP
    vrrp_instance VI_SIP_62 {
        state BACKUP
        interface bond1.2
        virtual_router_id 62
        priority 50
        advert_int 1
        smtp_alert
        preempt_delay 60
        unicast_src_ip 192.168.2.21
        unicast_peer {
            192.168.2.22
        }
        authentication {
            auth_type PASS
            auth_pass kassw2
            }
        virtual_ipaddress {
            192.168.2.62/24 dev bond1.2 label bond1.2:SIP62
            }
        }
    
    
    #For TC ecss1
    vrrp_instance VI_TC63 {
        state BACKUP
        interface bond1.2
        virtual_router_id 63
        priority 100
        advert_int 1
        preempt_delay 20
        unicast_src_ip 192.168.2.21
        unicast_peer {
             192.168.2.22
        }
         authentication {
             auth_type PASS
             auth_pass kassw2
             }
    
         virtual_ipaddress {
         192.168.2.63/24 dev bond1.2 label bond1.2:TC
         }
         track_script {
         check_core
         }
    }
    include ecss-mysql-replication.conf
    
    CODE
  2. На первом сервере создается файл с конфигурацией MySQL /etc/keepalived/ecss-mysql-replication.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 MySQL71 {
        state BACKUP
        interface bond1.3
        virtual_router_id 71
        priority 100
        advert_int 1
         preempt_delay 10
         unicast_src_ip 192.168.1.21
         unicast_peer {
             192.168.1.21
        }
        authentication {
            auth_type PASS
            auth_pass pmysql
            }
        virtual_ipaddress {
            192.168.1.71/24 dev bond1.3 label bond1.3:MYSQL
            }
        track_script {
            check_mysqld
            }
    }
    CODE
  3. На втором сервере нужно создать аналогичный файл /etc/keepalived/keepalived.conf со следующим содержимым:

    vrrp_script chk_sip {
        script "/usr/bin/ecss_pa_sip_port 65535"
        interval 2
        timeout 2
    }
    
    vrrp_script check_core {
           script "nc -z localhost 8085" 
           interval 2                      # check every 2 seconds
    }
    
    #For domain_bsk_ecss1 SIP
    vrrp_instance VI_SIP_62 {
        state MASTER
        interface bond1.2
        virtual_router_id 62
        priority 100
        advert_int 1
        preempt_delay 60
        unicast_src_ip 192.168.2.22
        unicast_peer {
            192.168.2.21
        }
        authentication {
            auth_type PASS
            auth_pass kassw2
            }
        virtual_ipaddress {
            192.168.2.62/24 dev bond1.2 label bond1.2:SIP62
            }
        track_script {
            chk_sip
            }
        }
    
    #For domain_bsk_ecss2 SIP
    vrrp_instance VI_SIP_61 {
        state BACKUP
        interface bond1.2
        virtual_router_id 61
        priority 50
        advert_int 1
        smtp_alert
        preempt_delay 60
        unicast_src_ip 192.168.2.22
        unicast_peer {
            192.168.2.21
        }
        authentication {
            auth_type PASS
            auth_pass kassw2
            }
        virtual_ipaddress {
            192.168.2.61/24 dev bond1.2 label bond1.2:SIP61
            }
        }
    
    #For TC ecss1
    vrrp_instance VI_TC63 {
        state BACKUP
        interface bond1.2
        virtual_router_id 63
        priority 80
        advert_int 1
        preempt_delay 20
        unicast_src_ip 192.168.2.22
        unicast_peer {
             192.168.2.21
        }
         authentication {
             auth_type PASS
             auth_pass kassw2
             }
         virtual_ipaddress {
         192.168.2.63/24 dev bond1.2 label bond1.2:TC
         }
         track_script {
         check_core
         }
    }
    include ecss-mysql-replication.conf
    CODE
  4. На втором сервере создается файл с конфигурацией MySQL /etc/keepalived/ecss-mysql-replication.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 MySQL71 {
        state BACKUP
        interface bond1.3
        virtual_router_id 71
        priority 80
        advert_int 1
         preempt_delay 20
         unicast_src_ip 192.168.1.22
         unicast_peer {
             192.168.1.21
        }
        authentication {
            auth_type PASS
            auth_pass pmysql
            }
        virtual_ipaddress {
            192.168.1.71/24 dev bond1.3 label bond1.3:MYSQL
            }
        track_script {
            check_mysqld
            }
    }
    CODE

Далее нужно произвести корректировку IP-адресов и имен интерфейсов, согласно конфигурации системы.

Более подробная информация о приложении keepalived и его настройке приведена в документации по адресу: http://www.keepalived.org/pdf/UserGuide.pdf.

Изменён скрипт проверки доступности контрольного сип порта. Теперь скрипт из keepalive нужно вызывать следующим образом:
/usr/bin/ecss_pa_sip_port 65535, где 65535 дефолтное значение порта, который адаптер открывает в случае, когда он готов принимать нагрузку. Для того, чтобы изменить
порт необходимо в конфиге sip адаптера (/etc/ecss/ecss_pa_sip/sip1.config) в секции ip_ssw_intercom изменить в параметрe keepalive значение порта, после чего перезапустить адаптер.

Настройка RestFS для кластера

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

В качестве примера приведена система ECSS-10, работающая в кластере, со следующими настройками:

  • IP-адрес ecss1 - 192.168.118.222;
  • IP-адрес ecss2 - 192.168.118.224.
  1. Установите gluster-сервер и пакет attr на оба хоста:

    sudo aptitude install glusterfs-server attr
  2. Для добавления сервера в пул файловых хранилищ выполните команду на ecss1:

    sudo gluster peer probe 192.168.118.224

    После этого на ecss2 при выполнении команды sudo gluster peer status должна появиться информация о ecss1:

    Number of Peers: 1
    
    Hostname: 192.168.118.222
    Uuid: 569c4730-a3a7-4d29-a132-b1bcdad792d8
    State: Peer in Cluster (Connected)
  3. Для создания кластера на ecss1 выполните команду:

    sudo gluster volume create ecss_volume replica 2 transport tcp 192.168.118.222:/var/lib/ecss/glusterfs 192.168.118.224:/var/lib/ecss/glusterfs force
  4. Запустите созданный кластер, для этого на ecss1 выполните команду:

    sudo gluster volume start ecss_volume
  5. Для проверки статуса кластера на ecss1 выполните команду:

    sudo gluster volume info

    Необходимо обратить внимание на поля "Status" и "Bricks" - они должны иметь следующий вид:

    Volume Name: ecss_volume
    Type: Replicate
    Volume ID: 60774e49-d2f1-4b06-bb4a-3f39ccf1ea73
    Status: Started
    Number of Bricks: 1 x 2 = 2
    Transport-type: tcp
    Bricks:
    Brick1: 192.168.118.222:/restfs
    Brick2: 192.168.118.224:/restfs
  6. Чтобы смонтировать glusterfs раздел, выполните на обоих хостах ecss1 и ecss2 следующие действия:
    • Создайте новый systemd unit.

      /etc/systemd/system/ecss-glusterfs-mount.service

      и добавьте туда следующие параметры:

      [Unit]
      Description=mount glusterfs
      After=network.target
      Requires=network.target
      
      [Service]
      RemainAfterExit=no
      Type=forking
      RestartSec=10s
      Restart=always
      ExecStart=/sbin/mount.glusterfs localhost:/ecss_volume /var/lib/ecss/restfs -o fetch-attempts=10
      ExecStop=/bin/umount /var/lib/ecss/restfs
      
      [Install]
      WantedBy=multi-user.target
    • Добавить unit в автозагрузку.

      Unit можно добавить в автозагрузку следующей командой:

      sudo systemctl enable ecss-glusterfs-mount.service
    • Перезагрузить хост:

      sudo reboot

      Если хост не может быть перезагружен, то можно выполнить следующие команды:

      sudo systemctl daemon-reload sudo systemctl restart ecss-glusterfs-mount.service

      После монтирования на обоих хостах выполните команду:

      df -h

      При просмотре информации должен появиться подмонтированный раздел:

      /dev/sda10                     19G  6,5G   11G  38% /var/lib/mysql
      /dev/sda8                     4,5G  213M  4,1G   5% /var/log
      /dev/sda5                      37G   48M   35G   1% /var/lib/ecss/ecss-media-server/records
      /dev/sda6                      19G   44M   18G   1% /var/lib/ecss/cdr
      /dev/sda7                      19G   44M   18G   1% /var/lib/ecss/statistics
      /dev/sda9                      19G  7,6G  9,7G  44% /var/log/ecss
      localhost:/ecss_volume   46G   59M   44G   1% /var/lib/ecss/restfs*

Запуск RestFS в режиме кластера

Для запуска RestFS в режиме кластера достаточно, чтобы пакет ecss-restfs был установлен и запущен на обеих нодах. Команда для запуска сервиса ecss-restfs. 

sudo systemctl start ecss-restfs.service

Запуск RestFS в случае недоступности других участников кластера

В применяемой концепции glusterfs все сервера равнозначны. Однако раздел volume не активируется при отсутствии кворума. Это защитный механизм, который характерен для всех распределенных fault-tollerant систем и призван защитить систему от split-brain.
Такая ситуация может возникнуть когда загружается только один из серверов, а второй при этом выключен или недоступен. На первом сервере volume не будет автоматически активирован до появления второго сервера для исключения расхождения данных.

Если включение второго сервера невозможно, либо затягивается на длительное время, то можно вручную перевести volume в рабочий режим, выполнив команду:

sudo gluster volume ecss_volume start force

Правка настроек glusterfs-server.service unit

Для настройки управления glusterfs service через systemctl выполните команду:

sudo systemctl edit glusterfs-server.service

Должно открыться окно текстового редактора. Внесите туда следующие параметры:

[Service]
KillMode=control-group
RemainAfterExit=no

Сохраните изменения и выполните команду:

sudo systemctl daemon-reload