Skip to main content

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

***Страница перенесена в Confluence***

Резервирование 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 +). В случае L2 связности - схема Intra DC, в случае L3 связности - Inter DC.

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

  1. В настройках Firewall необходимо разрешить трафик с портов:

  • 500/udp, 4500/udp для подключения точек доступа посредством IPSec

  • 1883/tcp для резервного подключения посредством прямого MQTT

  • 80/tcp, 443/tcp для Web

  • 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: 

    curl -sSl https://get.docker.com | sh
    # до 1.10 требовалась установка docker-compose 
    sudo curl -SL https://github.com/docker/compose/releases/download/v2.20.3/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-copy-id username@another_host

    Необходимо выполнить на обоих серверах

  • Проверить чтобы 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)

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

chmod +x Wimark-Platform-*-installer.bin
./Wimark-Platform-*-installer.bin

Резервирование по схеме 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
SERVERNAME=example.lan # доменное имя платформы

$ 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

Дополнительно выдать права на выполнение 


chmod +x /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
}


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

sudo service keepalived restart


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

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

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

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

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

Central switching при подключении ТД без IPSec

Cледует сделать следующее:

  1. Установить одинаковые HOST_UUID / HOSTNAME для обоих машин в файлах /etc/wimark/master/.env и /etc/wimark/backup/.env

  2. Дописать этот же ID (wimark-wlc) - в env var DEFAULT_HOST_ID в конфигураторе

    Пример:

    nano /etc/wimark/master/docker-compose.yml
    configurator:
            image: ####
            environment:
                - ###
                - ###
                - ####
                - ####
                - #####
                - DEFAULT_HOST_ID=wimark-wlc

    Для корректной работы так же необходимо закоментировать strongswan и tunnel сервисы, оставив только mongo / lsyncd в файле /etc/wimark/backup/docker-compose.yml

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

Важно! Шаг 1 нужен только для установки при отсутствии L2 между серверами.

  1. Настроить L2TPv3 туннель между машинами, на которых будет разворачиваться платформа

    # Для первой машины:
    ip l2tp add tunnel tunnel_id {ID-1} local {IP-1} udp_sport {PORT-1} peer_tunnel_id {ID-2} remote {IP-2} udp_dport {PORT-2}
    # Для второй машины:
    ip l2tp add tunnel tunnel_id {ID-2} local {IP-2} udp_sport {PORT-2} peer_tunnel_id {ID-1} remote {IP-1} udp_dport {PORT-1}

    Либо установить VxLAN туннель

    # Для первой машины:
    ip link add name vxlan0 type vxlan id {VLAN-ID} dev eth0 remote {IP-2} local {IP-1} dstport 4789
    ip link add name br-vxlan0 type bridge
    ip link set dev vxlan0 master br-vxlan0 
    ip a a 192.168.17.1/24 dev br-vxlan0
    ip link set vxlan0 up
    ip link set br-vxlan0 up
    
    # Для второй машины:
    ip link add name vxlan0 type vxlan id 42 dev eth0 remote remote {IP-1} local {IP-2} dstport 4789
    ip link add name br-vxlan0 type bridge
    ip link set dev vxlan0 master br-vxlan0 
    ip a a 192.168.17.2/24 dev br-vxlan0
    ip link set vxlan0 up
    ip link set br-vxlan0 up

Важно! Создание туннеля нужно добавить в автозапуск, например через /etc/rc.local :

# cat /etc/rc.local
#!/bin/bash

ip link add name vxlan0 type vxlan id 42 dev eth0 remote 192.168.0.7 local 192.168.0.4 dstport 4789
ip link add name br-vxlan0 type bridge
ip link set dev vxlan0 master br-vxlan0 
ip a a 192.168.17.1/24 dev br-vxlan0
ip link set vxlan0 up
ip link set br-vxlan0 up
exit 0

