构建高可用 LVS-DR + Keepalived 负载均衡集群实战指南

✅ 一、LVS-DR 模式概述

1.1 工作原理(Direct Routing)

  1. 客户端请求发送到 VIP(虚拟 IP),到达 Director。

  2. Director 修改目标 MAC 地址为 Real Server MAC,IP 地址不变

  3. Real Server 收到请求,通过 lo 接口配置 VIP 处理请求。

  4. Real Server 直接响应客户端,不经过 Director

1.2 DR 模式特点

  • Director 与 Real Server 必须在同一局域网。

  • Real Server 网关不能指向 Director。

  • 响应报文由 Real Server 直接发送给客户端。

  • Real Server 需配置 VIP 到 lo 接口,并抑制 ARP 响应。


🧱 二、LVS-DR 模式部署步骤

2.1 环境规划

角色 IP 地址
Director 192.168.10.150
Real Server1 192.168.10.100
Real Server2 192.168.10.80
VIP 192.168.10.180

2.2 Director 配置步骤

① 系统初始化
复制代码
systemctl stop firewalld
setenforce 0
modprobe ip_vs
yum install -y ipvsadm
② 配置虚拟 IP(VIP)
复制代码
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
---
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
---
ifup ens33:0
③ 内核参数优化
复制代码
vim /etc/sysctl.conf
---
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
---
sysctl -p
④ 配置 LVS 转发规则
复制代码
ipvsadm -C
ipvsadm -A -t 192.168.10.180:80 -s rr
ipvsadm -a -t 192.168.10.180:80 -r 192.168.10.100:80 -g
ipvsadm -a -t 192.168.10.180:80 -r 192.168.10.80:80 -g
ipvsadm -ln

2.3 Real Server 配置步骤

① 配置 VIP 到 lo:0
复制代码
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
---
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
---
ifup lo:0
route add -host 192.168.10.180 dev lo:0
② 抑制 ARP 响应
复制代码
vim /etc/sysctl.conf
---
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
---
sysctl -p
参数 作用
arp_ignore = 1 只响应本接口 IP 的 ARP 请求 防止 Real Server 响应 VIP 的 ARP 请求
arp_announce = 2 不使用非本地接口地址作为 ARP 源 防止 Real Server 主动用 VIP 发起 ARP
③ 安装 Web 服务
复制代码
yum install -y httpd
systemctl start httpd

# RS1
echo "this is 192.168.10.100 web01!" > /var/www/html/index.html

# RS2
echo "this is 192.168.10.80 web02!" > /var/www/html/index.html

2.4 测试验证

等50s后,它可能会转到第二个网页(也有可能转不到)

  • 注意:若启用 persistence_timeout 50,则 50 秒内同一客户端会固定访问同一节点。

📚 三、LVS 面试知识点速览

3.1 三种工作模式对比

模式 原理简述 优缺点
NAT Director 修改目标 IP 并转发 简单但性能瓶颈在 Director
DR 修改目标 MAC,RS 直接响应客户端 性能高,但要求同网段
TUN 封装 IP 隧道,RS 解封后响应 可跨网段,但需支持隧道协议

3.2 常用调度算法

算法 描述
rr 轮询
wrr 加权轮询
lc 最少连接
wlc 加权最少连接
sh 源地址哈希
dh 目标地址哈希

3.3 LVS vs Nginx vs HAProxy

特性 LVS Nginx HAProxy
工作层级 四层 四/七层 四/七层
性能 极高(内核态)
健康检查 依赖 Keepalived 支持 强大
配置复杂度 中等
场景 大规模四层调度 Web 服务、反向代理 专业负载均衡

🔄 四、LVS + Keepalived 高可用方案

4.1 Keepalived 核心功能

  • 基于 VRRP 实现 VIP 漂移

  • 支持 LVS 集群管理

  • 提供健康检查(TCP/HTTP)

  • 实现故障自动切换(Failover)


4.2 脑裂问题与防护

什么是脑裂?

两台节点因心跳中断,同时认为自己是 MASTER,导致 VIP 冲突、服务异常。

