Установка
apt install keepalived
Прописать на обоих нодах
echo 'net.ipv4.ip_nonlocal_bind=1'|sudo tee -a /etc/sysctl.conf sudo sysctl -p
Рабочий конфиг
vim /etc/keepalived/keepalived.conf
global_defs { enable_script_security max_auto_priority } vrrp_script check_haproxy { script "/usr/bin/systemctl is-active --quiet haproxy" interval 2 weight 2 } vrrp_instance VI_1{ state MASTER interface ens192 virtual_router_id 55 priority 50 advert_int 1 unicast_src_ip 192.168.10.11 unicast_peer { 192.168.10.12 } virtual_ipaddress { 192.168.10.10 } track_script {check_haproxy} }
Конфигурационные файлы отличаются опцией state. На первом сервере мы задаем ей значение MASTER, предполагая, что он будет основным по умолчанию, второму — BACKUP. Также на втором сервере дополнительна указана директива preempt_delay.
global_defs | задает глобальные настройки. В нашем примере мы разрешаем использование скриптов. В противном случае, keepalived будет возвращать ошибки при использовании скриптов проверки состояния и запуска notify (о нем ниже) |
vrrp_script | описание процесса проверки сервиса. Мы не ограничены в способах — shell-скрипт должен вернуть 0, если все хорошо или другой код ответа, если все плохо. В данном примере мы отправляем запрос на 80 порт, на котором слушает веб-сервер. Если он работает, то команда вернет правильный код ответа. Однако, nginx может слушать на другом порту и это нужно учитывать. Также есть и другие варианты проверки работы nginx, например, команды killall -0 nginx и pidof nginx. Опция interval указывает на периодичность проверки в секундах; опция user задает пользователя. от которого будет выполняться скрипт |
vrrp_instance | настройки для экземпляра сервиса. В нашем примере мы дали название экземпляру web. Вы можете задать свое |
state | задает начальное состояние ноды. В нашем случае первая MASTER, вторая BACKUP. Важно отметить, что если в конфигурации будет опция nopreempt, возможен только вариант BACKUP |
interface | название сетевого интерфейса, на который будет добавлен VIP адрес, если сервер станет мастером |
virtual_router_id | идентификатор VRRP. Может принимать значение от 1 до 255. Должен быть одинаковым для всех узлов, входящих в кластер |
priority | приоритет узла. Мастером будет назначен сервер с работающим сервисом и самым высоким приоритетом |
advert_int | время в секундах, с которой мастер должен сообщать о себе другим нодам. Если за данное время он не успеет отправить широковещательный сигнал, начнутся выборы другого мастера |
preempt_delay | опция позволяет определить поведение мастера при восстановлении сервиса. Задает время в секундах, после которого сервер с более высоким приоритетом заберет обратно себе роль мастера. Стоит отметить, что при наличии опции nopreempt бывшему мастеру не разрешается возвращать свое старое состояние. Опция игнорируется на сервере, где в качестве начального состояния указано MASTER |
authentication | данный блок описывает опции авторизации. Так как запросы широковещательные, очень важно использовать аутентификацию. В данном примере используется пароль 12345678 |
virtual_ipaddress | блок задает VIP |
track_script | указываем скрипт, с помощью которого будет проверяться работоспособность сервиса |
Состоит из 2 частей:
Машина, выполняющая роль LB в терминологии Keepalived называется Director или LVS router. Вкратце, Keepalived выполняет 2 функции - проверку состояния ресурсов и их балансировку, и обеспечение отказоустойчивости самих балансировщиков ("директоров").
Работает как 3 процесса: родительский, отслеживающий состояние дочерних (watchdog), и дочерние - один отвечает за VRRP, другой - за проверку здоровья. Родительский каждые 5 сек шлёт hello-пакет дочерним процессам, и если они не отвечают, перезапускает их.
Файл конфигурации по умолчанию - /etc/keepalived/keepalived.conf
.
Варианты проверок:
Failover (VRRP) Framework:
Режимы работы LB:
https://www.keepalived.org/doc/introduction.html
https://www.keepalived.org/manpage.html
Простейший конфиг
vrrp_instance haproxy1 { interface eth0 virtual_router_id 1 # to be MASTER, make priority 50 more than on other machines. priority 100 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.40 } }
https://www.redhat.com/sysadmin/advanced-keepalived
https://e-mc2.net/keepalived-documentation-nightmare
/etc/keepalived/keepalived.conf
, 2 VIP с отправкой писем при изменении статуса и отслеживанием работы сервиса с изменением веса.
Первичный сервер
global_defs { notification_email { user@domain.ru } notification_email_from vmls-haproxy1@domain.ru smtp_server mail.domain.ru smtp_connect_timeout 60 enable_script_security } vrrp_script chk_haproxy { script "/usr/bin/killall -0 haproxy" interval 3 weight 50 user root } vrrp_instance haproxy_DMZ { interface eth2 virtual_router_id 1 priority 100 authentication { auth_type PASS auth_pass 12345 } virtual_ipaddress { 192.168.20.44/24 } track_script { chk_haproxy } smtp_alert } vrrp_instance haproxy_LAN { interface eth0 virtual_router_id 2 priority 100 authentication { auth_type PASS auth_pass 54321 } virtual_ipaddress { 10.1.4.55/16 } track_script { chk_haproxy } smtp_alert }
Вторичный сервер
global_defs { notification_email { user@domain.ru } notification_email_from vmls-haproxy2@domain.ru smtp_server mail.domain.ru smtp_connect_timeout 60 enable_script_security } vrrp_script chk_haproxy { script "/usr/bin/killall -0 haproxy" interval 3 weight 50 user root } vrrp_instance haproxy_DMZ { interface eth2 virtual_router_id 1 priority 90 authentication { auth_type PASS auth_pass 12345 } virtual_ipaddress { 192.168.20.44/24 } track_script { chk_haproxy } smtp_alert } vrrp_instance haproxy_LAN { interface eth0 virtual_router_id 2 priority 90 authentication { auth_type PASS auth_pass 54321 } virtual_ipaddress { 10.1.4.55/16 } track_script { chk_haproxy } amtp_alert }
Силами Postfix. При настройке выбрать Satellite system, т. е. весь почтовый трафик идёт через внешний почтовый сервер.
Примерный конфиг /etc/postfix/main.cf
. В данном случае - отправка на внутрисетевой открытый релей Exchange. Запуск мастера настройки заново - dpkg-reconfigure postfix
.
# See /usr/share/postfix/main.cf.dist for a commented, more complete version # Debian specific: Specifying a file name will cause the first # line of that file to be used as the name. The Debian default # is /etc/mailname. #myorigin = /etc/mailname smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) biff = no # appending .domain is the MUA's job. append_dot_mydomain = no # Uncomment the next line to generate "delayed mail" warnings #delay_warning_time = 4h readme_directory = no # See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on # fresh installs. compatibility_level = 2 # TLS parameters smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key smtpd_tls_security_level=may smtp_tls_CApath=/etc/ssl/certs smtp_tls_security_level=may smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination myhostname = vmls-haproxy2.domain.ru alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mydestination = vmls-haproxy2.domain.ru, vmls-haproxy2, localhost.localdomain, localhost relayhost = mail.domain.ru mailbox_size_limit = 0 recipient_delimiter = inet_interfaces = loopback-only inet_protocols = ipv4