Отказоустойчивость:
Настройка переключения серверов

Данная статья описывает настройку keepalived для определения master-сервера и автоматического переключения трафика между серверами.

Подготовка к настройке

Перед началом настройки отказоустойчивости важно учесть:

  1. Оба сервера находятся в одной сети и им доступно минимум 3 адреса:

    • один IP-адрес для основного сервера;

    • один IP-адрес для резервного сервера;

    • один IP-адрес, используемый как виртуальный IP (VIP).

  2. Домен в процессе настройки Отказоустойчивости будет привязан к IP VIP, который выступает в роли балансировщика — весь трафик идет через данный адрес и автоматически перенаправляется на активный сервер (основной или резервный).

Например:

IP for high availability. IP for high availability.

В этом списке внутренние IP находятся в одной подсети.

VIP может быть:

  • публичным IP-адресом, непосредственно назначенным интерфейсу keepalived на серверах;

  • внутренним IP-адресом (например, 192.168.1.6), проброшенным через DST-NAT с публичного адреса (например, 188.124.51.150).

Предупреждение

Если у вас ранее уже был установлен сервер, подключать домен к внешнему IP VIP на этом шаге не требуется.

Примечание

Если сервер с Compass развернут за NAT, выполните следующие действия:

  • Откройте порты 80 и 443 для IP-адреса VIP, в настройках DNAT настройте проброс портов на порты 80 и 443 во внутренней сети для IP VIP.

  • Убедитесь, что порт 10000 UDP открыт на firewall, через который идет трафик для звонков. Если порт закрыт, откройте его для IP VIP.

  • В настройках DNAT настройте проброс порта 10000 UDP с внешнего IP-адреса на порт 10000 UDP сервера Compass во внутренней сети для IP VIP.

  • В конфигурационном файле global.yaml заполните поле jitsi.service.jvb.media_advertise_ips - укажите публичный IP-адрес, а затем через запятую — IP-адрес VIP.

Уведомления о переключении состояния серверов

Перед настройкой keepalived настоятельно рекомендуем настроить отправку уведомлений ботом Compass при переключении серверов. Например, для таких случаев, когда один из серверов упал и vip переключился на резервный сервер.

Для этого требуется создать конфигурационный файл с данными вашего бота.

На основном и резервном серверах создайте директорию:

sudo mkdir -p /etc/compass_userbot

Далее на обоих серверах создайте конфигурационный файл, заполнив поля данными вашего бота Compass:

sudo cat > /etc/compass_userbot/userbot_config.json << 'EOF'
{
   "userbot_token": "<токен вашего бота>",
   "userbot_version": "v3",
   "notice_chat_id": "<chat-id чата в вашем пространстве, куда добавлен бот>",
   "notice_domain": "<ваш домен без протокола>"
}
EOF

Пример:

{
   "userbot_token": "2ad37b29-412a-328e-84c9-a62fd9b1d523",
   "userbot_version": "v3",
   "notice_chat_id": "MLICIraRfzJ1A...",
   "notice_domain": "getcompass.com"
}

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

sudo python3 script/replication/keepalived_status_changed.py --state TEST --userbot-notice-test

Если всё настроено верно, в указанный в конфигурационном файле чат отправится сообщение от бота о тестовой проверке.

