Пакет keepalived это open source программное обеспечение, предназначенное для обеспечения функций высокой надежности (high availabilitty) и балансировки нагрузки (load-balancing). За первую функцию отвечает реализация протокола VRRP, а вторая основывается на модуле ядра Linux Vitrual Server (IPVS). Keepalived не разрабатывается сотрудниками Eltex и не включает доработок, за исключением конфигурации. Keepalived используется для организации резервирования контроллеров SoftWLC, при этом используется только функционал VRRP.
Для установки пакета необходимо загрузить его на сервер и выполнить следующую команду (установка должна производиться от имени суперпользователя root):
root@master:/# apt update root@master:/# apt install keepalived |
После установки необходимо добавить демона Keepalived в автозагрузку и запустить его:
root@master:/# systemctl enable keepalived root@master:/# systemctl start keepalived |
Конфигурация keepalived состоит из следующих файлов:
| Файл | Описание |
|---|---|
/etc/keepalived/keepalived.conf | главный файл конфигурации сервиса |
/etc/keepalived/check_ping.sh | скрипт проверки состояния службы EMS |
/etc/keepalived/keep_notify.sh | скрипт, который выполняется при смене состояния (при переходе в MASTER, BACKUP, FAULT) |
/etc/keepalived/mongo_switch.js | скрипт перевода члена replicaSet MongoDB в состояние, соответствующее состоянию VRRP |
Листинг основного файла конфигурации по умолчанию
! Configuration File for keepalived
global_defs {
script_user root
enable_script_security
}
vrrp_script check_network {
script "/etc/keepalived/check_ping.sh"
interval 5
weight 50
fall 3
rise 3
init_fail
user root
}
vrrp_instance VI_SWLC {
state BACKUP
interface <interface>
virtual_router_id 1
track_script {
check_network
}
track_interface {
<interface> weight 50
}
priority 150
advert_int 1
nopreempt
# Uncomment and comment "nopreempt" if preemption needed
#preempt_delay 180
authentication {
auth_type PASS
auth_pass eltex
}
virtual_ipaddress {
<virtual_ip> dev eth0 label <interface>:1
}
notify_master "/etc/keepalived/keep_notify.sh master"
notify_backup "/etc/keepalived/keep_notify.sh backup"
notify_fault "/etc/keepalived/keep_notify.sh fault"
unicast_peer {
<ip_server1>
}
} |
где
В текущей реализации в качестве тестового скрипта предлагается использовать следующий:
#!/bin/bash
# host to ping
# there - default gw
HOST=<default_gw_ip>
# -q quiet
# -c nb of pings to perform
ping -q -c5 $HOST > /dev/null
# $? var keeping result of execution
# previous command
if [ $? -eq 0 ]
then
echo `date +"%T %F"` "OK gw reachable"
EXIT_CODE=0
else
echo `date +"%T %F"` "ERROR gw unreacheble!"
EXIT_CODE=1
fi
exit $EXIT_CODE |
где <default_gw_ip> - шлюз по умолчанию для этого сервера.
Скрипт пингует шлюз по умолчанию и возвращает код результата. Таким образом, при успешном выполнении скрипта гарантируется, что SoftWLC достижим для внешних клиентов.
При смене состояния сервера выполняется скрипт keep_notify.sh
#!/bin/bash
MYSQL_USER="<mysql_user>"
MYSQL_PASSWORD="<mysql_password>"
mongo_set_role() {
local role="$1"
if [[ "$(which mongo)" ]]; then
mongo --quiet --eval "var role=\"$role\"" admin /etc/keepalived/mongo_switch.js
# Uncomment if using mongodb auth
#mongo -u<username> -p<password> --quiet --eval "var role=\"$role\"" admin /etc/keepalived/mongo_switch.js
fi
}
if ! lockfile-create --use-pid -r 5 /tmp/keep.mode.lock; then
echo "Unable to lock"
echo "Unable to lock" > /tmp/keep.mode.lock.fail
exit 0
fi
case "$1" in
master)
# ems_reload_all
echo "MASTER" > /tmp/keep.mode
mongo_set_role master
service eltex-ems restart
service tomcat7 restart
service eltex-ngw restart
# рестарт слейва MySQL чтобы при восстановлении связи - сразу получить изменения,
# а не ждать периодического heartbeat от второго сервера
mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "stop slave"
mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "start slave"
;;
backup)
echo "BACKUP" > /tmp/keep.mode
mongo_set_role slave
service mongodb restart
service eltex-ems stop
service tomcat7 stop
service eltex-ngw stop
mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "stop slave"
mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "start slave"
;;
fault)
echo "FAULT" > /tmp/keep.mode
mongo_set_role slave
service mongodb restart
;;
*)
echo "Usage: $0 {master|backup|fault}"
exit 1
esac
lockfile-remove /tmp/keep.mode.lock;
exit 0 |
где <mysql_user> и <mysql_password> - логин и пароль от БД MySQL.
// Предоставляется окружением
var role;
if (role != 'master' && role != 'slave') {
throw "Role must be either master or slave";
}
var thisIsMaster = (role == 'master');
var status = rs.isMaster();
var thisHost = status.me;
print("Primary: " + status.ismaster + "; applying configuration ...");
var cfg = rs.conf();
for (var i = 0; i < cfg.members.length; i++) {
var member = cfg.members[i];
var self = (member.host == thisHost);
if (self ^ thisIsMaster) {
// Конфигурация для slave
member.priority = 1;
member.votes = 0;
print(member.host + ": secondary");
} else {
// Конфигурация для master
member.priority = 2;
member.votes = 1;
print(member.host + ": primary");
}
}
var result = rs.reconfig(cfg, { force: !status.ismaster });
if (result.ok == 1) {
print("Reconfiguration done");
} else {
print(result);
} |
По умолчанию keepalived записывает лог в файл /var/log/syslog . Для удобства отладки, мониторинга и контроля работы keepalived можно настроить ведение собственного, отдельного лог-файла. Ниже приведен пример настройки rsyslog:
nano -w /etc/rsyslog.d/10-keepalived.conf if $programname contains 'Keepalived' then /var/log/keepalived.log if $programname contains 'Keepalived' then ~ |
Затем нужно перезапустить rsyslog командой:
root@swlc01-server:/# service rsyslog restart |
Теперь сообщения от демона keepalived попадут только в лог-файл /var/log/keepalived.log и не попадут в /var/log/syslog .
Для запуска сервиса воспользуйтесь командой:
service keepalived start |
Ответ об успешном запуске будет такой:
keepalived start/running, process 2471 |
Остановка сервиса:
root@master:/# service keepalived stop |
Ответ системы:
keepalived stop/waiting |
Проверить состояние сервиса можно командой:
root@master:/# service keepalived status |
Ответ:
keepalived start/running, process 2809 |