# chmod +x /etc/rc.local
# sudo systemctl start rc-local.service
# sudo systemctl enable rc-local.service
  1. Настроить файл /etc/hosts на обоих серверах так, чтобы резолвились хосты, необходимые для работы базы данных

    # Для первой машины:
    127.0.0.1 localhost mongo-rs-1
    {IP-2} mongo-rs-2
    {VIP} mongo-rs-3
    
    # Для второй машины:
    127.0.0.1 localhost mongo-rs-2
    {IP-1} mongo-rs-1
    {VIP} mongo-rs-3
  2. Открыть в firewall порты 30001, 30003 , 1883 tcp, а также 500, 4500 udp (для подключения точек и БД), а также 80,443,8080 tcp для управления администратором

  3. На обеих машинах запустить установку платформы

    # Для первой машины:
    FIRST_IP={IP-1} SECOND_IP={IP-2} VIP={VIP} NEIGHBOR_IP={IP-2} ./WiMark-Platform-ha-*-installer.run
    # Для второй машины:
    FIRST_IP={IP-1} SECOND_IP={IP-2} VIP={VIP} NEIGHBOR_IP={IP-1} ./WiMark-Platform-ha-*-installer.run

    Дождаться окончания работы скрипта

  4. Настроить беспарольный доступ между машинами (все пункты параллельно выполнять на обеих машинах)

    1. Создать пользователя one

      adduser one
    2. Войти в систему под этим пользователем

      su one
    3. Сгенерировать ssh ключ

      ssh-keygen
    4. Включить бесключевой доступ между машинами (либо вручную скопировать id_rsa.pub в ~/.ssh/authorized_hosts)

      ssh-copy-id one@{IP}
  5. Добавить скрипты для keepalived в папку /opt/wimark на обеих машинах

    1. /opt/wimark/checker.sh

      #!/bin/bash
      STATE="$(cat /opt/wimark/ha_state)"
      LOG_STR="$(date) $STATE"
      WORKDIR="/opt/wimark"
      case $STATE in
          "MASTER")
              cd $WORKDIR/master
              bash start.sh
              LOG_STR="$LOG_STR: start master"
              ;;
          "BACKUP")
              cd $WORKDIR/backup
      	bash start.sh
              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
    2. /opt/wimark/set_state.sh

      #!/bin/bash
      TYPE=$1 NAME=$2 STATE=$3
      LOG_STR="$(date) $STATE"
      WORKDIR="/opt/wimark"
      LOCK_FILE="ha_state"
      
      case $STATE in
          "MASTER")
              echo "$STATE" > $WORKDIR/$LOCK_FILE
              LOG_STR="$LOG_STR: start primary"
              ;;
          "BACKUP")
              echo "$STATE" > $WORKDIR/$LOCK_FILE
      	    LOG_STR="$LOG_STR: start secondary"
              ;;
          *)
      	    echo "$STATE" > $WORKDIR/$LOCK_FILE
              LOG_STR="$LOG_STR: nothing"
              ;;
      esac


  6. Сделать скрипты исполняемыми на обеих машинах

    chmod +x /opt/wimark/checker.sh
    chmod +x /opt/wimark/set_state.sh
  7. Добавить конфигурационный файл для keepalived

    1. /etc/keepalived/keepalived.conf - НА ПЕРВОЙ МАШИНЕ

      global_defs {
          script_user root
          #enable_script_security
      }
      
      # VRRP instance name WI2
      vrrp_instance WIM1 {
      
          # iface for listeting interface: eth0
          # ПОМЕНЯТЬ ИМЯ ИНТЕРФЕЙСА НА ТОТ, КОТОРЫМ СОЕДЕНИНЫ МАШИНЫ!!!
          interface eth0 
      
          # 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 {RANDOMPASSWORD}
          }
      
          # virtual address to promote
          virtual_ipaddress {
              # ПОМЕНЯТЬ IP И ИМЯ ИНТЕРФЕЙСА НА ТЕ, КОТОРЫЕ БЫЛИ УКАЗАННЫ КАК VIP ПРИ УСТАНОВКЕ!!!
              {VIP}/24 dev eth0 
          }
      
          # script to run when STATE is changing -- main logic, DO NOT change
          notify /opt/wimark/set_state.sh
      }
    2. /etc/keepalived/keepalived.conf - НА ВТОРОЙ МАШИНЕ

      global_defs {
          script_user root
          #enable_script_security
      }
      
      # VRRP instance name WI2
      vrrp_instance WIM2 {
      
          # iface for listeting interface: eth0
          # ПОМЕНЯТЬ ИМЯ ИНТЕРФЕЙСА НА ТОТ, КОТОРЫМ СОЕДЕНИНЫ МАШИНЫ!!!
          interface eth0 
      
          # 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 {RANDOMPASSWORD}
          }
      
          # virtual address to promote
          virtual_ipaddress {
              # ПОМЕНЯТЬ IP И ИМЯ ИНТЕРФЕЙСА НА ТЕ, КОТОРЫЕ БЫЛИ УКАЗАННЫ КАК VIP ПРИ УСТАНОВКЕ!!!
              {VIP}/24 dev eth0 
          }
      
          # script to run when STATE is changing -- main logic, DO NOT change
          notify /opt/wimark/set_state.sh
      }


  8. Запустить контейнеры скриптом /opt/wimark/master/start.sh на MASTER хосте, и /opt/wimark/backup/start.sh на BACKUP хосте. Дождаться запуска контейнеров.

    # Для MASTER
    cd /opt/wimark/master/; ./start.sh
    
    # Для BACKUP
    cd /opt/wimark/backup/; ./start.sh
  9. Создать задачу для cron на обеих машинах

    # Открыть список задач cron для пользователя root:
    crontab -u root -e
    
    # Записать в него задачи для запуска /opt/wimark/checker.sh
    
    * * * * * bash /opt/wimark/checker.sh
    * * * * * sleep 10 && bash /opt/wimark/checker.sh
    * * * * * sleep 20 && bash /opt/wimark/checker.sh
    * * * * * sleep 30 && bash /opt/wimark/checker.sh
    * * * * * sleep 40 && bash /opt/wimark/checker.sh
    * * * * * sleep 50 && bash /opt/wimark/checker.sh
    
    # Сохранить изменения в списке задач и проверить его
    crontab -u root -l
  10. Перезапустить службу keepalived на обеих машинах

    service keepalived restart

ВАЖНО! При первом запуске контейнеры на MASTER хосте не будут корректно работать до тех пор, пока не запустятся BACKUP контейнеры.