1. LVS-DR模式核心原理与ARP问题解析
第一次接触LVS-DR模式时,我被它的"三角传输"特性惊艳到了——客户端请求经过负载均衡器,但响应却直接从真实服务器返回客户端。这种设计巧妙避开了性能瓶颈,但随之而来的ARP问题却让我踩了不少坑。
数据包流向全景图 可以这样理解:当客户端访问VIP时,Director Server(调度器)只修改MAC地址就将请求转发给Real Server。这里有个关键细节:Real Server需要在lo接口配置VIP,但必须避免响应VIP的ARP请求。我曾在测试环境忘记配置arp_ignore参数,结果导致整个局域网ARP表紊乱,所有请求在调度器和真实服务器之间乱跳。
ARP问题的本质在于 IP地址冲突 。在DR模式中,调度器和所有真实服务器都有相同的VIP,这违反了网络通信的基本原则。解决方案是通过两个内核参数:
-
arp_ignore=1:只响应目标IP是本机接口IP的ARP请求 -
arp_announce=2:始终使用接口网络的最佳本地地址作为ARP源地址
# Real Server上的关键配置
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
2. 生产环境LVS-DR集群部署实战
去年为某电商大促部署LVS-DR集群时,我们采用了以下架构:
- 调度器:Dell R740xd(双万兆网卡)
- 真实服务器:20台华为2288H V5
- VIP:192.168.10.100
- 会话保持:使用wrr加权轮询算法
关键配置步骤 :
- 调度器配置 :
# 添加VIP
ip addr add 192.168.10.100/32 dev eth0
# 禁用ICMP重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
# 配置IPVS规则
ipvsadm -A -t 192.168.10.100:80 -s wrr
ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.21 -g -w 3
ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.22 -g -w 2
- 真实服务器配置 :
# 在lo接口添加VIP
ip addr add 192.168.10.100/32 dev lo
# 设置ARP参数
sysctl -w net.ipv4.conf.all.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_announce=2
# 添加本地路由
route add -host 192.168.10.100 dev lo
常见踩坑点 :
- 忘记在真实服务器上禁用VIP的ARP响应,导致IP冲突
- 真实服务器的网关错误指向了调度器(应该指向实际网关)
- 没有配置本地路由导致响应包被丢弃
3. Keepalived高可用架构深度优化
单点故障是负载均衡系统的大忌。我们通过Keepalived实现主备切换,但实际部署中发现默认配置有几个隐患:
问题1 :脑裂问题 当主备节点间心跳检测异常时,可能出现双主情况。我们的解决方案:
vrrp_script chk_ipvs {
script "/usr/bin/killall -0 ipvsadm"
interval 2
weight 50
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.100/32 dev eth0
}
track_script {
chk_ipvs
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
}
问题2 :真实服务器健康检查 默认TCP检查不够精准,我们改用HTTP检查:
virtual_server 192.168.10.100 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
protocol TCP
real_server 192.168.10.21 80 {
weight 3
HTTP_GET {
url {
path /health
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
4. 性能调优与故障排查指南
在百万级QPS的场景下,我们总结出以下优化经验:
内核参数调优 :
# 调度器参数
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.core.somaxconn = 32768
# 真实服务器参数
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
IPVS调优技巧 :
-
使用
-b模式处理SYN洪水攻击 -
对于长连接服务,调整
ipvsadm --set tcp tcpfin udp超时参数 -
使用
-p参数实现会话保持
典型故障案例 :
- 现象:客户端偶发连接重置
-
排查:
ipvsadm -lcn发现部分真实服务器SYN_RECV状态堆积 - 原因:真实服务器backlog队列满
-
解决:调整
net.core.somaxconn和net.ipv4.tcp_max_syn_backlog
最后分享一个真实监控案例:某次大促期间,LVS集群突然出现大量TCP重传。通过
tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn'
抓包发现是某个真实服务器的网卡带宽跑满,及时下线该节点后系统恢复稳定。

1258

被折叠的 条评论
为什么被折叠?



