Keepalived
Коротко
Демон для отказоустойчивости на Linux. Реализует VRRP (Virtual Router Redundancy Protocol) - автоматический failover виртуального IP между серверами. Также может выполнять балансировку нагрузки через IPVS (LVS).
Основные сценарии:
- HA для nginx, haproxy, database VIP
- Активный/резервный кластер из двух нод
- Балансировка с health checks реальных серверов
Как работает VRRP
VRRP использует IP protocol 112 (не TCP/UDP).
Master отправляет advertisements каждые advert_int секунд (по умолчанию 1 сек) на multicast 224.0.0.18 (IPv4) или ff02::12 (IPv6).
Backup слушает эти пакеты. Если advertisements перестают приходить - backup становится master и забирает VIP.
Выборы master:
- Побеждает нода с большим
priority(1-255) - При равном priority - нода с большим IP
Preemption: если упавший master восстановился и его priority выше - он заберет VIP обратно. Отключается через nopreempt.
Конфигурация
Файл: /etc/keepalived/keepalived.conf
Минимальный MASTER/BACKUP
Нода 1 (master):
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 101
priority 255
advert_int 1
authentication {
auth_type PASS
auth_pass secret12
}
virtual_ipaddress {
192.168.1.100/24
}
}Нода 2 (backup):
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 101
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass secret12
}
virtual_ipaddress {
192.168.1.100/24
}
}Критичные параметры:
virtual_router_id- должен совпадать на обеих нодах, уникален в сегменте (1-255)auth_pass- максимум 8 символовpriority- у master выше чем у backup
Failover без preemption
Оба сервера стартуют как BACKUP. Кто первый поднялся - тот master. При восстановлении упавшего - он остается backup.
vrrp_instance VI_1 {
state BACKUP
nopreempt
interface eth0
virtual_router_id 101
priority 200
advert_int 1
virtual_ipaddress {
192.168.1.100/24
}
}Health check через track_script
Отслеживание сервиса. При падении сервиса - снижается priority и VIP уходит на backup.
vrrp_script chk_nginx {
script "/usr/bin/pgrep nginx"
interval 2
weight -50
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 101
priority 100
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.1.100/24
}
}Параметры vrrp_script:
interval- частота проверки в секундах (по умолчанию 1)weight- изменение priority при fail (отрицательное значение)fall- сколько раз должен упасть для перехода в FAULTrise- сколько раз должен отработать для выхода из FAULT
Track interface
Падение интерфейса -> переход в FAULT -> VIP уходит на backup.
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 101
priority 100
track_interface {
eth1
eth2 weight -50
}
virtual_ipaddress {
192.168.1.100/24
}
}Track process
vrrp_track_process track_haproxy {
process haproxy
delay 1
}
vrrp_instance VI_1 {
state BACKUP
nopreempt
interface eth0
virtual_router_id 101
priority 200
track_process {
track_haproxy
}
virtual_ipaddress {
192.168.1.100/24
}
}Команды
| |
Установка (Debian/Ubuntu).
| |
Запуск сервиса.
| |
Статус и логи.
| |
Проверить наличие VIP на интерфейсе.
| |
Захват VRRP advertisements.
Firewall
VRRP использует IP protocol 112. Без правил firewall advertisements не пройдут.
| |
Примеры
HA для nginx
Две ноды. VIP 10.0.0.100. При падении nginx на master - VIP переезжает на backup.
Обе ноды:
global_defs {
router_id nginx_ha
}
vrrp_script chk_nginx {
script "/usr/bin/pgrep nginx"
interval 2
weight -50
fall 2
rise 2
}
vrrp_instance VI_NGINX {
state BACKUP
nopreempt
interface eth0
virtual_router_id 51
priority 100
advert_int 1
track_script {
chk_nginx
}
virtual_ipaddress {
10.0.0.100/24
}
}Разница между нодами - можно задать разный priority (100 vs 90).
LVS балансировка
Keepalived как балансировщик на основе IPVS.
virtual_server 192.168.1.100 80 {
delay_loop 6
lvs_sched rr
lvs_method NAT
protocol TCP
real_server 192.168.1.10 80 {
weight 1
TCP_CHECK {
connect_timeout 10
}
}
real_server 192.168.1.11 80 {
weight 1
TCP_CHECK {
connect_timeout 10
}
}
}Schedulers (lvs_sched):
rr- round robinwrr- weighted round robinlc- least connectionswlc- weighted least connectionssh- source hash
Methods (lvs_method):
NAT- destination NATDR- direct routing (real servers отвечают напрямую)TUN- IP tunneling
Проверка
- Запустить keepalived на обеих нодах
ip addr show- VIP должен быть на master- Остановить keepalived на master:
systemctl stop keepalived ip addr showна backup - VIP должен появитьсяtcpdump -i eth0 proto 112- должны идти VRRP пакеты