Keepalive实现一个高可用负载均衡场景
6台服务器(2台Keepalived,2台Nginx,2台MySQL),完全可以构建一个高可用(HA)系统。
🖥️ 6 台服务器角色分配(推荐)
| 服务器 | 角色 | 说明 |
|---|---|---|
| Server A / B | Keepalived + LVS 调度器 | 只跑 keepalived,不跑业务,专注 VIP 漂移和负载均衡调度 |
| Server C / D | Nginx + Tomcat(或仅 Nginx) | Web 接入层,反向代理到后端应用(Tomcat 可部署在同机或另集群) |
| Server E / F | MySQL 主主复制(或 MGR/InnoDB Cluster) | 数据库高可用,避免单点 |
关键原则:
- Keepalived 不跑业务 → 避免资源竞争,提高稳定性
- Nginx 和 MySQL 分离 → 故障域隔离
- 所有组件都有冗余 → 任意一台宕机,服务不中断
一、网络与 VIP 规划
| VIP | 用途 | 绑定位置 |
|---|---|---|
192.168.1.100 |
Web 入口(HTTP/HTTPS) | Keepalived 的 VI_WEB 实例 |
192.168.1.101 |
数据库入口(MySQL) | Keepalived 的 VI_DB 实例 |
💡 客户端只访问这两个 VIP,不直接连真实 IP!
二、整体流量路径(DR 模式)

