Keepalived Overview
Keepalived is an open-source software initially designed for managing LVS clusters, providing health monitoring for service nodes. It latter incorporated VRRP functionality to enable high availability solutions for various services like Nginx, HAProxy, and MySQL.
Core Functionality
- LVS load balancer management
- Health monitoring for cluster nodes
- Network service failover capability
VRRP Protocol Implementation
Keepalived uses the Virtual Router Redundancy Protocol (VRRP) to maintain service continuity. VRRP solves single point of failure issues in static routing by creating virtual routers that automatically failover when primary nodes become unavailable.
Configuration Example
Primary Node Configuration
global_defs {
node_id primary_node
}
vrrp_instance VI_1 {
state PRIMARY
interface eth0
virtual_router_id 50
priority 200
advert_int 1
authentication {
auth_type PASS
auth_pass secure123
}
virtual_ipaddress {
192.168.1.100/24
}
}
Secondary Node Configuration
global_defs {
node_id backup_node
}
vrrp_instance VI_1 {
state SECONDARY
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass secure123
}
virtual_ipaddress {
192.168.1.100/24
}
}
Split-Brain Mitigation
Split-brain occurs when cluster nodes lose communication but continue operating endependently. Prevention strategies include:
- Redundant heartbeat connections
- Resource locking mechanisms
- Ping-based arbitration systems
Common Causes
- Heartbeat connecsion failures
- Firewall blocking VRRP traffic
- Configuration mismatches
Service Monitoring
Health Check Script
#!/bin/bash
while true
do
active_services=$(systemctl list-units --state=active | grep nginx | wc -l)
if [ $active_services -lt 1 ]; then
systemctl stop keepalived
exit 1
fi
sleep 5
done
Multi-Instance Configuration
Primary Node Setup
vrrp_instance VI_2 {
state SECONDARY
interface eth0
virtual_router_id 55
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass secondary_pass
}
virtual_ipaddress {
192.168.1.101/24
}
}
Service Integration
server {
listen 192.168.1.100:80;
server_name primary.domain;
location / {
proxy_pass http://backend_pool;
}
}
server {
listen 192.168.1.101:80;
server_name secondary.domain;
location / {
proxy_pass http://fallback_pool;
}
}