1. 项目概述:LVS、VRRP与ECMP不是“三选一”,而是三层协同的网络底座
你看到这个标题,第一反应可能是:“这仨词怎么凑一块儿了?”——别急,这不是拼凑,而是真实生产环境中每天都在发生的底层协作。LVS(Linux Virtual Server)是应用层流量调度的“指挥官”,VRRP(Virtual Router Redundancy Protocol)是网关高可用的“守门人”,ECMP(Equal-Cost Multi-Path)则是核心路由层的“多车道调度员”。它们分属OSI模型的不同层级:LVS工作在传输层(L4)甚至应用层(L7),VRRP运行在网络层(L3)控制虚拟IP漂移,ECMP则依赖于底层路由协议(如BGP/OSPF)在多个等价路径间做哈希分发。三者一旦配置不当或边界不清,轻则会话中断、连接复位,重则出现“黑洞流量”——请求发出去了,响应永远回不来;或者“会话撕裂”——同一个TCP流被ECMP打散到不同后端,LVS状态表完全失序。
我最早在某高校数据中心做负载均衡架构升级时踩过这个坑:当时把LVS DR模式和VRRP主备网关配在一起,又在上行核心交换机启用了ECMP,结果压测时QPS刚过8000,用户就开始报“偶发性登录失败”。抓包一看,SYN包走A路径,SYN-ACK却被ECMP甩到B路径,而B路径上的LVS节点根本没有这条连接的状态记录,直接RST掉。后来花了整整三天时间,一层层剥离验证,才定位到问题根源不在LVS规则本身,而在VRRP通告周期与ECMP哈希算法对源端口变化的敏感性之间存在隐性冲突。所以这篇内容不是讲“怎么分别配置这三个技术”,而是聚焦一个更关键的问题:当它们共存于同一张网络平面时,哪些参数必须对齐?哪些行为必须规避?哪些日志要看?哪些链路要隔离?它适合正在设计高并发Web平台、微服务网关、CDN边缘集群或私有云LB架构的运维工程师、SRE和网络架构师参考,尤其适合那些已经能独立部署单个组件,但一整合就出问题的中级从业者。你不需要精通BGP协议细节,但得清楚ECMP哈希字段改一个字节,LVS连接跟踪表就会多出多少条无效条目。
2. 核心设计逻辑拆解:为什么不能“各干各的”?
2.1 LVS的本质是“状态代理”,不是无状态转发
很多人误以为LVS就是个高级版iptables DNAT,其实不然。以最常用的DR(Direct Routing)模式为例,它要求所有Real Server(RS)和Director(LVS主节点)在同一个二层广播域内,且RS需禁用ARP响应(arp_ignore=1, arp_announce=2),靠Director将VIP的MAC地址广播出去,让客户端流量先抵达Director,再由Director改写目标MAC发给RS。这个过程看似无状态,实则高度依赖连接跟踪(conntrack)。Director必须维护一张完整的连接状态表,记录每个TCP四元组(源IP:源端口→目的IP:目的端口)对应哪个RS。当客户端发起新连接时,LVS根据调度算法(如wrr、lc)选择RS,并在conntrack表中创建新条目;后续该连接的所有数据包,都靠conntrack查表转发,不重新调度。这意味着:LVS的可靠性锚点是“连接状态的一致性”。一旦这个状态表在多个节点间不同步,或者被外部设备(如ECMP)无意破坏,整个负载均衡逻辑就崩了。
提示:LVS的ip_vs模块默认启用conntrack,但你可以通过
ipvsadm -Lnc实时查看当前连接数。我建议在生产环境监控中单独采集这个指标,而不是只看CPU或带宽——很多“性能瓶颈”其实是conntrack表溢出导致的连接拒绝(error: No buffer space available)。
2.2 VRRP解决的是“单点网关失效”,但引入了“虚拟IP漂移窗口”
VRRP的核心价值在于消除网关单点故障。两台路由器(Master/Backup)共享一个虚拟IP(VIP)和虚拟MAC,客户端默认网关指向该VIP。Master定期发送Advertisement报文,Backup监听;一旦Backup在3个Advertisement间隔(默认1秒×3=3秒)内没收到报文,就接管VIP并发送免费ARP宣告。这个机制很成熟,但有两个常被忽视的细节:
第一,VIP漂移不是原子操作。从Master宕机到Backup完成ARP宣告,中间存在毫秒级“黑洞期”。在此期间,客户端发出的ARP请求可能得不到响应,新连接建立失败。虽然对HTTP短连接影响不大,但对长连接(如WebSocket、数据库连接池)就是致命的。
第二,VRRP自身不感知上层业务状态。Backup只知道Master心跳停了,但不知道Master是因为CPU满载、内存OOM还是单纯网卡断了。它只会无条件接管,哪怕接管后自己也扛不住流量。这就要求VRRP必须和LVS的健康检查联动——比如用keepalived同时管理VRRP实例和LVS服务,当LVS检测到某个RS全部宕机时,主动降低本机VRRP优先级,触发切换,而不是等Master彻底死机。
2.3 ECMP是“无状态分流”,但它的哈希算法会撕裂LVS依赖的“连接上下文”
ECMP的原理很简单:当路由表中存在多条到达同一目的前缀(如10.10.0.0/16)的等价路径(metric相同)时,交换机/路由器根据预设哈希算法(如基于源IP+目的IP+源端口+目的端口+协议号)计算哈希值,将不同流分配到不同下一跳。注意关键词:“不同流”。ECMP的设计哲学是“流粒度均衡”,而非“包粒度均衡”。一个TCP连接的所有包,只要五元组不变,哈希值就固定,必然走同一条路径。问题来了:如果客户端是NAT后的集群(如K8s NodePort Service),大量客户端共用同一个出口IP,那么源IP相同,源端口又由内核随机分配(ephemeral port range),此时ECMP哈希结果就极度依赖源端口。而Linux内核分配源端口是递增的,相邻连接的源端口往往只差1,哈希值却可能落在完全不同桶里——结果就是,本该由同一台LVS节点处理的几十个连接,被ECMP强行打散到3台LVS节点上。每台LVS节点只看到其中一部分连接,conntrack表碎片化,LVS的会话保持(persistence)功能彻底失效。
注意:ECMP哈希算法不可配置(硬件交换机固件决定),但你可以通过调整LVS调度策略来适配。比如放弃wrr,改用sh(source hash),强制同一源IP的连接始终落到同一RS,至少保证RS侧状态一致。但这治标不治本,因为LVS节点间的conntrack依然不同步。
3. 关键参数与配置对齐要点:五个必须检查的生死线
3.1 LVS Director的ARP行为必须与VRRP VIP严格隔离
这是最容易被忽略,也是最致命的一点。LVS DR模式下,Director需要响应VIP的ARP请求,否则客户端根本找不到VIP的MAC地址。但VRRP也在广播VIP的虚拟MAC。如果Director和VRRP Master不是同一台机器(常见于LVS+VRRP分离部署),就会出现“双VIP响应”:客户端ARP缓存里VIP对应两个不同MAC,导致流量随机发往Director或VRRP Master,后者根本不会转发LVS流量,直接丢弃。解决方案只有两个:
方案A(推荐):LVS Director即VRRP Master。用keepalived同时启动VRRP实例和LVS服务,确保VIP、虚拟MAC、LVS转发逻辑三位一体。配置示例:
# /etc/keepalived/keepalived.conf 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.1.100/24 dev eth0 label eth0:1 # VIP } } virtual_server 192.168.1.100 80 { delay_loop 6 lb_algo wrr lb_kind DR protocol TCP real_server 192.168.1.10 80 { weight 1 TCP_CHECK { connect_timeout 3 } } }方案B:禁用Director的VIP ARP响应,仅靠VRRP广播。需在Director上执行:
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce # 并确保VIP绑定在lo接口而非eth0 ip addr add 192.168.1.100/32 dev lo实操心得:我曾在线上环境误用方案B,但忘了把VIP绑定到lo,而是绑在了eth0:1子接口,结果arp_ignore没生效,依然双响应。排查方法是:在客户端执行
arp -a | grep 192.168.1.100,看MAC地址是否唯一;再在Director和VRRP Backup上同时抓包tcpdump -i eth0 arp host 192.168.1.100,确认只有Master在应答。
3.2 VRRP通告间隔(advert_int)必须大于LVS健康检查超时(connect_timeout)的3倍
keepalived的VRRP和LVS健康检查是两个独立进程,但它们的定时器必须错开,否则会引发“假切换”。假设LVS健康检查设置connect_timeout 2(2秒超时),retry 3(重试3次),那么一次完整检查最长耗时6秒。如果VRRP的advert_int也设为2秒,那么当LVS检查因网络抖动延迟1秒时,Backup可能在第3次未收到Advertisement(2×3=6秒)时触发切换,而此时Master其实只是慢了1秒,正准备发第4个Advertisement。结果就是:Master和Backup同时认为自己是Master,VIP冲突,网络震荡。安全公式是:
advert_int ≥ connect_timeout × (retry + 1)
例如,connect_timeout 3,retry 2→ 最大检查耗时9秒 →advert_int至少设为4秒(取整,且需≥3×3=9秒的1/3)。我在线上统一设为advert_int 5,connect_timeout 3,retry 2,delay_loop 6,经受住了连续72小时的网络模拟丢包测试。
3.3 ECMP哈希种子(Hash Seed)必须在所有参与ECMP的设备上全局一致
ECMP的哈希算法不是标准,不同厂商实现不同。但核心是:哈希函数输入相同,输出必须相同,否则同一五元组在不同设备上算出不同路径,流量乱窜。华为交换机叫hash-key,思科叫ecmp hash,Linux内核叫fib_multipath_hash_policy。最关键的是哈希种子(seed)。很多设备默认使用随机seed,每次重启重置,导致哈希结果漂移。必须手动固化。例如,在Linux核心路由设备上:
# 查看当前seed cat /proc/sys/net/ipv4/fib_multipath_hash_policy # 设置为固定seed(0表示使用固定值,非0为随机) echo 0 > /proc/sys/net/ipv4/fib_multipath_hash_policy # 但更关键的是设置seed值本身(需内核支持CONFIG_IP_ROUTE_MULTIPATH_HASH) # 若不支持,则需升级内核或改用其他哈希策略在交换机上,需登录CLI执行类似命令:
# 华为 sys interface vlanif 100 hash-key ipv4 source-ip destination-ip source-port destination-port protocol # # 思科 configure terminal ip cef load-sharing algorithm include-ports ipv4提示:验证方法是在客户端用
hping3发固定五元组包,观察不同时间点的路径是否稳定。命令:hping3 -S -p 80 -a 192.168.1.50 192.168.1.100 --flood,然后在各LVS节点上tcpdump -i any port 80 and src host 192.168.1.50,看流量是否始终只出现在一台节点上。
3.4 LVS的超时参数必须覆盖ECMP和VRRP的最大故障窗口
LVS conntrack表有三个关键超时:tcp_timeout_established(已建立连接)、tcp_timeout_close_wait(关闭等待)、tcp_timeout_fin_wait(FIN等待)。默认值分别是1200秒、120秒、120秒。但ECMP故障收敛通常在毫秒级(BGP fast fallover约50ms),VRRP切换在3秒内,而LVS的1200秒意味着:如果某RS宕机,LVS不会立即踢掉它,而是等1200秒后conntrack老化才清理。这期间所有发往该RS的包都会RST。必须缩短。我的线上配置是:
# 缩短established超时,加速故障感知 echo 300 > /proc/sys/net/ipv4/vs/tcp_timeout_established echo 30 > /proc/sys/net/ipv4/vs/tcp_timeout_close_wait echo 30 > /proc/sys/net/ipv4/vs/tcp_timeout_fin_wait # 同时,LVS健康检查的retry必须足够激进 # keepalived中real_server段: TCP_CHECK { connect_timeout 1 # 1秒超时 nb_get_retry 3 # 3次重试 delay_before_retry 1 # 重试间隔1秒 }这样,从RS宕机到LVS踢出,理论最大耗时 = 1+1+1+1 = 4秒,远小于默认的1200秒。
3.5 网络路径必须物理隔离:LVS南北向与东西向流量走不同链路
这是架构层面的硬性要求。所谓“南北向”指客户端到LVS的流量(Client→LVS→RS),“东西向”指LVS节点之间的同步流量(如keepalived VRRP心跳、LVS状态同步)。如果这两类流量共享同一物理链路(如都走10G上联口),当南北向突发大流量(如DDoS攻击)时,会挤占东西向带宽,导致VRRP心跳丢包,Backup误判Master死亡,触发不必要的VIP切换。解决方案是:
- 物理分离:为LVS节点配置双网卡,eth0接业务网(南北向),eth1接心跳网(东西向),心跳网用独立交换机或直连线缆。
- 逻辑分离:若只能单网卡,则用VLAN隔离,eth0.100跑业务,eth0.200跑心跳,并在交换机上为心跳VLAN配置高优先级QoS。
- 心跳保活:在keepalived中启用
vrrp_sync_group和notify_master/notify_backup脚本,当角色切换时,自动在心跳网卡上发ICMP探测,确认链路可达。
我见过最惨的案例:某电商大促期间,LVS节点因南北向流量打满10G口,导致VRRP心跳包平均延迟飙升至800ms,Backup连续3次未收到,触发VIP漂移。而漂移后新Master同样面临相同问题,形成“漂移风暴”,持续17分钟。事后加装独立心跳网卡,问题根除。
4. 实操全流程与关键环节实现:从零搭建高可靠LVS+VRRP+ECMP集群
4.1 环境准备与基础服务安装(以CentOS 7为例)
我们构建一个最小可行集群:2台LVS Director(lvs1/lvs2),2台Real Server(rs1/rs2),1台核心交换机(模拟ECMP),1台客户端。所有节点OS为CentOS 7.9,内核版本3.10.0-1160.el7.x86_64(确保支持ip_vs模块)。
第一步:确认内核模块可用
在lvs1和lvs2上执行:
modprobe ip_vs modprobe ip_vs_rr modprobe ip_vs_wrr modprobe ip_vs_sh lsmod | grep ip_vs # 应输出:ip_vs_sh 12688 0, ip_vs_wrr 12697 0, ip_vs_rr 12600 0, ip_vs 145497 6 ip_vs_sh,ip_vs_wrr,ip_vs_rr,...若报错“Module not found”,需安装kernel-devel并重新编译,或升级内核。
第二步:安装keepalived与ipvsadm
yum install -y keepalived ipvsadm systemctl enable keepalived # 关闭firewalld(生产环境需精细放行端口,此处为简化) systemctl stop firewalld && systemctl disable firewalld # 关闭SELinux setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config第三步:配置网络基础
- lvs1 IP:192.168.1.10/24,VIP:192.168.1.100/24(绑定在eth0:1)
- lvs2 IP:192.168.1.11/24,VIP:192.168.1.100/24(绑定在eth0:1)
- rs1 IP:192.168.1.20/24,lo:0绑定VIP 192.168.1.100/32
- rs2 IP:192.168.1.21/24,lo:0绑定VIP 192.168.1.100/32
- 核心交换机:配置两条等价静态路由到192.168.1.0/24,下一跳分别为192.168.1.10和192.168.1.11
注意:RS的VIP必须绑定在lo接口,且需配置ARP抑制:
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
4.2 keepalived主配置详解(lvs1作为Master)
配置文件/etc/keepalived/keepalived.conf是核心。我们按模块拆解:
全局定义(global_defs):定义邮件通知(可选),router_id必须全网唯一。
global_defs { router_id LVS_DEVEL notification_email { admin@example.com } notification_email_from keepalived@example.com smtp_server 127.0.0.1 smtp_connect_timeout 30 }VRRP实例(vrrp_instance):定义VIP漂移逻辑。
vrrp_instance VI_1 { state MASTER # lvs1设MASTER,lvs2设BACKUP interface eth0 # 绑定物理接口 virtual_router_id 51 # 同一VRRP组ID必须相同 priority 100 # lvs1优先级100,lvs2设90 advert_int 5 # 通告间隔5秒,大于健康检查总耗时 authentication { auth_type PASS auth_pass 1111 # 密码必须一致 } virtual_ipaddress { 192.168.1.100/24 dev eth0 label eth0:1 # VIP绑定 } # 关键:启用nopreempt,避免脑裂 nopreempt # 心跳失败时执行脚本,探测链路 notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" }LVS虚拟服务(virtual_server):定义负载均衡规则。
virtual_server 192.168.1.100 80 { delay_loop 6 # 每6秒检查一次RS健康 lb_algo wrr # 加权轮询 lb_kind DR # 直接路由模式 nat_mask 255.255.255.0 # DR模式必需 persistence_timeout 1800 # 会话保持30分钟(按需调整) protocol TCP real_server 192.168.1.20 80 { weight 1 TCP_CHECK { connect_timeout 1 # 连接超时1秒 nb_get_retry 3 # 重试3次 delay_before_retry 1 # 重试间隔1秒 connect_port 80 # 检查端口 } } real_server 192.168.1.21 80 { weight 1 TCP_CHECK { connect_timeout 1 nb_get_retry 3 delay_before_retry 1 connect_port 80 } } }第四步:编写通知脚本/etc/keepalived/notify.sh
此脚本在角色切换时执行,用于发送告警和探测心跳链路:
#!/bin/bash # /etc/keepalived/notify.sh case "$1" in master) echo "Became MASTER at $(date)" >> /var/log/keepalived.log # 探测心跳网卡(假设eth1是心跳口) ping -c 3 -W 1 192.168.2.2 &>/dev/null && echo "Heartbeat OK" || echo "Heartbeat FAIL" >> /var/log/keepalived.log ;; backup) echo "Became BACKUP at $(date)" >> /var/log/keepalived.log ;; fault) echo "State FAULT at $(date)" >> /var/log/keepalived.log ;; esac赋予执行权限:chmod +x /etc/keepalived/notify.sh。
4.3 ECMP交换机侧配置与验证
由于无法访问真实交换机CLI,我们用Linux主机模拟ECMP行为。在核心交换机(假设IP 192.168.1.254)上执行:
# 添加两条等价静态路由 ip route add 192.168.1.0/24 via 192.168.1.10 ip route add 192.168.1.0/24 via 192.168.1.11 # 查看路由表,确认ECMP生效 ip route show 192.168.1.0/24 # 输出应包含:192.168.1.0/24 via 192.168.1.10 dev eth0, 192.168.1.0/24 via 192.168.1.11 dev eth0验证ECMP哈希一致性:
在客户端(192.168.1.50)上,用hping3发100个固定五元组包:
for i in {1..100}; do hping3 -S -p 80 -a 192.168.1.50 192.168.1.100 -c 1 --flood; done在lvs1和lvs2上分别执行:
# lvs1上 tcpdump -i eth0 port 80 and src host 192.168.1.50 -c 50 -w lvs1.pcap # lvs2上 tcpdump -i eth0 port 80 and src host 192.168.1.50 -c 50 -w lvs2.pcap然后用Wireshark打开pcap,统计每个文件中SYN包数量。理想情况是:lvs1有约50个,lvs2有约50个,比例接近1:1。若一边为0,说明ECMP未生效或哈希不均。
4.4 健康检查与故障注入测试
真正的可靠性来自测试。我们模拟三类故障:
故障1:RS宕机
在rs1上执行systemctl stop httpd,观察keepalived日志:
tail -f /var/log/messages | grep "Real server.*down" # 应看到:Removing service [192.168.1.20]:80 from VS [192.168.1.100]:80 # 30秒后(delay_loop×5),流量应100%切到rs2故障2:LVS Master宕机
在lvs1上执行systemctl stop keepalived,观察lvs2日志:
# lvs2上应看到:VRRP_Instance(VI_1) Transition to MASTER STATE # 并执行notify_master脚本 # 客户端ping VIP应持续,无丢包故障3:ECMP链路抖动
在核心交换机上,临时删除一条路由:
ip route del 192.168.1.0/24 via 192.168.1.10 # 观察LVS流量是否自动收敛到剩余路径(lvs2) # 30秒后恢复:ip route add 192.168.1.0/24 via 192.168.1.10实操心得:我习惯在测试时开启
ipvsadm -Lnc --stats实时监控,重点关注ActiveConn(活跃连接)和InActConn(非活跃连接)比值。健康状态下,ActiveConn应占80%以上;若InActConn持续增长,说明RS响应慢或网络延迟高。
5. 常见问题与排查技巧实录:那些文档里不会写的坑
5.1 问题速查表:症状、原因、解决步骤
| 症状 | 可能原因 | 排查与解决步骤 |
|---|---|---|
| 客户端无法访问VIP | 1. Director未响应VIP ARP 2. RS未配置ARP抑制 3. 防火墙拦截 | 1.arping -I eth0 192.168.1.100,看是否收到响应2. cat /proc/sys/net/ipv4/conf/all/arp_ignore,确认为13. iptables -L -n | grep 80,清空规则测试 |
| VIP频繁漂移(flapping) | 1. VRRP advert_int过小 2. 心跳链路丢包 3. 系统负载过高导致定时器延迟 | 1.tcpdump -i eth0 vrrp,看Advertisement间隔是否稳定2. ping -c 10 192.168.1.11(从lvs1 ping lvs2)3. top看load average是否>10 |
| 连接建立成功但立即断开(RST) | 1. ECMP将SYN和SYN-ACK打散到不同LVS节点 2. RS未监听VIP端口 3. LVS未启用DR模式 | 1. 在lvs1/lvs2上tcpdump -i any port 80 and tcp[tcpflags] & (tcp-syn|tcp-ack) != 0,对比SYN和ACK来源2. netstat -tlnp | grep :80,确认RS有httpd监听3. ipvsadm -Ln,看Flags是否含DR |
| LVS节点CPU飙升 | 1. conntrack表溢出 2. 健康检查过于频繁 3. iptables规则过多 | 1.conntrack -C,看是否接近/proc/sys/net/nf_conntrack_max2. watch -n1 'ps aux | grep check',确认检查进程数3. iptables -t mangle -L -n | wc -l,规则超100条需优化 |
| 会话保持失效(同一IP访问不同RS) | 1. LVS调度算法非sh 2. ECMP哈希字段包含端口,而客户端端口随机 3. persistence_timeout过短 | 1.ipvsadm -Ln,看Scheduler是否为sh2. hping3 -S -p 8080 ...固定端口测试3. echo 7200 > /proc/sys/net/ipv4/vs/tcp_timeout_established |
5.2 独家避坑技巧:来自三年线上踩坑总结
技巧1:用ipvsadm -Ln --stats替代-Lnc看实时压力-Lnc只显示连接数,而--stats显示字节数、包数、错误数。我曾发现一个诡异问题:-Lnc显示连接数正常,但--stats里OutPkts(出包数)为0,InPkts(入包数)却很高。这说明LVS收到了包,但无法转发给RS——最终定位到RS的lo接口MTU为1500,而LVS发来的包带DF标志且大小超1500,被RS内核静默丢弃。解决方案:在RS上ip link set lo mtu 9000,或在LVS上echo 1 > /proc/sys/net/ipv4/ip_forward(虽DR模式不需,但某些内核版本有bug)。
技巧2:VRRP切换时,用arping -U强制刷新客户端ARP缓存
VIP漂移后,客户端ARP缓存可能仍指向旧MAC,导致流量黑洞。在notify_master脚本末尾添加:
arping -U -I eth0 192.168.1.100 -c 3-U表示Unsolicited ARP,强制客户端更新。实测可将“黑窗期”从3秒压缩到200ms内。
技巧3:ECMP环境下,LVS健康检查必须用HTTP_GET而非TCP_CHECKTCP_CHECK只建连,不发HTTP请求。当RS的Web服务进程僵死(如Java OOM后线程挂起),TCP端口仍开放,TCP_CHECK会误判为健康。而HTTP_GET会发HEAD请求并校验HTTP状态码。配置示例:
HTTP_GET { url { path /healthz status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 }技巧4:为LVS Director配置net.ipv4.vs.expire_nodest_conn=1
此内核参数表示:当RS被标记为down时,立即清除conntrack表中所有指向该RS的连接。默认为0,即等待超时。开启后,RS宕机后连接秒级中断,而非等待1200秒。命令:echo 1 > /proc/sys/net/ipv4/vs/expire_nodest_conn。
技巧5:用ss -s代替netstat -s看socket统计netstat -s输出冗长且不易读,ss -s简洁明了。重点关注:
$ ss -s Total: 1234 (kernel 5678) TCP: 987 (estab 456, closed 123, orphaned 0, synrecv 0, timewait 567/0), ports 0 # 其中timewait 567/0 表示567个TIME_WAIT连接,0表示未被回收 # 若estab远小于total,说明连接建立困难;若timewait堆积,说明RS响应慢6. 架构演进思考:当流量突破百万QPS时,LVS+VRRP+ECMP还够用吗?
这个问题没有标准答案,但可以明确几个临界点。LVS的性能瓶颈主要在conntrack表和网络栈。单台LVS Director在3.10内核下,conntrack表上限默认65536,即使调大到50万,当QPS超5万时,新建连接速率(new connection/sec)会触及内核软中断瓶颈,表现为si(softirq)CPU持续100%。此时,VRRP的主备切换已无意义——因为Backup节点同样会瞬间被打满。我们做过压测:当单LVS节点QPS达8万时,/proc/net/ip_vs_stats中InPkts增速开始放缓,OutPkts出现明显丢包(OutPkts<InPkts),而ipvsadm -Ln --stats显示Conns列数字停滞。
出路有三条: