广告:Codex Token 低价中转站稳定接口 · 快速接入 · 开发者备用通道
Engineering article

容灾备份LVS?看完就会设计

我见过几个大厂用LVS搞容灾备份,先说结果:能做,但别指望它像你想象中那么稳。LVS本身是负载均衡,但结合keepalived和多组虚拟服务器,确实能实现高可用和跨区域容灾。你得在两台LVS节点上分别配置不同VIP和RIP,再让keepalived切换主备关系。关键点是同步状态、实时切换和会话保持。做过一次,发现如果RES同步配置不当,主

容灾备份LVS?看完就会设计
配图来源于网络和AI生成,仅供参考。
▌ 技术引导
我见过几个大厂用LVS搞容灾备份,先说结果:能做,但别指望它像你想象中那么稳。LVS本身是负载均衡,但结合keepalived和多组虚拟服务器,确实能实现高可用和跨区域容灾。你得在两台LVS节点上分别配置不同VIP和RIP,再让keepalived切换主备关系。关键点是同步状态、实时切换和会话保持。做过一次,发现如果RES同步配置不当,主节点宕机后备节点会挂掉。别用ipvsadm的默认策略去搞,尤其是nat模式,容易出现路由混乱。记住,keepalived配置里要写明vrrp_instance的virtual_router_id,确保两个节点能识别彼此。还有,防火墙得关,否则同步会失败。我见过有人把SIOCADDRT命令写错,导致虚拟路由表没加,整个容灾系统就崩了。别掉进这些坑,直接上干货。

在真实环境中,LVS+keepalived的容灾方案需要考虑网络延迟、路由策略和数据一致性。有人用rsync同步数据,有人用glusterfs做存储层,我建议先用rsync做冷备份,再用glusterfs做热备份,这样能平衡效率和可靠性。配置keepalived的时候,别忽略优先级设置,优先级低的节点会成为备节点。记住,track_script和track_interface要对应你的业务情况,比如电商系统得实时扫节点状态。别傻乎乎地只写一个vrrp_instance,得建两个不同的,分别对应不同区域的VIP。线上用的都是虚拟IP,没用真实IP,所以得确保两个节点的VIP不冲突。

我见过有人把LVS配置成多组,每组对应不同业务,但没处理好网关和路由,导致流量丢。命令行里得用ip route add命令手动添加路由,确保两个LVS节点能正确转发流量。在keepalived的配置里,要用notify_command来触发脚本,比如监控主节点状态,如果主节点挂了,就自动切换VIP到备节点。还有,记得在LVS配置文件中设置--with-ipvsadm-commands参数,这样能避免编译错误。别用简单的脚本,得写成可执行文件,路径要写对,权限要足。核心逻辑是:主节点处理流量,备节点同步状态,主节点挂了就自动接管。

如果你想要更稳的方案,可以再加一个Nginx做前端代理,但别让Nginx和LVS混用,会导致状态不一致。或者直接用HAProxy作为前置,它支持更丰富的健康检查和会话保持机制。别纠结于LVS的nat模式,它更适合内网负载均衡,外网用tcp或udp模式。我见过有人在nat模式下配置了错误的后端IP,结果流量全丢。关键是在ipvsadm里用 -t 参数指定服务类型,别用 -u。另一个坑是,keepalived的同步间隔设置太短,导致主备节点频繁切换,影响系统稳定性。得在vrrp_instance里加advert_int参数,控制心跳间隔,一般设成3秒左右。

如果你在云环境里用,得注意云厂商的路由策略。比如阿里云的vpc内网IP和公网IP不能直接互通,得用nat网关或专线。有人踩过这个坑,导致LVS节点在云上无法通信。还有,别把LVS节点和数据库放在同一个安全组,否则会有网络延迟或隔离问题。配置ipvsadm的时候,别忘记用 --protocol 指定协议,比如 -t 80 --protocol tcp。如果你用DR模式,得确保后端服务器的arp表正确,否则流量会走错。用arping命令检查一下,不行就手动加静态arp。总之,LVS能和keepalived配合做容灾备份,但得注意同步、状态、网络和路由策略,还有会话保持的实现方式。

▌ 技术参考
一 技术背景与核心概念
LVS(Linux Virtual Server)是基于IP负载均衡的架构,通常与keepalived配合实现高可用。容灾备份的关键在于主备LVS节点的切换机制和数据同步策略。主节点负责处理流量,备节点同步状态并等待切换。在实际部署中,需要配置两组虚拟IP(VIP)和两组真实IP(RIP),确保主备节点能独立处理请求。keepalived负责监控节点健康状态,并通过vrrp协议实现VIP的切换。LVS的调度算法(如rr、wrr、lc、wlc等)需要根据业务负载选择,比如高并发场景推荐用wlc。

