从零到一实战指南——LVS核心原理与高可用集群部署

张开发
2026/4/17 17:54:25 15 分钟阅读

分享文章

从零到一实战指南——LVS核心原理与高可用集群部署
1. 初识LVS为什么你需要这个流量指挥官第一次听说LVS的时候我正被公司网站的突发流量搞得焦头烂额。那会儿我们的电商平台一到促销就崩溃用户投诉像雪花一样飞来。直到技术总监拍了拍我的肩膀说小伙子该请出LVS这个流量指挥官了。LVS全称Linux Virtual Server简单来说就是个超级智能的交通警察。想象一下早高峰的路口没有交警时所有车都挤在一条道上而有交警指挥后车辆就能均匀分配到各个车道。LVS干的就是这个活——把用户请求合理地分配给后端服务器避免某些服务器累死累活另一些却在摸鱼。最让我惊艳的是它的性能。记得第一次压测时单台LVS调度器轻松扛住了5万的并发请求CPU占用还不到30%。这要归功于它直接工作在内核层面不像那些跑在用户空间的代理软件说的就是你Nginx每次转发都要在用户态和内核态之间来回切换。你可能不知道现在很多知名网站都在用LVS。比如某大型视频网站就用它来调度海量的视频请求某电商平台靠它应对双十一的流量洪峰。有趣的是LVS最初只是章文嵩博士的个人项目后来因为实在太优秀直接被收编进了Linux内核。2. 拆解LVS内核里的黑科技是如何工作的2.1 三层架构分工明确的作战部队LVS集群就像个训练有素的军队分为三个梯队前线指挥部Load Balancer负责接收所有外来请求并做出调度决策。这里运行着ipvs内核模块相当于指挥官的大脑。作战部队Server Cluster真正的服务节点可以是Web服务器、数据库等。我们管它们叫Real Server真实服务器。后勤补给Storage通常是共享存储确保所有作战部队拿到的弹药数据是一致的。我在第一次部署时犯过错误把NFS存储挂载点设成了异步模式结果用户经常看到半成品页面。后来改用GFS集群文件系统才解决一致性问题。这里给个忠告Storage层的性能监控千万别忽视2.2 数据包奇幻漂流记让我们跟踪一个HTTP请求的旅程用户输入网址VIP数据包带着CIP客户端IP和VIP虚拟IP出发到达Director后内核的PREROUTING链说这VIP是我的送到INPUT链IPVS模块检查服务列表哦这是要负载均衡的Web服务根据调度算法比如轮询把目标MAC地址改成选中的Real ServerPOSTROUTING链把改装过的数据包送出去整个过程不到1毫秒比眨眼还快200倍。我曾在tcpdump里看到一个SYN包进来转眼间就被转发到后端连TCP握手都是在Real Server上完成的。2.3 必须掌握的术语表刚接触LVS时那些缩写看得我头晕。这里帮你整理成大白话VIP对外公布的虚拟IP就像公司总机号码DIPDirector的内线号码用来和后端服务器说悄悄话RIPReal Server的真实IP相当于员工的分机号CIP客户端的IP就像来电显示记住这些术语很关键有次我在机房调试同事喊RIP挂了我差点以为要默哀——原来只是192.168.1.10那台Web服务宕机了。3. 四种工作模式选型指南3.1 DR模式性能王者的代价直接路由DR模式是我们的性能担当实测转发效率高达98%。原理很巧妙Director只修改MAC地址Real Server直接通过lo接口响应客户端。就像快递员Director只负责分派订单商品响应数据由仓库Real Server直接发给顾客。但配置起来有点娇气所有Real Server要在同一VLAN需要调整arp_ignore和arp_announce参数VIP要绑定在lo接口上# 关键配置示例 echo 1 /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 /proc/sys/net/ipv4/conf/all/arp_announce ifconfig lo:0 $VIP netmask 255.255.255.255 up去年我们扩容时新加的服务器忘了设arp参数结果出现VIP冲突整个集群时好时坏。监控系统显示丢包率突然飙升到15%花了三小时才定位到这个低级错误。3.2 NAT模式小规模部署的万能钥匙NAT模式最适合新手入门配置简单Real Server网关指向DirectorDirector做DNAT和SNAT转换支持端口映射比如把外部的80转成内部的8080但有个致命缺点——Director容易成为瓶颈。我们的血泪教训当Real Server超过15台时Director的网卡就开始丢包。后来换成DR模式同样硬件性能提升了8倍。3.3 TUN模式异地容灾的救星TUN模式通过IP隧道实现跨机房调度特别适合需要地理冗余的场景后端服务器分散在不同区域需要避免单点故障配置时要特别注意MTU值我们曾因为没调小MTU导致大包被拆延迟飙升。建议设为1400左右ifconfig tunl0 $VIP netmask 255.255.255.255 mtu 1400 up3.4 FULLNAT模式云环境下的变形金刚这是阿里云改良的版本主要特点是进出流量都经过Director支持Real Server在不同VLAN不需要改网关配置但性能损失较大而且Real Server看不到真实客户端IP。我们只在AWS混合云环境中用过其他场景还是首选DR模式。4. 手把手搭建高可用集群4.1 环境准备少走弯路的checklist根据我踩过的坑整理出必备清单网络拓扑图提前规划好IP地址特别是VIP不能冲突时间同步所有节点必须NTP同步证书验证会出问题SELinux建议先设为permissive模式防火墙规则开放VIP端口记得保存规则内核参数特别是net.ipv4.vs.conntrack要调大# 基础环境检查脚本 #!/bin/bash check_items( /proc/sys/net/ipv4/ip_forward /proc/sys/net/ipv4/vs/conntrack /etc/sysconfig/network-scripts/ifcfg-* ) for item in ${check_items[]}; do echo Checking $item ... cat $item || echo ERROR: $item check failed done4.2 NAT模式实战电商促销的救命稻草以电商网站为例假设我们有VIP203.0.113.100Real Server192.168.1.101-103# Director配置 ipvsadm -A -t 203.0.113.100:80 -s wlc ipvsadm -a -t 203.0.113.100:80 -r 192.168.1.101:80 -m -w 3 ipvsadm -a -t 203.0.113.100:80 -r 192.168.1.102:80 -m -w 2 ipvsadm -a -t 203.0.113.100:80 -r 192.168.1.103:80 -m -w 1 # Real Server配置 route add default gw 192.168.1.100 echo HTTP服务已启动 /var/www/html/index.html重点说明-m表示NAT模式-w设置权重性能好的服务器给更高权重记得在Real Server上设置默认网关4.3 DR模式进阶千万级PV的架构方案对于高流量场景建议这样部署使用keepalived实现Director高可用Real Server采用无状态设计会话保持用redis集中存储# DR模式关键配置 ipvsadm -A -t 203.0.113.100:80 -s wrr ipvsadm -a -t 203.0.113.100:80 -r 192.168.1.101:80 -g -w 5 ipvsadm -a -t 203.0.113.100:80 -r 192.168.1.102:80 -g -w 3 # Real Server上的VIP配置 ifconfig lo:0 203.0.113.100 netmask 255.255.255.255 up route add -host 203.0.113.100 dev lo:04.4 防火墙标签解决HTTPS的调度难题遇到混合协议HTTPHTTPS时常规调度会导致会话不一致。解决方案是打防火墙标记# 将80和443端口标记为同一个服务 iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66 ipvsadm -A -f 66 -s sh这个技巧在我们升级全站HTTPS时立了大功避免了用户登录状态丢失。5. 调优与排错实战手册5.1 调度算法选型没有最好只有最合适经过大量测试我们得出这些经验电商首页用WLC兼顾服务器性能和连接数视频流媒体用SED减少初始缓冲时间API网关用SH保证相同客户端落到同一后端静态资源用RR简单轮询即可# 动态调整算法示例 ipvsadm -E -t 203.0.113.100:80 -s wlc watch -n 60 ipvsadm -ln --stats # 每分钟监控一次5.2 性能调优从30%到300%的提升技巧内核参数调优效果最明显# /etc/sysctl.conf 关键参数 net.ipv4.vs.conn_reuse_mode 1 net.ipv4.vs.expire_nodest_conn 1 net.ipv4.vs.expire_quiescent_template 1 net.ipv4.vs.sync_threshold 2048配合网卡多队列和CPU绑定我们的LVS吞吐量直接翻了三倍。具体做法ethtool -L eth0 combined 8taskset -pc 0-7pidof ipvsadm5.3 常见故障红灯区根据运维统计TOP3问题分别是ARP问题占45%表现为VIP不通解决方法是检查arp_ignore设置持久连接失效30%通常因为timeout设得太短建议至少300秒Real Server健康检查失败25%用ldirectord做精细化的健康检查这是我常用的排错命令组合# 实时监控 watch -n 1 ipvsadm -lnc | awk {print \$6} | sort | uniq -c # 连接状态分析 ipvsadm -ln --stats | grep -v 0.0.0.0 # 详细日志 dmesg | grep IPVS6. 生产环境进阶技巧6.1 会话保持购物车不丢失的秘密电商网站必须处理会话保持我们有三种方案防火墙标记持久性简单但不够灵活调度算法绑定如SH算法但负载可能不均衡外部存储会话用Redis集中存储最推荐# 方法1持久性配置 ipvsadm -E -t 203.0.113.100:80 -p 3600 # 方法3Real Server配置 session.save_handler redis session.save_path tcp://192.168.1.200:63796.2 健康检查从被动到主动的进化内置的检查太基础我们改用ldirectord# /etc/ha.d/ldirectord.cf virtual203.0.113.100:80 real192.168.1.101:80 gate real192.168.1.102:80 gate servicehttp requesthealthcheck.html receiveOK schedulerwrr protocoltcp checktypenegotiate这个配置会主动请求healthcheck.html只有返回OK才认为服务健康。6.3 监控指标必须关注的五大黄金指标我们的Dashboard永远显示CPSConnections Per Second突增可能意味着攻击InPkts每秒入包数判断流量模式OutPkts出包数异常可能Real Server有问题ActiveConn活跃连接数超过阈值要扩容CPU/MemDirector资源使用率用这个命令导出Prometheus格式的指标ipvsadm -ln --stats --rate | awk /TCP/{print ipvs_connections{protocol\tcp\} $3} /UDP/{print ipvs_connections{protocol\udp\} $3}7. 从单机到集群高可用架构设计7.1 Keepalived双活方案主备模式太浪费我们设计双活架构两台Director都运行ipvs使用ECMP实现流量分流通过BGP通告VIP# keepalived配置片段 vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 150 advert_int 1 virtual_ipaddress { 203.0.113.100/32 dev eth0 } }7.2 跨机房容灾方案在三个AZ部署LVS集群每个机房部署2台Director用Anycast广播相同的VIPDNS根据地理位置解析遇到过的坑跨机房延迟导致TCP超时最后调整了内核参数才解决net.ipv4.tcp_keepalive_time 300 net.ipv4.tcp_keepalive_probes 57.3 云原生环境下的LVS在K8s中我们用ipvs作为kube-proxy的后端# kube-proxy配置 apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: ipvs ipvs: scheduler: wrr minSyncPeriod: 5s syncPeriod: 30s性能比iptables模式提升40%特别是服务数量超过1000个时。8. 真实案例某社交平台的LVS演进之路去年我们接手一个日活300万的社交平台他们的架构演进很有代表性第一阶段NAT模式问题晚高峰API延迟2s优化改为DR模式延迟降至200ms第二阶段单台Director问题单点故障导致全站不可用方案引入Keepalived双活第三阶段简单轮询问题热门用户的后端压力过大改进采用WLC算法动态权重第四阶段手动管理痛点扩容缩容效率低自动化开发了基于Prometheus的自动伸缩系统现在他们的架构能支撑千万级DAUAPI响应时间稳定在100ms内。最关键的是LVS集群已经稳定运行400多天没出过严重故障。

更多文章