Данное руководство касается версии keepalived 1.3.6
Ввиду того, что на версии 1.2.15 не стабильно работают некоторые критически важные функции, рекомендуется использовать только версию 1.3.6
TODO
как keepalived используется в softwlc- описание конфига
- листинги скриптов
- (?) добавление slave stop / slave start в keep_notify.sh при переходе в backup
- описание работы keepalived по дефолту
- wieght & priority
- описание работы по rfc и вики
- перехват мастерства
- таймауты
- механизм preempt/nopreempt
- пример настройки (ГПН)
- отдельный лог
Описание пакета
Пакет keepalived это open source программное обеспечение, предназначенное для обеспечения функций высокой надежности (high availabilitty) и балансировки нагрузки (load-balancing). За первую функцию отвечает реализация протокола VRRP, а вторая основывается на модуле ядра Linux Vitrual Server (IPVS). Keepalived не разрабатывается сотрудниками Eltex и не включает доработок, за исключением конфигурации, выполняется сборка из исходных кодов из официального репозитория на GitHub (https://github.com/acassen/keepalived) необходимой версии под используемую операционную систему.
Keepalived используется для организации резервирования контроллеров SoftWLC, при этом используется только функционал VRRP.
Пакет keepalived для Ubuntu 14.04 можно запросить в Сервисном центре Wi-Fi и БШПД.
Установка
Для установки пакета необходимо загрузить его на сервер и выполнить следующую команду:
root@master:/# dpkg -i keepalived_1.3.6-eltexu14_amd64.deb
Установка должна производиться от имени суперпользователя root
Способ запуска/остановки
Для запуска сервиса воспользуйтесь командой:
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
Конфигурация
Конфигурация keepalived состоит из следующих файлов
Файл | Описание |
---|---|
/etc/keepalived/keepalived.conf | главный файл конфигурации сервиса |
/etc/keepalived/check_ping.sh | скрипт проверки состояния службы EMS |
/etc/keepalived/keep_notify.sh | скрипт, который выполняется при смене состояния (при переходе в MASTER, BACKUP, FAULT) |
/etc/sysconfig/keepalived | файл конфигурации параметров запуска процесса keepalived |
/etc/keepalived/mongo_switch.js | скрипт перевода члена replicaSet MongoDB в состояние, соответствующее состоянию VRRP |
Основной файл конфигурации
Листинг основного файла конфигурации по умолчанию
! Configuration File for keepalived global_defs { notification_email { admin@example.org } notification_email_from softwlc@example.org smtp_server mail.example.org smtp_connect_timeout 30 router_id swlc1 enable_traps } 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 eth0 virtual_router_id 1 track_script { check_network } track_interface { eth0 weight 50 } priority 150 advert_int 1 nopreempt authentication { auth_type PASS auth_pass eltex } virtual_ipaddress { <virtual_ip> dev eth0 label eth0: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> } }
Конфигурационный файл состоит из трех основных секций: global_defs, vrrp_script, vrrp_instance.
Первая определяет глобальные параметры, вторая содержит конфигурацию скрипта проверки состояния, а третья описывает сам VRRP инстанс.
Тест-скрипт
В текущей реализации в качестве тестового скрипта предлагается использовать следующий:
#!/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
скрипт пингует шлюз по умолчанию и возвращает код результата. Таким образом, при успешном выполнении скрипта гарантируется, что 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
с доделками и пояснениями
Скрипт смены мастера replicaSet MongoDB.
// Предоставляется окружением 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
параметры запуска etc
Выделение лога в отдельный файл
По умолчанию 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
.