Skip to main content

Установка на свои сервера с резервированием 1+1 (Active - Standby)

Резервирование Master-Backup 1 DC

Как работает резервирование


image.png

Типовая схема Active-Standby представлена выше (Требует правок).

Требуется 2 сервера с идентичной конфигурацией, но работающих по разному. Резервирование Wimark One предполагает резервирование следующего:

  • БД
  • Статических и графических файлов

Для резервирования БД используется встроенное в БД средство, а именно Active-Backup схема развертывания.

Для резервирования статических файлов используется пакет lsyncd.

Важную функцию выполняет keepalived - это демон VRRP, позволяющий использовать виртуальный IP для серверов. Тем самым, в один момент времени по VIP фактически доступен только 1 сервер - и он же является Master в данный момент.

Подготовка

Для развертывания платформы Wimark в режиме Active-Standby необходимо 2 сервера с предустановленной ОС семества Debian (Debian 9/10, Ubuntu 18.04 LTS +). Между серверами должно быть настроено резервное выделенное подключение, а также одно по одному интерфейсу в сторону точек доступа.

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

  1. В настройках Firewall необходимо разрешить трафик с портов:
  • 500/udp, 4500/udp для подключения точек доступа посредством L3 туннеля
  • 1883/tcp для резервного подключения
  • 80/tcp, 443/tcp для Web NMS
  • 22/tcp для удаленного управления посредством SSH
  • Включить Forwarding трафика:
  • Выполните настройку sysctl для форвардинга:
    echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
    echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf # sysctl -p
  • В настройках Iptables: iptables -P FORWARD ACCEPT
  • Установить keepalived: sudo apt update && sudo apt install keepalived
  • Установить docker & docker-compose: 
    curl -sSl https://get.docker.com | sh
    sudo curl -L "https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-x86_64"\
    -o /usr/local/bin/docker-compose; sudo chmod +x /usr/local/bin/docker-compose
  • Настроить канал между серверами:
  • Прописать IP адреса, либо получить по DHCP
  • Выделить отдельный адрес из подсети для VIP
  • Сгенерировать ssh ключи на серверах: ssh-keygen
  • Прописать в ~/.ssh/authorized_keys содержимое файла ~/.ssh/id_rsa.pub соседнего сервера
  • Проверить чтобы ssh между серверами был без пароля

Развертывание (для версии 1.1) - не актуально

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

  • IFACE - имя интерфейса, связывающего оба сервера
  • FIRST_IP - адрес текущего сервера на интерфейсе IFACE
  • SECOND_IP - адрес соседнего сервера на интерфейсе IFACE
  • VIRTUAL_IP - выделенный IP адрес в сети, связывающей сервера
  • VIRTUAL_SUBNET - подсеть для выделенного IP (в формате от 1 до 32, например 24)
  • USER - имя пользователя, с которым настраивался безпарольный ssh доступ между серверами

Затем после загрузки бинарного файла на каждый из серверов запустить установку. Пример команды запуска:

# выполняем под суперпользователем
sudo su
IFACE=eth1 FIRST_IP=192.168.1.1 SECOND_IP=192.168.1.2 VIRTUAL_IP=192.168.1.3 VIRTUAL_SUBNET=24 USER=wimark ./Wimark-Platform-installer.binC

На второй машине отличие только в параметрах FIRST_IP и SECOND_IP.

После установки на обоих машинах, необходимо последовательно перезапустить сервис keepalived сначала на Active сервере, потом на сервере Standby.

sudo service keepalived restart

Для последующего подключения точек необходимо указывать оба адреса как адрес брокера через Web точки доступа (доступ осуществляется без пароля с пользователем root).

Развертывание (начиная с версии 1.2)


Резервирование по схеме 1+1 основано на использовании протокола VRRP и плавающего сетевого адреса (VIP). В качестве программного обеспечения используется keepalived.

Keepalived осуществляет следующие функции:

  • Проверку состояния серверов;
  • Автоматическое переключение ресурсов в случае отказа основного сервера с выполнением скриптов пользователя.

В случае резервирования платформы управления, мониторинга и авторизации Keepalived опускает или поднимает сервисы, необходимые для работы.

Также для зеркалирования статических данных (таких как изображения карт, файлы веб страниц авторизации, рекламные материалы) используется lsyncd, входящий в комплект поставки.

Предоставленный бинарник загружает docker образы, размещает необходимые статические файлы в /usr/share/wimark, а также создает размещает конфигурации master и backup вариантов работы в /etc/wimark.

В директориях /etc/wimark/master и /etc/wimark/backup необходимо создать файлы .env и прописать валидные для текущей инсталляции переменные окружения для compose файлов:

