






















6台服务器(2台Keepalived,2台Nginx,2台MySQL),完全可以构建一个高可用(HA)系统。
| 服务器 | 角色 | 说明 |
|---|---|---|
关键原则:
- Keepalived 不跑业务 → 避免资源竞争,提高稳定性
- Nginx 和 MySQL 分离 → 故障域隔离
- 所有组件都有冗余 → 任意一台宕机,服务不中断
| VIP | 用途 | 绑定位置 |
|---|---|---|
💡 客户端只访问这两个 VIP,不直接连真实 IP!

✅ 所有流量由 Keepalived 调度,但响应直通(DR 模式),性能极高。
/etc/keepalived/keepalived.confglobal_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
# 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 管!
-- 在 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
ip addr add 192.168.1.101/32 dev lo # 并配置 ARP 抑制(同 Nginx 步骤)
💡 应用连接数据库时,只连 192.168.1.101:3306,写操作会自动路由到当前主库(需配合中间件或应用逻辑处理冲突)。
每个真实的节点服务器为什么都必须在回环地址lo上配置器VIP,下面会说
| 故障 | 系统行为 |
|---|---|
✅ 所有切换在 3~10 秒内完成,用户可能只感受到短暂卡顿。
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,才能接收并处理它。
通过在 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 上*:80,就能正常处理!上面信息,由千问生成.
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。