构建高可用 LVS-DR + Keepalived 负载均衡集群实战指南
✅ 一、LVS-DR 模式概述
1.1 工作原理(Direct Routing)
-
客户端请求发送到 VIP(虚拟 IP),到达 Director。
-
Director 修改目标 MAC 地址为 Real Server MAC,IP 地址不变。
-
Real Server 收到请求,通过
lo
接口配置 VIP 处理请求。 -
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 测试验证
-
浏览器访问:http://192.168.10.180
-
应轮询显示不同节点页面内容。
等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.confglobal_defs {router_id LVS_01 # MASTER 为 LVS_01,BACKUP 为 LVS_02smtp_server 127.0.0.1
}vrrp_instance VI_1 {state MASTER # BACKUP 节点写 BACKUPinterface ens33virtual_router_id 10priority 100 # MASTER 高于 BACKUPadvert_int 1authentication {auth_type PASSauth_pass abc123}virtual_ipaddress {192.168.10.180 # 这里的VIP虚拟地址要改一下}
}virtual_server 192.168.10.180 80 {delay_loop 6lb_algo rrlb_kind DRpersistence_timeout 50protocol TCPreal_server 192.168.10.100 80 { # 这里的地址要改一下weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}real_server 192.168.10.80 80 { # 这里的地址要改一下weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}
}
Keepalived 配置示例(BACKUP)
global_defs {router_id LVS_02 # 这里改成LVS_02smtp_server 127.0.0.1
}vrrp_instance VI_1 {state BACKUP # 这里改成BACKUPinterface ens33virtual_router_id 10priority 80 # 优先级改的要比MASTER要小就可以了 advert_int 1authentication {auth_type PASSauth_pass abc123}virtual_ipaddress {192.168.10.180 # IP地址记得改一下}
}virtual_server 192.168.10.180 80 {delay_loop 6lb_algo rrlb_kind DRpersistence_timeout 50protocol TCPreal_server 192.168.10.100 80 { # 这里的IP地址要改一下weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}real_server 192.168.10.80 80 { # 这里的IP地址改一下weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}
}
VIP 配置
vim /etc/sysconfig/network-scripts/ifcfg-ens33:0DEVICE=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 httpdecho '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.80vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255service network restart
ifup lo:0
route add -host 192.168.10.180 dev lo:0vim /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 配置、脑裂防护、防火墙设置。
-
健康检查和日志监控是生产环境必不可少的部分。