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 分离 → 故障域隔离
  • 所有组件都有冗余 → 任意一台宕机,服务不中断

image

 

 

一、网络与 VIP 规划

VIP用途绑定位置
192.168.1.100 Web 入口(HTTP/HTTPS) Keepalived 的 VI_WEB 实例
192.168.1.101 数据库入口(MySQL) Keepalived 的 VI_DB 实例

💡 客户端只访问这两个 VIP,不直接连真实 IP!

二、整体流量路径(DR 模式)

 

image

 ✅ 所有流量由 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 秒内完成,用户可能只感受到短暂卡顿。

✅ 五、最佳实践建议

  1. 监控告警:用 Prometheus + Grafana 监控 VIP 状态、后端健康度。
  2. 日志集中:ELK 收集 Keepalived/Nginx/MySQL 日志。
  3. 定期演练:每月模拟一次“关机”测试高可用。
  4. 安全加固:
    • 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),内核会:

  1. 查路由表 → 发现 192.168.1.100 在 lo 上
  2. 交给上层协议栈 → Nginx 监听 *:80,就能正常处理!

 

 

上面信息,由千问生成.

 

posted @ 2025-12-16 10:41  与f  阅读(2)  评论(0)    收藏  举报