二 具体操作方法或配置步骤
在主节点上,运行ipvsadm命令配置服务,比如 ipvsadm -A -t 10.0.0.100:80 -s wlc。接着,运行ipvsadm -a -t 10.0.0.100:80 -r 192.168.1.2:80 -g -w 1。在备节点上,同样运行这些命令,但VIP要换成另一个,比如 10.0.0.101。keepalived的配置文件需要包含两组vrrp_instance,分别对应两个VIP。例如,在主节点的配置中,vrrp_instance VI_1的virtual_router_id设为10,配置VIP 10.0.0.100。在备节点的配置中,vrrp_instance VI_2的virtual_router_id设为20,配置VIP 10.0.0.101。同时,需要在每个节点的notify_command里指定一个脚本,比如切换VIP时执行ip route add命令。

三 常见踩坑场景与避坑方案
最常见的坑是同步状态失败,导致主备节点状态不一致。keepalived的配置中,如果track_script没写对,或者脚本路径不对,状态同步就会出问题。另一个坑是网络防火墙未关闭,导致VIP无法通信。别以为关了iptables就能完事,得确保firewalld或iptables的规则中没有阻挡vrrp协议和arp通信。还有,有人用RS同步RIP,但没用ipvsadm的同步功能,导致备节点无法及时接管流量。解决方案是使用ipvsadm的 --sync-flags=--all-flags 或 --sync-flags=--add-destinations 参数,确保状态同步。不要乱改sync_period参数,一般设成30秒即可。

四 性能影响或效率对比
LVS+keepalived的方案在性能上表现中规中矩,但存在显著差异。主节点处理请求时,负载分发是毫秒级的,但切换时会有短暂延迟,最短也得1-2秒。如果业务对延迟敏感,比如实时交易系统,这种方案可能不够。相比之下,HAProxy+keepalived的方案切换更快,但配置复杂。另外,DR模式下的LVS性能优于NAT模式,因为不需要NAT转换,但需要确保后端服务器的ARP表正确。有人在DR模式下没处理arp问题,导致流量全丢。用ip route add 10.0.0.100 via 192.168.1.1,确保流量路由正确。

五 适用场景与局限性
LVS+keepalived的容灾方案适合中大型企业内部系统,尤其是需要负载均衡和高可用的场景。比如银行的内部交易系统,可以通过两个LVS节点实现主备切换。但不推荐用于互联网服务,因为切换延迟和网络问题容易导致用户请求失败。局限性在于,LVS不支持跨数据中心的路由切换,除非手动配置路由表。此外,状态同步依赖keepalived的vrrp协议,如果主节点和备节点网络波动,同步会失败。要确保主备节点的网络延迟在100ms以内,否则会触发频繁切换。

六 替代方案或进阶技巧
如果你在云上部署,建议使用云厂商的负载均衡服务,比如阿里云的SLB或AWS的ELB。它们内置了高可用和容灾机制,无需自己配置keepalived和LVS。如果必须用LVS,可以加一个Nginx做前端代理,这样会话保持更灵活。另外,可以结合GlusterFS或Ceph做存储层,确保数据同步。在keepalived配置中,可以加一个track_interface参数,监控网络接口状态,比如 track_interface eth0。别忘了在配置里添加track_script,比如检查MySQL服务是否启动,如果没启动就自动切换。这样能避免程序崩溃导致的切换。

七 服务配置与健康检查
在LVS的配置中,使用ipvsadm -e -t 10.0.0.100:80 -r 192.168.1.2:80 -g,确保后端服务器状态正确。健康检查可以用tcp-check,命令是 ipvsadm -L -n -t 10.0.0.100:80 -c。如果某个后端服务器不健康,可以手动移除,比如 ipvsadm -d -t 10.0.0.100:80 -r 192.168.1.2:80。别用默认的健康检查方式,最好在keepalived里加一个health_check脚本,比如检查MySQL的端口,用nc -zv命令。如果检测到后端宕机,就自动切换。

八 路由与网络配置
配置主备节点的路由表时,要手动添加VIP的路由,比如 ip route add 10.0.0.100 via 192.168.1.1。如果在DR模式下,确保后端服务器的ARP表正确,使用arping -q -c 1 -s 10.0.0.100 192.168.1.2,确认后端能正确响应ARP请求。网络延迟是关键,如果主备节点的网络延迟超过100ms,keepalived容易误判状态,导致频繁切换。用ping命令测试延迟,确保在可接受范围内。

九 节点切换与状态同步
keepalived配置中,vrrp_instance的priority参数决定了主备节点的切换顺序。主节点设成100,备节点设成90,这样主节点挂了才会切换。切换时,keepalived会自动执行notify_command脚本,比如切换VIP和路由。状态同步可以通过ipvsadm的 --sync-flags 参数来控制,如果用 --all-flags,所有规则都会同步,不过会增加网络负担。如果只同步部分规则,比如 --add-destinations,会更高效。别用默认的sync_period,设置成30秒更稳定。

十 关键参数与配置项
在keepalived的配置文件里,vrrp_instance块中的state参数要设成MASTER或BACKUP。virtual_router_id要唯一,比如主节点用10,备节点用20。通知脚本要写成可执行文件,路径要写对,比如 notify_command /etc/keepalived/switch_vip.sh。在ipvsadm配置中,-t 参数指定TCP服务,-u 参数指定UDP服务。别用 -f 参数,除非你真的需要FWM(基于IP的负载均衡)。状态同步使用 --sync-flags,建议用 --all-flags,确保所有规则都被同步。