$ cat /etc/wimark/master/.env
VIP=10.10.10.3 # Общий для инсталляции адрес
SECOND_IP=10.10.10.2 # Адрес второй машины в связывающей подсети
HOSTNAME=wifi-controller #hostname сервера
HOST_UUID=a73a766996734421994f2bfd4e00afd1 #machine id
USERNAME=username # имя пользователя с которым можно ходить по ssh на SECOND_IP

$ cat /etc/wimark/backup/.env
VIP=10.10.10.3
HOSTNAME=wifi-controller #hostname сервера
HOST_UUID=a73a766996734421994f2bfd4e00afd1 #machine id

$ cat /etc/hostname
wifi-controller
$ cat /etc/machine-id
a73a766996734421994f2bfd4e00afd1
$ echo $USER
username

Необходимо настроить ssh на обоих машинах так, чтобы по id_rsa ключу пользователя, указанного выше в .env можно было иметь доступы на соседнюю машину (cat ~/id_rsa.pub >> ~/.ssh/authorized_keys)

После установки платформы необходимо настроить работу keepalived. Для этого необходимо создать и проверить правильность находящихся внутри адресов и путей файлы, шаблоны которых приведены в конце. Чтобы протестировать работу master-backup.sh:

cd /etc/wimark; ./master-backup.sh 1 1 MASTER
docker ps

cd /etc/wimark; ./master-backup.sh 1 1 BACKUP
docker ps

Чтобы протестировать работу keepalived (не забыв включить сервис можно просто сделать ребут на обоих машинах):

Примеры конфигурационных файлов:

/etc/wimark/master-backup.sh


#!/bin/bash
TYPE=$1 NAME=$2 STATE=$3
LOG_STR="$(date) $STATE"
case $STATE in
    "MASTER")
        echo "MASTER" > ./pa.lock
        rm -f /usr/share/wimark/volumes/mongo/*.lock
                cd /etc/wimark/backup
                docker-compose down
                cd /etc/wimark/master
                docker-compose up -d
                LOG_STR="$LOG_STR: start master"
        ;;
    "BACKUP")
        ls
        echo "BACKUP" > ./pa.lock
        sleep 10
        [ $(cat ./pa.lock) != "BACKUP" ] && exit 0 rm -f /usr/share/wimark/volumes/mongo/*.lock
                cd /etc/wimark/master
                docker-compose down
                cd /etc/wimark/backup
                docker-compose up -d
                LOG_STR="$LOG_STR: start backup"
        ;;
    "FAULT")
        LOG_STR="$LOG_STR: fault"
        ;;
    *)
        LOG_STR="$LOG_STR: unknown"
        ;;
esac
echo $LOG_STR >> /var/log/wimark-keepalived.log
/etc/keepalived/keepalived.conf для master машины


global_defs {
    script_user root
    #enable_script_security
}

# VRRP instance name WIM1
vrrp_instance WIM1 {

    # iface for listeting interface: eth0
    interface l2tpeth0

    # state of current server: MASTER or BACKUP
    state MASTER

    # id for unique VRRP segment
    virtual_router_id 67

    # preempt - for change MASTER always to first node (if up)
    # nopreempt - stay in position after reconnecting
    #nopreempt

    # some other needed parameters
    garp_master_delay 1
    priority 200
    advert_int 1

    # authentication method and password to use
    authentication {
        auth_type PASS
        auth_pass wimark123
    }

    # virtual address to promote
    virtual_ipaddress {
        10.10.10.3/24 dev l2tpeth0
    }

    # script to run when STATE is changing -- main logic, DO NOT change
    notify /etc/wimark/master-backup.sh
}
/etc/keepalived/keepalived.conf для backup машины


global_defs {
    script_user root
    #enable_script_security
}

# VRRP instance name WI2
vrrp_instance WIM2 {

    # iface for listeting interface: eth0
    interface l2tpeth0

    # state of current server: MASTER or BACKUP
    state BACKUP

    # id for unique VRRP segment
    virtual_router_id 67

    # preempt - for change MASTER always to first node (if up)
    # nopreempt - stay in position after reconnecting
    # nopreempt

    # some other needed parameters
    garp_master_delay 1
    priority 200
    advert_int 1

    # authentication method and password to use
    authentication {
        auth_type PASS
        auth_pass wimark123
    }

    # virtual address to promote
    virtual_ipaddress {
        10.10.10.3/24 dev l2tpeth0
    }

    # script to run when STATE is changing -- main logic, DO NOT change
    notify /etc/wimark/master-backup.sh
}


Работоспособность системы определяется следующим образом:

  1. Web NMS доступен по внешнему IP адресу любого сервера (логин/пароль по-умолчанию wimark/wimark)

  2. Точки доступа извне могут подключиться по любому из адресов серверов

Настройка точек доступа:

  1. Точку доступа следует подключить к платформе по VIP