В окружении, в котором оба основных сервера системы WNAM не могут общаться посредством multicast-пакетов (например, когда multicast не включен на распределенном коммутаторе VMware или в среде OpenStack), можно использовать демон keepalived в unicast-режиме. Для использования демона keepalived следует выполнить ряд действий:
Установить необходимый пакет:
apt install keepalived
Создать конфигурационный файл /etc/keepalived/keepalived.conf на каждом из серверов.
Конфигурационный файл на первом сервере:
vrrp_script check_wnam {
script "/home/wnam/check_wnam.sh"
interval 10
fall 2
rise 2
}vrrp_instance wnam_instance {
interface eth0track_interface {
eth0
}state MASTER
virtual_router_id 50
priority 100
preemptunicast_src_ip 1.2.3.89
unicast_peer {
1.2.3.90
}virtual_ipaddress {
1.2.3.91 dev eth0
}track_script {
check_wnam
}notify /home/wnam/keepalived.state.sh
}
Конфигурационный файл на втором сервере:
vrrp_script check_wnam {script "/home/wnam/check_wnam.sh"
interval 10
fall 2
rise 2
}vrrp_instance wnam_instance {
interface eth0track_interface {
eth0
}state BACKUP
virtual_router_id 50
priority 50
preemptunicast_src_ip 1.2.3.90
unicast_peer {
1.2.3.89
}virtual_ipaddress {
1.2.3.91 dev eth0
}track_script {
check_wnam
}notify /home/wnam/keepalived.state.sh
}
На каждом из двух серверов необходимо создать одинаковые скрипты:
Файл /home/wnam/check_wnam.sh:
#!/bin/bash
# Check if wnam is running, return 1 if not.
# Used by keepalived to initiate a failover in case WNAM is down
WNAM_STATUS=$(curl -s http://127.0.0.1:8080/api/statistic?json)
if [[ "$WNAM_STATUS" == *"statistic"* ]]
then
exit 0
elif [[ "$WNAM_STATUS" == *API_DISABLED* ]]
then
MONGO_ADDRESS=$(cat /home/wnam/application.yaml | grep mongodb:// | grep -Ev '^#' | awk -F "/" '{print $3}')
MONGO_PORT=$(echo $MONGO_ADDRESS | awk -F ":" '{print $2}')
MONGO_ADDRESS=$(echo $MONGO_ADDRESS | awk -F ":" '{print $1}')
MONGO_STATUS=$(echo "" > /dev/tcp/$MONGO_ADDRESS/$MONGO_PORT && echo "Opened" || echo "Closed")
if [[ "$MONGO_STATUS" == "Opened" ]]
then
exit 0
else
logger "Mongo is NOT running. Setting keepalived state to FAULT."
exit 1
fi
else
logger "WNAM is NOT running. Setting keepalived state to FAULT."
exit 1
fi
Файл /home/wnam/keepalived.state.sh:
#!/bin/bashTYPE=$1
NAME=$2
STATE=$3echo $STATE > /var/run/keepalived.stateif [ $STATE == "MASTER" ]; then
/sbin/ip route delete NET/MASK #Эта строка нужна если WNAM и NAS находятся в одной подсети. Здесь указать нужную подсеть.
/sbin/ip route add NAS_IP dev IF src CLUSTER_IP #если WNAM и NAS в одной подсети
/sbin/ip route add NAS_IP via GW src CLUSTER_IP #если WNAM и NAS в разных подсетях
fi
Вместо NAS_IP подставьте ip адрес вашего NAS, вместо IF имя интерфейса, на котором висит кластерный адрес, CLUSTER_IP кластерный ip адрес, GW - ip адрес шлюза до нужного хоста или подсети.
Таких записей может быть несколько. В таком случае добавлять их перед fi.
Следующей командой необходимо выдать скриптам права "на исполнение":
chmod +x /home/wnam/keepalived.state.sh /home/wnam/check_wnam.sh
Затем включить и перезапустить сервис keepalived на обоих серверах командами:
systemctl enable keepalived.servicesystemctl restart keepalived.service
После этого первый сервер получит кластерный IP-адрес, а в логе /var/log/syslog будут записи вида:
May 8 16:37:55 r-sr-wnam-app-001 Keepalived_vrrp[16978]: VRRP_Script(check_wnam) succeeded
May 8 16:37:55 r-sr-wnam-app-001 Keepalived_vrrp[16978]: (wnam_instance) Entering BACKUP STATE
May 8 16:37:59 r-sr-wnam-app-001 systemd[1]: Reloading.
May 8 16:37:59 r-sr-wnam-app-001 Keepalived_vrrp[16978]: (wnam_instance) Entering MASTER STATE