Пакет 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 |