Настройка keepalived

  1. На основном и резервном серверах установите keepalived, который будет отвечать за перенаправление трафика с одного сервера на другой.

    sudo apt-get install keepalived -y
    
  2. Для корректной работы keepalived разрешите VRRP-трафик в фаерволе на обоих серверах:

    sudo ufw allow 112
    sudo ufw allow to 224.0.0.18
    

    Примечание

    vrrp — это протокол для отказоустойчивости сетевых шлюзов. 224.0.0.18 — это официальный адрес VRRP, через который ноды обмениваются сообщениями о состоянии.

  3. На основном сервере настройте keepalived.

    Создайте папку для конфигурационного файла keepalived:

    sudo mkdir -p /etc/keepalived
    

    Проверьте, какой сетевой интерфейс используется на сервере:

    ip route show default
    

    Пример ответа: default via 192.168.0.1 dev eth0. В данном случае сетевым интерфейсом выступает eth0.

    Создайте файл конфигурации для keepalived:

    sudo touch /etc/keepalived/keepalived.conf
    

    Подставьте свои значения в шаблон ниже и вставьте содержимое в файл /etc/keepalived/keepalived.conf с помощью любого удобного текстового редактора:

    Важные моменты:

    • Подставьте полный путь к установщику Compass в файл конфигурации.

    • Внутренним IP VIP выступает IP, созданный ранее на этапе Подготовка к настройке.

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

    • Пароль для поля auth_pass должен быть не длиннее 8 символов.

    • Значение для поля auth_pass должно быть одинаковым на основном и резервном серверах.

    • Для скрипта проверки nginx укажите полный путь к установщику Compass.

    • Для скрипта проверки свободного места укажите в аргументе path путь, где смонтированы файлы приложения.

    global_defs {
       router_id PRIMARY # Установите обозначение сервера
    
       vrrp_garp_master_delay 5
       vrrp_garp_master_repeat 3
       vrrp_garp_master_refresh 30
    }
    
    # В поле script укажите абсолютный путь к установщику Compass
    vrrp_script chk_nginx {
       script "<полный путь к установщику Compass>/script/replication/check_nginx.py"
       interval 10
       fall 3
       rise 1
       timeout 8
    }
    
    # В поле script укажите абсолютный путь к установщику Compass
    # Для аргумента `path` укажите путь, где смонтированы файлы приложения
    # В поле `threshold` указывается порог (в процентном соотношении) для проверки места на диске
    vrrp_script chk_disk {
       script "<полный путь к установщику Compass>/script/replication/check_disk.py --path /home --threshold 5"
       interval 120
       fall 3
       rise 1
       timeout 20
    }
    
    vrrp_script check_master_state_block_file {
       script "test ! -f /etc/keepalived/block_master"
       interval 7
       weight -250
       fall 2
       rise 2
       timeout 5
    }
    
    vrrp_instance VI_1 {
       state BACKUP
       interface eth0        # Замените на имя вашего сетевого интерфейса
       virtual_router_id 50  # virtual_router_id должен совпадать на основном и резервном серверах
       priority 150          # Установите приоритет выше, чем у резервного сервера
       nopreempt
       advert_int 3
    
       authentication {
          auth_type PASS
          auth_pass "<произвольный пароль>"  # Установите надёжный пароль
       }
    
       virtual_ipaddress {
          <VIP IP>  # Укажите ваш VIP IP
       }
    
       # Замените на абсолютный путь к установщику Compass
       notify_master "<полный путь к установщику Compass>/script/replication/keepalived_status_changed.py --state MASTER"
       notify_backup "<полный путь к установщику Compass>/script/replication/keepalived_status_changed.py --state BACKUP"
       notify_fault "<полный путь к установщику Compass>/script/replication/keepalived_status_changed.py --state FAULT"
       track_script {
          chk_nginx weight -30
          chk_disk
          check_master_state_block_file
       }
    }
    
  4. Настройте keepalived на резервном сервере.

    Создайте папку для конфигурационного файла keepalived:

    sudo mkdir -p /etc/keepalived
    

    Проверьте, какой сетевой интерфейс используется на сервере:

    ip route show default
    

    Пример ответа: default via 192.168.0.2 dev eth0. В данном случае сетевым интерфейсом выступает eth0.

    Создайте файл конфигурации для keepalived:

    sudo touch /etc/keepalived/keepalived.conf
    

    Подставьте свои значения в шаблон ниже и вставьте содержимое в файл /etc/keepalived/keepalived.conf с помощью любого удобного текстового редактора:

    Примечание

    Подставьте полный путь к установщику в файл конфигурации.

    global_defs {
       router_id RESERVE # Установите обозначение сервера
    
       vrrp_garp_master_delay 5
       vrrp_garp_master_repeat 3
       vrrp_garp_master_refresh 30
    }
    
    # В поле script укажите абсолютный путь к установщику Compass
    vrrp_script chk_nginx {
       script "<полный путь к установщику Compass>/script/replication/check_nginx.py"
       interval 10
       fall 3
       rise 1
       timeout 8
    }
    
    # В поле script укажите абсолютный путь к установщику Compass
    # Для аргумента `path` укажите путь, где смонтированы файлы приложения
    # В поле `threshold` указывается порог (в процентном соотношении) для проверки места на диске
    vrrp_script chk_disk {
       script "<полный путь к установщику Compass>/script/replication/check_disk.py --path /home --threshold 5"
       interval 120
       fall 3
       rise 1
       timeout 20
    }
    
    vrrp_instance VI_1 {
       state BACKUP
       interface eth0        # Замените на имя вашего сетевого интерфейса
       virtual_router_id 50  # virtual_router_id должен совпадать на основном и резервном серверах
       priority 100          # Установите приоритет ниже, чем у основного сервера
       nopreempt
       advert_int 3
    
       authentication {
          auth_type PASS
          auth_pass "<произвольный пароль>"  # Установите надёжный пароль
       }
    
       virtual_ipaddress {
          <VIP IP>  # Укажите ваш VIP IP
       }
    
       # Замените на абсолютный путь к установщику Compass
       notify_master "<полный путь к установщику Compass>/script/replication/keepalived_status_changed.py --state MASTER"
       notify_backup "<полный путь к установщику Compass>/script/replication/keepalived_status_changed.py --state BACKUP"
       notify_fault "<полный путь к установщику Compass>/script/replication/keepalived_status_changed.py --state FAULT"
       track_script {
          chk_nginx weight -30
          chk_disk
       }
    }
    
  5. На основном сервере запустите keepalived:

    sudo systemctl enable keepalived;
    sudo systemctl start keepalived
    

    Завершите процесс keepalived для состояния BACKUP, которое создаётся при первом запуске:

    kill $(pgrep -f "keepalived_status_changed.py --state BACKUP")
    

    Для проверки успешного запуска keepalived выполните команду:

    sudo systemctl status keepalived
    
  6. На резервном сервере запустите keepalived:

    Предупреждение

    Рекомендуем запускать keepalived сначала на основном сервере и только затем на резервном.
    Таким образом весь трафик начнёт идти через основной сервер и переключится на резервный, только если основной сервер стал недоступным.

    sudo systemctl enable keepalived;
    sudo systemctl start keepalived
    

    Для проверки успешного запуска keepalived выполните команду:

    sudo systemctl status keepalived
    
  7. Чтобы включить процесс отказоустойчивости, требуется подключить ваш домен к внешнему IP VIP. Таким образом, если всё было настроено верно, трафик начнёт отправляться через VIP на основной сервер.

    Внимание

    Обратите внимание, что для переключения домена со старого IP к IP VIP требуется время. В этом случае не рекомендуется переключать или отключать keepalived на текущем мастер-сервере.

    Для проверки изменения переключения в DNS рекомендуется использовать команду:

    dig +short <domain.ru> @8.8.8.8
    
  8. После старта keepalived добавьте скрипт для синхронизации файлов в задачи crontab, указав vip, на основном и резервном серверах:

    Примечание

    В команду ниже необходимо подставить полный путь к инсталлятору Compass и используемый Virtual IP (VIP).

    (sudo crontab -l 2>/dev/null; \
    echo "* * * * * /usr/bin/python3 \
    <полный путь к инсталлятору Compass>/script/replication/sync_files.py \
    --vip <Virtual IP> --monitoring > /dev/null 2>&1 &"; \
    echo "*/5 * * * * /usr/bin/python3 \
    <полный путь к инсталлятору Compass>/script/replication/show_slave_replication_status.py --monitoring > /dev/null 2>&1 &") | sudo crontab -
    
  9. На основном и резервном серверах проверьте добавление задачи в crontab:

    sudo crontab -l