Данное руководство касается версии keepalived 1.4.2
Ввиду того, что на версии 1.2.15 не стабильно работают некоторые критически важные функции, рекомендуется использовать только версию 1.4.2
Описание пакета
Пакет keepalived это open source программное обеспечение, предназначенное для обеспечения функций высокой надежности (high availabilitty) и балансировки нагрузки (load-balancing). За первую функцию отвечает реализация протокола VRRP, а вторая основывается на модуле ядра Linux Vitrual Server (IPVS). Keepalived не разрабатывается сотрудниками Eltex и не включает доработок, за исключением конфигурации, выполняется сборка из исходных кодов из официального репозитория на GitHub (https://github.com/acassen/keepalived) необходимой версии под используемую операционную систему.
Keepalived используется для организации резервирования контроллеров SoftWLC, при этом используется только функционал VRRP.
Пакет keepalived можно запросить в Сервисном центре Wi-Fi и БШПД.
Установка
Для установки пакета необходимо загрузить его на сервер и выполнить следующую команду от имени суперпользователя:
root@master:/# dpkg -i keepalived-eltex_1.4.2-16.04_amd64.deb
Установка сразу со всеми зависимостями:
apt-get install -f ./keepalived-eltex_1.4.2-32-16.04_amd64.deb
Способ запуска/остановки
Для запуска сервиса воспользуйтесь командой:
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 # Режим в котором будет запускаться демон, на мастер сервере установите state MASTER interface eth0 # Интерфейс на котором будет работать VRRP virtual_router_id 1 # Уникальное значения для различия между разными vrrp-instance. Должен совпадать на обоих узлах. track_script { check_network } track_interface { # мониторинг состояния интерфейсов eth0 weight 50 } priority 150 advert_int 1 # Интервал опроса VRRP nopreempt authentication { # Блок аутентификации auth_type PASS # PASS - по паролю. auth_pass eltex # keepalived обрезает пароль до 8 символов. Так что делать пароль длиннее не имеет смысла. } virtual_ipaddress { <virtual_ip> dev eth0 label eth0:1 # Указваем общий виртуальный ip-адрес для членов VRRP instance. } 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 адресов серверов, на которые будут рассылаться VRPP пакеты. <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
.