✅ 所有流量由 Keepalived 调度,但响应直通(DR 模式),性能极高。
⚙️ 三、详细配置步骤
步骤 1:配置 Keepalived(Server A & B)
/etc/keepalived/keepalived.conf
global_defs { router_id LVS_HA } # === Web VIP (192.168.1.100) === vrrp_instance VI_WEB { state MASTER # B 机设为 BACKUP interface eth0 virtual_router_id 51 priority 100 # B 机设为 90 advert_int 1 authentication { auth_type PASS; auth_pass web123; } virtual_ipaddress { 192.168.1.100/24 } } # === DB VIP (192.168.1.101) === vrrp_instance VI_DB { state MASTER interface eth0 virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS; auth_pass db123; } virtual_ipaddress { 192.168.1.101/24 } } # === 虚拟服务器:Web 流量 === virtual_server 192.168.1.100 80 { delay_loop 3 lb_algo rr lb_kind DR protocol TCP real_server 192.168.1.10 80 { # Nginx C weight 1 TCP_CHECK { connect_timeout 3; } } real_server 192.168.1.11 80 { # Nginx D weight 1 TCP_CHECK { connect_timeout 3; } } } # === 虚拟服务器:DB 流量 === virtual_server 192.168.1.101 3306 { delay_loop 5 lb_algo rr lb_kind DR protocol TCP real_server 192.168.1.20 3306 { # MySQL E weight 1 # 自带检测 TCP_CHECK { connect_timeout 3; } # 也可以使用脚本(二选一) MISC_CHECK { misc_path "/etc/keepalived/check_multi_port.sh 192.168.1.20" misc_timeout 5 } } real_server 192.168.1.21 3306 { # MySQL F weight 1 # 自带检测 TCP_CHECK { connect_timeout 3; } # 也可以使用脚本(二选一) MISC_CHECK { misc_path "/etc/keepalived/check_multi_port.sh 192.168.1.21" misc_timeout 5 } } }
附健康检查脚本 /etc/keepalived/check_multi_port.sh
#!/bin/bash # 检查某台服务器的多个端口是否都通 HOST=$1 PORTS=("80" "3306" "53") # 你要监控的端口列表 for PORT in "${PORTS[@]}"; do if ! timeout 2 bash -c "</dev/tcp/$HOST/$PORT" >/dev/null 2>&1; then echo "Port $PORT on $HOST is DOWN" exit 1 fi done echo "All ports OK on $HOST" exit 0
赋予执行权限: chmod +x /etc/keepalived/check_multi_port.sh
步骤 2:配置 Nginx 服务器(Server C & D)
关键:启用健康检查 + 绑定 VIP(DR 模式要求)
# 1. 在 C/D 上绑定 VIP 到 lo 环回接口(抑制 ARP) cat > /etc/sysconfig/network-scripts/ifcfg-lo:0 <<EOF DEVICE=lo:0 IPADDR=192.168.1.100 NETMASK=255.255.255.255 ONBOOT=yes EOF # 2. 抑制 ARP(防止广播冲突) echo 'net.ipv4.conf.all.arp_ignore = 1' >> /etc/sysctl.conf echo 'net.ipv4.conf.all.arp_announce = 2' >> /etc/sysctl.conf sysctl -p # 3. Nginx 配置(/etc/nginx/conf.d/app.conf) upstream backend { server 10.0.0.100:8080; # 你的 Tomcat 集群 server 10.0.0.101:8080; # Nginx 自动剔除故障节点 } server { listen 80; location / { proxy_pass http://backend; } }
✅ Nginx 自己负责 Tomcat 健康检查,无需 Keepalived 管!
步骤 3:配置 MySQL 高可用(Server E & F)
推荐:主主复制(Master-Master) + 半同步
-- 在 E 和 F 上分别配置(略,需设置 server-id、binlog 等) -- 关键参数: log-slave-updates auto-increment-increment = 2 auto-increment-offset = 1 # E 用 1, F 用 2 rpl_semi_sync_master_enabled = 1
同样,在 E/F 上绑定 DB 的 VIP:
ip addr add 192.168.1.101/32 dev lo # 并配置 ARP 抑制(同 Nginx 步骤)
💡 应用连接数据库时,只连 192.168.1.101:3306,写操作会自动路由到当前主库(需配合中间件或应用逻辑处理冲突)。
每个真实的节点服务器为什么都必须在回环地址lo上配置器VIP,下面会说
🛡️ 四、故障场景测试(确保高可用生效)
| 故障 | 系统行为 |
|---|---|
| Nginx C 宕机 | Keepalived 检测到 80 端口不通 → 剔除 C,流量全走 D |
| MySQL E 宕机 | Keepalived 剔除 E,流量全走 F;F 自动接管写 |
| Keepalived A 宕机 | B 自动接管 VIP(192.168.1.100/101),服务无中断 |
| Tomcat 节点挂 | Nginx 自动剔除,不影响 Keepalived 层 |
✅ 所有切换在 3~10 秒内完成,用户可能只感受到短暂卡顿。
✅ 五、最佳实践建议
- 监控告警:用 Prometheus + Grafana 监控 VIP 状态、后端健康度。
- 日志集中:ELK 收集 Keepalived/Nginx/MySQL 日志。
- 定期演练:每月模拟一次“关机”测试高可用。
- 安全加固:
- Keepalived 之间通信加防火墙规则(只允许多播/VRRP)
- MySQL 设置强密码 + 白名单
最终效果
- 用户访问
http://192.168.1.100→ 高可用 Web 服务 ✅ - 应用连接
192.168.1.101:3306→ 高可用数据库 ✅ - 任意一台服务器宕机,业务不受影响 ✅
------
疑问:那Keepalived 已经知道真实地址,比如192.168.1.100,对应的是192.168.1.10,和192.168.1.11, 请求来了,keepalived 转发到真实地址就行了,为什么上面步骤二,还要给两个nginx服务器,设置vip 呢?
简短回答:
这个问题问到了 LVS(Linux Virtual Server)DR 模式的核心机制!非常关键。
因为 DR 模式下,Keepalived(LVS)只改 MAC 地址,不改 IP 地址。
所以数据包到达 Nginx 时,目标 IP 仍然是 VIP(192.168.1.100),
如果 Nginx 本机不认识这个 IP,就会直接丢弃这个包!
因此,必须让 Nginx “认识” VIP,才能接收并处理它。
解决方案:让 Nginx “拥有” VIP
通过在 lo 上绑定 192.168.1.100/32,告诉内核:
“虽然我的 eth0 是 192.168.1.10,但我也可以接收发给 192.168.1.100 的包!”
这样,当数据包到达(目标 IP = 192.168.1.100),内核会:
- 查路由表 → 发现
192.168.1.100在lo上 - 交给上层协议栈 → Nginx 监听
*:80,就能正常处理!
上面信息,由千问生成.


浙公网安备 33010602011771号