Установка на свои сервера HA 1+1 (Active - Standby)
***Страница перенесена в Confluence***
Резервирование Master-Backup 1 DC
Как работает резервирование
Типовая схема 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.
Далее необходимо проверить и выполнить следующие правила:
-
В настройках 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
Работоспособность системы определяется следующим образом:
-
Web NMS доступен по внешнему IP адресу любого сервера (логин/пароль по-умолчанию wimark/wimark)
-
Точки доступа извне могут подключиться по любому из адресов серверов
Настройка точек доступа:
-
Точку доступа следует подключить к платформе по VIP
Central switching при подключении ТД без IPSec
Cледует сделать следующее:
-
Установить одинаковые HOST_UUID / HOSTNAME для обоих машин в файлах /etc/wimark/master/.env и /etc/wimark/backup/.env
-
Дописать этот же 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 между серверами.
-
Настроить 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
-
Настроить файл /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
-
Открыть в firewall порты 30001, 30003 , 1883 tcp, а также 500, 4500 udp (для подключения точек и БД), а также 80,443,8080 tcp для управления администратором
-
На обеих машинах запустить установку платформы
# Для первой машины: 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
Дождаться окончания работы скрипта
-
Настроить беспарольный доступ между машинами (все пункты параллельно выполнять на обеих машинах)
-
Создать пользователя one
adduser one
-
Войти в систему под этим пользователем
su one
-
Сгенерировать ssh ключ
ssh-keygen
-
Включить бесключевой доступ между машинами (либо вручную скопировать id_rsa.pub в ~/.ssh/authorized_hosts)
ssh-copy-id one@{IP}
-
-
Добавить скрипты для keepalived в папку /opt/wimark на обеих машинах
-
/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
-
/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
-
-
Сделать скрипты исполняемыми на обеих машинах
chmod +x /opt/wimark/checker.sh chmod +x /opt/wimark/set_state.sh
-
Добавить конфигурационный файл для keepalived
-
/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 }
-
/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 }
-
-
Запустить контейнеры скриптом /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
-
Создать задачу для 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
-
Перезапустить службу keepalived на обеих машинах
service keepalived restart
ВАЖНО! При первом запуске контейнеры на MASTER хосте не будут корректно работать до тех пор, пока не запустятся BACKUP контейнеры.