Keepalived 多节点负载均衡配置指南
架构说明
网络架构图
Internet
|
| (访问 192.168.1.100)
|
┌─────────────────┐ ┌─────────────────┐
│ 负载均衡器1 │ │ 负载均衡器2 │
│ (Master) │ │ (Backup) │
│ 192.168.1.1 │ │ 192.168.1.2 │
│ VIP: 192.168.1.100 │ │ VIP: 192.168.1.100 │
└─────────────────┘ └─────────────────┘
│ │
└───────────┬───────────┘
│
┌────────────────┼────────────────┐
│ │ │
┌─────────┐ ┌─────────┐ ┌─────────┐
│真实服务器1│ │真实服务器2│ │真实服务器3│
│192.168.1.10│ │192.168.1.11│ │192.168.1.12│
│ (Web服务) │ │ (Web服务) │ │ (Web服务) │
└─────────┘ └─────────┘ └─────────┘
工作原理
- VIP (192.168.1.100): 虚拟IP地址,在负载均衡器之间浮动
- VRRP: 虚拟路由冗余协议,实现主备切换
- LVS: Linux虚拟服务器,实现负载均衡
- DR模式: 直接路由模式,真实服务器直接响应客户端
服务器角色分配
负载均衡器 (2台)
| 服务器 |
IP地址 |
角色 |
优先级 |
说明 |
| 服务器1 |
192.168.1.1 |
Master |
100 |
主负载均衡器 |
| 服务器2 |
192.168.1.2 |
Backup |
90 |
备负载均衡器 |
| VIP |
192.168.1.100 |
浮动IP |
- |
对外服务地址 |
真实服务器 (3台)
| 服务器 |
IP地址 |
服务 |
权重 |
说明 |
| 服务器3 |
192.168.1.10 |
Web服务 |
1 |
真实服务器1 |
| 服务器4 |
192.168.1.11 |
Web服务 |
1 |
真实服务器2 |
| 服务器5 |
192.168.1.12 |
Web服务 |
1 |
真实服务器3 |
安装配置方案
负载均衡器安装要求
- 软件: Keepalived + ipvsadm
- 功能: VRRP高可用 + LVS负载均衡 + 健康检查
- 配置: 主备节点配置基本相同,优先级不同
真实服务器安装要求
- 软件: 只需要Web服务 (Nginx/Apache等)
- 功能: 配置VIP到lo接口 + ARP参数
- 注意: 不需要安装Keepalived
详细配置步骤
1. 负载均衡器安装 (服务器1和服务器2)
1.1 下载和编译安装
# 创建安装目录
mkdir -p /opt/keepalived
cd /opt/keepalived
# 下载Keepalived
wget https://www.keepalived.org/software/keepalived-2.2.8.tar.gz
tar -zxvf keepalived-2.2.8.tar.gz
cd keepalived-2.2.8
# 安装依赖 (CentOS/RHEL)
yum install -y gcc make openssl-devel libnl-devel popt-devel ipvsadm
# 安装依赖 (Ubuntu/Debian)
# apt-get install -y gcc make libssl-dev libnl-3-dev libnl-genl-3-dev ipvsadm
# 编译安装
./configure --prefix=/usr/local/keepalived
make && make install
# 创建必要目录
mkdir -p /etc/keepalived /var/log/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
1.2 主节点配置 (服务器1 - Master)
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER
vrrp_garp_master_delay 1
vrrp_garp_master_repeat 1
}
# VRRP实例配置
vrrp_instance VI_1 {
state MASTER
interface eth0 # 修改为实际网卡名称
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100 # 修改为实际VIP地址
}
}
# HTTP虚拟服务器配置
virtual_server 192.168.1.100 80 {
delay_loop 6
lb_algo rr # 轮询算法
lb_kind DR # 直接路由模式
persistence_timeout 50
protocol TCP
# 真实服务器1
real_server 192.168.1.10 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
# 真实服务器2
real_server 192.168.1.11 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
# 真实服务器3
real_server 192.168.1.12 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
# HTTPS虚拟服务器配置 (可选)
virtual_server 192.168.1.100 443 {
delay_loop 6
lb_algo wrr # 加权轮询算法
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.1.10 443 {
weight 2
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.11 443 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.12 443 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
1.3 备节点配置 (服务器2 - Backup)
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_BACKUP
vrrp_garp_master_delay 1
vrrp_garp_master_repeat 1
}
# VRRP实例配置
vrrp_instance VI_1 {
state BACKUP
interface eth0 # 修改为实际网卡名称
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100 # 修改为实际VIP地址
}
}
# 虚拟服务器配置(与Master相同)
virtual_server 192.168.1.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.1.10 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.11 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.12 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
# HTTPS虚拟服务器配置(与Master相同)
virtual_server 192.168.1.100 443 {
delay_loop 6
lb_algo wrr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.1.10 443 {
weight 2
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.11 443 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.12 443 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
2. 真实服务器配置 (服务器3、4、5)
2.1 安装Web服务
# CentOS/RHEL
yum install -y nginx
# Ubuntu/Debian
# apt-get install nginx
# 启动Web服务
systemctl start nginx
systemctl enable nginx
2.2 配置ARP参数
# 配置ARP参数
cat >> /etc/sysctl.conf << EOF
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
EOF
# 应用配置
sysctl -p
2.3 配置VIP到lo接口
# 添加VIP到lo接口
ip addr add 192.168.1.100/32 dev lo
# 创建开机自启动脚本
cat > /etc/rc.local << 'EOF'
#!/bin/bash
# 添加VIP到lo接口
ip addr add 192.168.1.100/32 dev lo
EOF
# 设置执行权限
chmod +x /etc/rc.local
2.4 创建测试页面
# 创建测试页面
echo "Server: $(hostname) - $(date)" > /usr/share/nginx/html/index.html
启动和管理
1. 创建systemd服务
# 在负载均衡器上创建服务文件
cat > /etc/systemd/system/keepalived.service << 'EOF'
[Unit]
Description=Keepalived
After=network.target
[Service]
Type=forking
KillMode=process
PIDFile=/var/run/keepalived.pid
ExecStart=/usr/local/keepalived/sbin/keepalived -D
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
[Install]
WantedBy=multi-user.target
EOF
2. 启动服务
# 重新加载systemd
systemctl daemon-reload
# 启动Keepalived
systemctl start keepalived
# 设置开机自启
systemctl enable keepalived
# 查看状态
systemctl status keepalived
验证和测试
1. 检查VIP绑定
# 在负载均衡器上检查VIP
ip addr show | grep 192.168.1.100
# 在真实服务器上检查VIP
ip addr show lo | grep 192.168.1.100
2. 检查负载均衡
# 查看IPVS规则
ipvsadm -ln
# 查看IPVS统计
ipvsadm -l --stats
# 测试访问
curl -I http://192.168.1.100
# 多次访问查看负载均衡效果
for i in {1..10}; do
echo "请求 $i: $(curl -s http://192.168.1.100)"
done
3. 故障转移测试
3.1 测试主备切换
# 在主负载均衡器上停止Keepalived
systemctl stop keepalived
# 检查备负载均衡器是否接管VIP
ip addr show | grep 192.168.1.100
# 恢复主负载均衡器
systemctl start keepalived
3.2 测试真实服务器故障
# 停止某个真实服务器的Web服务
systemctl stop nginx
# 检查IPVS是否自动剔除该服务器
ipvsadm -ln
# 恢复Web服务
systemctl start nginx
故障排查
1. 查看日志
# 查看Keepalived日志
tail -f /var/log/keepalived/keepalived.log
# 查看systemd日志
journalctl -u keepalived -f
2. 检查配置
# 检查配置文件语法
/usr/local/keepalived/sbin/keepalived -t
# 查看VRRP状态
ip vrrp show
3. 网络连通性测试
# 测试真实服务器连通性
telnet 192.168.1.10 80
telnet 192.168.1.11 80
telnet 192.168.1.12 80
# 测试VRRP协议
tcpdump -i eth0 vrrp
常用命令
Keepalived管理
# 启动服务
systemctl start keepalived
# 停止服务
systemctl stop keepalived
# 重启服务
systemctl restart keepalived
# 查看状态
systemctl status keepalived
# 查看配置
keepalived -t
# 手动启动(调试模式)
/usr/local/keepalived/sbin/keepalived -D -d
IPVS管理
# 查看IPVS规则
ipvsadm -ln
# 查看IPVS统计
ipvsadm -l --stats
# 查看IPVS连接
ipvsadm -l --connection
# 清空IPVS规则
ipvsadm -C
网络管理
# 查看VIP绑定
ip addr show | grep 192.168.1.100
# 查看路由表
ip route show
# 查看ARP表
arp -n
重要说明
安装总结
| 服务器类型 |
需要安装的软件 |
配置内容 |
| 负载均衡器 (2台) |
Keepalived + ipvsadm |
VRRP + LVS + 健康检查 |
| 真实服务器 (3台) |
Web服务 (Nginx/Apache) |
VIP配置 + ARP参数 |
网络要求
- 网段: 所有服务器必须在同一网段 (192.168.1.0/24)
- 连通性: 负载均衡器与真实服务器之间网络连通
- 防火墙: 允许VRRP协议 (112) 和业务端口 (80/443)
- 带宽: 确保网络带宽满足业务需求
配置要点
- VIP管理: VIP只在负载均衡器之间浮动
- 真实服务器: 需要配置VIP到lo接口以响应请求
- 主备配置: 主备负载均衡器配置基本相同,只是优先级不同
- 健康检查: 自动检测服务器状态,剔除故障节点
负载均衡算法
| 算法 |
说明 |
适用场景 |
| rr |
轮询 |
服务器性能相近 |
| wrr |
加权轮询 |
服务器性能不同 |
| lc |
最少连接 |
连接数差异大 |
| wlc |
加权最少连接 |
性能不同且连接数差异大 |
| sh |
源地址哈希 |
需要会话保持 |
| dh |
目标地址哈希 |
缓存服务器 |
扩展建议
- 更多真实服务器: 可以添加更多真实服务器提高处理能力
- 多个VIP: 可以配置多个VIP和端口支持不同服务
- 权重调整: 根据服务器性能调整权重值
- 复杂健康检查: 可以添加HTTP、HTTPS等更复杂的健康检查
- 监控告警: 集成监控系统,及时发现问题
安全建议
- 防火墙配置: 只开放必要的端口
- 认证密码: 使用强密码进行VRRP认证
- 日志监控: 定期检查日志文件
- 备份配置: 定期备份配置文件
这个配置提供了完整的高可用负载均衡解决方案,确保服务的高可用性和可扩展性,适用于生产环境部署。