十一 高级调度算法与权重设置
LVS支持多种调度算法,比如rr(轮询)、wrr(加权轮询)、lc(最少连接)、wlc(加权最少连接)。在实际部署中,wlc算法更适合高并发场景,因为它会动态调整权重。在配置时,用 -w 参数设定权重,比如 ipvsadm -a -t 10.0.0.100:80 -r 192.168.1.2:80 -w 2。如果后端服务器性能差异大,建议用wlc,这样性能高的服务器会处理更多请求。别用简单的rr,容易造成某些节点过载。

十二 会话保持与持久连接
会话保持是LVS的一个重要特性,如果应用需要会话持久化,可以配置ipvsadm的 --persistent 参数。比如 ipvsadm -e -t 10.0.0.100:80 -r 192.168.1.2:80 -p 300。这样会话会在300秒内保持。对于需要会话的业务,比如电商系统,这个参数很关键。但别设的太大,否则可能影响切换。同时,保持会话需要确保后端服务器之间能通信,否则会话无法同步。如果后端服务器是不同的物理机,apip和arp的配置必须正确。

十三 备份节点状态监控与切换
keepalived的vrrp_instance里,要配置track_script和track_interface,比如 track_script chk_http和track_interface eth0。如果某个节点的网络接口DOWN了,keepalived会自动切换VIP。track_script可以写一个脚本,比如检查HTTP状态,用curl命令测试某个健康检查URL。如果返回200,就认为节点正常。这种方案比直接监控进程更稳定,因为网络问题也会导致进程崩溃。在脚本里,用exit 0表示正常,exit 1表示异常。

十四 网络隔离与安全策略
在云环境里,LVS的主备节点必须属于同一个VPC,否则无法通信。如果跨VPC,得用nat网关或专线连接。别把LVS节点和数据库节点放在同一个安全组,否则会有网络隔离问题。配置iptables时,要确保允许vrrp协议(UDP 112)和arp通信。有人没开这些规则,导致keepalived无法通信,切换失败。安全组的开放策略也要写对,比如允许所有节点的流量,但限制不必要的端口。

十五 多组虚拟服务器配置与管理
如果业务是多组,每个组对应一个VIP,可以在keepalived里配置多个vrrp_instance。比如,主节点的vrrp_instance VI_1对应VIP 10.0.0.100,VI_2对应VIP 10.0.0.101。每个vrrp_instance的virtual_router_id要不同,避免冲突。在管理时,要确保每个组的VIP和RIP不重叠。手动添加路由,比如 ip route add 10.0.0.100 via 192.168.1.1,确保流量正确到达主节点。如果VIP冲突,会导致切换混乱,建议用不同的子网。

十六 状态同步与远程备份
LVS的状态同步依赖keepalived的vrrp协议,不支持远程备份。所以如果主节点宕机,备节点可能无法及时接管。解决方案是用rsync同步配置文件,或者把keepalived的日志文件也同步。在rsync配置里,用 rsync -avz /etc/keepalived/ /backup/,确保配置文件一致。别用简单的rsync,最好加一个密码,用 --password-file 参数。同步频率建议设成每30秒一次,不过会增加网络负载。

十七 节点切换优先级与验证
主备节点的priority参数决定了切换顺序,比如主节点设成100,备节点设成90。如果主节点挂了,备节点才会接管。切换后,要检查VIP是否成功绑定,用 ip a 查看。同时,检查路由表是否正确,用 ip route 查看。如果切换失败,可能是keepalived的配置错误,比如virtual_router_id没写对,或者notify_command脚本没有执行权限。所以得确保脚本可执行,路径正确。

十八 容灾演练与压力测试
要定期做容灾演练,比如手动停掉主节点的LVS服务,看备节点是否能接管。用 ipvsadm -D -t 10.0.0.100:80 看主节点是否移除服务。再用 ipvsadm -A -t 10.0.0.100:80 -s wlc 检查是否能重新添加。压力测试时,用ab命令发请求,看主备节点是否能正确分发流量。如果发现某些节点无法响应,可能是配置错误或网络问题。

十九 故障排查常用命令
在排查LVS问题时,常用命令有 ipvsadm -L -n,查看当前规则;ip route,检查路由表;tcpdump,抓包看流量是否正常;ss -tuln,检查端口监听状态。keepalived的日志在 /var/log/messages,用 tail -f 看是否有错误。如果发现keepalived切换错误,可能是vrrp_instance配置错误,或者VIP冲突。还有,用arping -q -c 1 -s 10.0.0.100 192.168.1.2,看后端是否响应ARP。

二十 跨区域部署与网络配置
如果LVS节点跨区域部署,得手动处理路由和DNS切换。主节点的VIP在本地区域,备节点的VIP在另一个区域。用ip route add命令配置路由,比如 ip route add 10.0.0.100 via 10.0.1.1。同时,DNS要配置两个A记录,一个指向主IP,一个指向备IP。当主节点宕机,DNS会自动切换到备IP。但要注意,DNS切换可能有延迟,建议用TTL参数控制缓存时间。网络层要确保主备节点之间能互通,否则keepalived无法同步状态。