常见原因
  • 心跳线故障

  • 防火墙拦截 VRRP

  • 配置不一致(如 virtual_router_id

防护策略
  • 双心跳线冗余

  • 配置仲裁 IP(如网关)

  • 使用磁盘锁或脚本监控

  • 保证防火墙放行 VRRP(多播地址:224.0.0.18)


🧪 五、LVS + Keepalived 部署结构

角色 IP 地址
MASTER 192.168.10.150
BACKUP 192.168.10.160
VIP 192.168.10.180
Web1/Web2 192.168.10.100 /192.168.10.80

DR服务器的配置

复制代码
systemctl stop firewalld
setenforce 0
yum -y install ipvsadm keepalived
modprobe ip_vs
cat /proc/net/ip_vs  # 检查模块

Keepalived 配置示例(MASTER)

复制代码
vim /etc/keepalived/keepalived.conf

global_defs {
    router_id LVS_01        # MASTER 为 LVS_01,BACKUP 为 LVS_02
    smtp_server 127.0.0.1
}

vrrp_instance VI_1 {
    state MASTER            # BACKUP 节点写 BACKUP
    interface ens33
    virtual_router_id 10
    priority 100            # MASTER 高于 BACKUP
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass abc123
    }
    virtual_ipaddress {
        192.168.10.180  # 这里的VIP虚拟地址要改一下
    }
}

virtual_server 192.168.10.180 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    real_server 192.168.10.100 80 {   # 这里的地址要改一下
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.10.80 80 {    # 这里的地址要改一下
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

Keepalived 配置示例(BACKUP)

复制代码
global_defs {
    router_id LVS_02  # 这里改成LVS_02
    smtp_server 127.0.0.1
}

vrrp_instance VI_1 {
    state BACKUP     # 这里改成BACKUP
    interface ens33
    virtual_router_id 10
    priority 80   # 优先级改的要比MASTER要小就可以了  
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass abc123
    }
    virtual_ipaddress {
        192.168.10.180   # IP地址记得改一下
    }
}

virtual_server 192.168.10.180 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    real_server 192.168.10.100 80 {   # 这里的IP地址要改一下
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.10.80 80 {   # 这里的IP地址改一下
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

VIP 配置

复制代码
vim /etc/sysconfig/network-scripts/ifcfg-ens33:0

DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255

重启网络

复制代码
systemctl restart network
ifup ens33:0

启动服务

复制代码
systemctl start keepalived
ip addr  # 查看 VIP 是否生效
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -ln  # 查看 LVS 配置

内核参数优化

复制代码
vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p

配置 Web 节点

当然我这里是按照前面的做的,并没有按照下面的代码做的

复制代码
systemctl stop firewalld
setenforce 0
yum -y install httpd
systemctl start httpd

echo 'this is kgc web!' > /var/www/html/index.html  # 192.168.10.100
echo 'this is benet web!' > /var/www/html/index.html  # 192.168.10.80

vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255

service network restart
ifup lo:0
route add -host 192.168.10.180 dev lo:0

vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p

测试

客户端访问 VIP:http://192.168.10.180/

  • 应轮询显示不同节点页面内容。

等50s后,它可能会转到第二个网页(也有可能转不到)

  • 注意:若启用 persistence_timeout 50,则 50 秒内同一客户端会固定访问同一节点。

停掉 MASTER Keepalived:

systemctl stop keepalived

查询ip

复制代码
ip addr

192.168.10.150

没有发现192.168.10.180这个虚拟IP

192.168.10.160

现在192.168.10.160获得虚拟IP

重启之后

systemctl start keepalived

192.168.10.150重新获得IP地址

✅ 六、总结与建议

  • LVS-DR 是性能最优的四层负载均衡方式。

  • Keepalived 提供高可用保障,避免单点故障。

  • 注意 ARP 抑制、VIP 配置、脑裂防护、防火墙设置

  • 健康检查和日志监控是生产环境必不可少的部分。

相关推荐
IT成长日记2 小时前
【LVS入门宝典】LVS-TUN模式原理与配置:跨越网络界限的负载均衡解决方案
linux·网络·负载均衡·lvs·tun
Yyyy4823 小时前
LVS -DR模式
lvs
Empty_7773 小时前
Nginx反向代理与缓存功能
运维·nginx·缓存
IT成长日记3 小时前
【LVS入门宝典】LVS-TUN模式配置实战以及配置关键点:Real Server的路由表调整、ipip模块加载
linux·运维·服务器·lvs·tun
有谁看见我的剑了?3 小时前
LVS虚拟调度器学习
学习·lvs
wanhengidc3 小时前
云手机能否稳定的运行传奇游戏
运维·服务器·安全·游戏·智能手机
3分云计算3 小时前
Prometheus-02: 安装部署与配置管理详解
运维·云原生·grafana·普罗米修斯
x-cmd3 小时前
[x-cmd] x-cmd 对 Xonsh 的支持
linux·运维·服务器·终端·命令行
打不了嗝 ᥬ᭄3 小时前
【Linux】网络基础
linux·运维·网络