ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

LVS负载均衡实战:从三种工作模式到Keepalived高可用集群

LVS负载均衡实战:从三种工作模式到Keepalived高可用集群 说真的干了这么多年运维和架构设计我发现很多团队在流量入口这块儿往往会陷入一个选择困难症Nginx够不够是不是上了K8s就不需要别的了直到某天线上流量把入口机打爆CPU跑满、连接数飙升、后端一批一批地报警你才想起来其实还有一台低调到几乎不占资源、却能把几十万并发安排得明明白白的“老将”它就是LVS。这篇文章不聊虚的直接把LVS负载均衡这套东西掰开揉碎给你看。从它的核心设计思路、三种工作模式到十种调度算法的实战选型再到和Keepalived配合搭建高可用集群最后把我这些年踩过的坑和一些排查技巧全盘托出。不管你是刚接触集群架构的新人还是想优化现有负载均衡方案的资深工程师这篇都能给你一些能直接落地的东西。1. 整体设计与核心思路拆解1.1 为什么集群入口需要一台“调度器”先想一个最简单的问题你有一套Web服务后端有5台服务器用户怎么访问如果直接把5台服务器的IP都公布出去且不说用户记不住这么多地址单是日常扩缩容就够你受的——加一台机器难道还要让用户改配置吗所以我们需要一个“虚拟服务入口”这个入口有一个统一对外的地址比如VIPVirtual IP虚拟IP用户只访问这个地址至于流量具体转发给谁由入口来决定。这就是“调度”这个动作的由来。而LVSLinux Virtual ServerLinux虚拟服务器干的就是这件事它工作在Linux内核态通过IPVSIP Virtual Server模块实现四层流量转发。它的核心思想就是你有一个对外开放的IP后面挂着多台真实服务器Real Server后面简称RS用户请求到了LVS这一层由调度器按照既定策略把请求转给某台RS处理RS处理完再把响应返回给用户。这在集群架构里属于最基础但也是最关键的“流量分发”环节。为什么这种设计是合理的因为用户的请求永远只打到一个IP上后端的扩容、缩容、故障剔除对用户完全透明。你甚至可以在后端RS完全不感知调度器存在的情况下通过修改内核参数实现优雅的负载均衡。这是Nginx这种七层代理很难做到的轻量级方案——LVS不解析HTTP报文它只看四层包头IP端口因此转发效率极高内核态处理几乎不产生用户态开销。1.2 四层与七层的本质区别以及LVS的定位总有人问我有Nginx了为什么还要LVS其实这俩根本不是替代关系而是配合关系。从OSI模型来看Nginx工作在应用层第七层能够理解HTTP协议可以做URL路由、缓存、gzip压缩等高级操作而LVS工作在网络层与传输层之间第四层它不关心数据内容是什么只看源IP、目标IP、端口号就做转发。用一个生活化的比方LVS是小区门口那座只认门牌号的“总收发室”只要信封上写着A栋302室它就只负责把信塞进对应楼栋的信箱里而Nginx是每栋楼里的“管理员”他能帮你拆开信封看看里面写了什么甚至帮你代写回信。收发室效率极高一分钟能处理上万封信管理员能做精细活儿但一次只能拆一封信。所以LVS的定位就是集群最前面的“流量大门”先把所有流量按IP端口这个维度均匀铺开给后端的Nginx或业务服务Nginx在各自RS上做更精细的七层路由。这套“LVS后端”的经典组合至今仍是很多大型互联网公司的标配入口架构原因无它性能强、稳定性高、配置简单可靠。1.3 LVS核心概念速览VS、RS、VIP、DIP开始动工之前先把这几个概念记牢后面所有配置都围绕它们展开VSVirtual Server虚拟服务器LVS调度器本身通常配置一个对外IP。VIPVirtual IP虚拟IP地址对外提供服务的IP用户访问的就是它。DIPDirector IP调度器内网IPLVS与实际RS通信时使用的IP地址。RSReal Server真实服务器真正处理业务的后端服务器。IPVSIP Virtual ServerLVS内核中的核心模块负责在数据包路径上做DNAT或MAC改写。ipvsadm用户态管理工具相当于iptables之于netfilter用来增删规则、查看连接状态。理解了这些之后我们就可以进入正题LVS到底怎么转发流量。而这就引出了它最经典也是最核心的三种工作模式。2. 三种工作模式LVS是怎么把流量送进后端的LVS有三种数据转发模式NAT模式、DR模式直接路由、TUN模式IP隧道。很多初学者在这三种模式上绕不清我尽量用最直白的语言把它们的原理、适用场景和坑一次性讲明白并给出选型建议。2.1 NAT模式Network Address Translation网络地址转换NAT模式是最容易理解的一种。用户请求到达LVS后LVS把请求报文的目标IP地址改为某台RS的IP同时把源IP改为LVS自己的内网IP然后转发给RSRS处理完成后数据包绕回LVSLVS再把源IP改回VIP返回给用户。也就是说所有进出的流量都要经过LVSLVS在这里扮演了一个“改地址的中间人”角色。这样做的好处是RS可以跑在私有网段安全性高且RS不需要额外的内核参数配置坏处也非常明确流量进和出都走LVSLVS很容易成为瓶颈。如果业务是“读多写少”的典型Web服务响应报文通常比请求报文大得多LVS的网卡和吞吐能力会率先被打满。所以NAT模式在生产环境里一般用作流量的“入口网关”场景最典型的就是内网服务间的转发或者带宽压力不大的中小型业务。注意NAT模式下LVS需要配置两张网卡一张指向VIP一张和RS在同一个内网网段。2.2 DR模式Direct Routing直接路由DR模式才是生产环境应用最广泛的方案也是我个人的首选项。它的原理说起来很有意思用户请求到达LVS后LVS不改变IP数据包内容只改写数据链路层的目标MAC地址——把MAC改成选定的RS的MAC地址然后把这个数据帧扔到局域网里由于目标IP也就是VIP在RS上也配置了通常配置在RS的lo回环接口上并抑制ARP响应RS收到数据帧后一看目标MAC是自己就收下处理处理完直接把响应报文通过自身的物理网卡返回给用户根本不需要再绕回LVS。这就是它的最大优势响应流量不经过LVS。LVS只处理半连接——进来的请求出去的响应完全跟它无关。用一句话总结就是“进隧道出直路”吞吐能力远远高于NAT模式几乎能跑到线速。但DR模式有两个非常容易踩的坑第一个是ARP问题。因为VIP同时配置在LVS和所有RS上如果RS对外广播自己的VIP地址交换机就会把用户请求直接转发给RSLVS的调度就形同虚设了。解决办法是在RS上配置内核参数抑制ARP响应只接受、不广播。第二个是网络环境限制。LVS和RS必须在同一个二层广播域里因为MAC地址改写只在局域网内有效。跨机房、跨路由的负载均衡DR模式就用不了。2.3 TUN模式IP TunnelingIP隧道TUN模式解决的是DR模式“必须同网段”的问题。它的思路是LVS收到请求后在原始IP报文外面再包一层新的IP头新头的目标地址是RS的物理IP然后发给RS。RS收到之后内核解开外层IP头发现里面还是那个发给VIP的请求包于是自己处理处理完以后直接走自己的物理网卡把响应返回给用户响应流量同样不经过LVS。这种模式适合做跨机房、跨地域的分布式集群调度。比如你在北京和杭州各有一组服务器希望用户请求按某种策略分到两边TUN模式就能解决。它比DR模式多了一层IP头的封装开销但因为响应无需回程吞吐量依然很高。不过在实际部署里TUN依赖RS上的隧道模块配置比如ipip模块调试成本高于DR模式所以除非有跨机房需求否则一般场景不必上TUN。2.4 三种模式选型对比一览表我把三种模式的核心差异整理成了一张表方便收藏对照对比项NAT模式DR模式TUN模式转发目标改IP地址改MAC地址再包一层IP响应是否经过LVS是否否性能上限低高高网络要求LVS与RS可跨网段必须在同一二层网络可跨网段/跨机房RS配置要求无特殊要求抑制ARP配置lo上的VIP需配置IPIP隧道模块典型场景中小型内网服务同机房高并发入口跨地域分布式集群平时做架构选型时我的习惯是机房内业务优先DR模式跨机房再考虑TUNNAT模式留给最简单的场景或不方便改RS的场景。DR模式看着配置麻烦要动RS的内核参数但实际跑起来最稳后续扩容加RS也就几分钟的事。3. 调度算法LVS怎么决定把请求交给谁理解转发模式之后接下来一个核心话题就是“调度”。LVS一共提供了十种调度算法分为静态调度和动态调度两大类。很多朋友落地的时候经常随便选个轮询就完了结果后端性能差异大时要么一台忙死一台闲着要么SLA直接拉胯。这里把算法逐个讲透并给出选型逻辑。3.1 静态调度算法不看状态只管规则静态算法的特点是不关心RS当前的实际负载严格按照预设规则转发。RRRound Robin轮询最简单请求一个一个轮流发给后端的RS。相当于发扑克牌一人一张。适用于所有RS性能均匀、请求处理成本差异不大的场景。如果后端机器配置不一样RR容易造成“小马拉大车”因为慢机器和快机器分到的请求数量一样。WRRWeighted RR加权轮询在RR基础上引入权重。权重的比例就是分配到请求数量的比例。比如三台RS权重分别设置为2、1、1那总请求里50%发给第一台剩下的各占25%。这是静态算法里比较实用的一个适合后端机器有性能差的场景。SHSource Hashing源地址哈希对客户端源IP做哈希运算同一个源IP的请求固定转发到同一台RS。它的作用是保持会话Session比如登录状态存在服务器本地内存时用户下次请求必须落在上次那台机器否则就掉登录态了。缺点是后端RS增减时哈希表重新分布可能导致部分用户的会话失效。DHDestination Hashing目标地址哈希与SH相反对目标地址做哈希。这种算法常用于“同一目标IP的请求固定转发到同一RS”的场景适合正向代理缓存类业务比如把同一个源站的请求固定到同一台缓存服务器。3.2 动态调度算法盯着RS的当前状态做决策动态算法的核心在于实时感知RS的状态例如活跃连接数、权重等再计算出一个综合值来决定下一跳本质上就是时下流行的“等开销负载均衡”思路在四层网关上的实现。LCLeast Connections最少连接数把新请求分配给当前活跃连接数最少的RS。它假设连接数越多服务器越忙但忽略了权重。如果某台机器性能很强活跃连接数却不低容易被误判为负载高。WLCWeighted Least Connections加权最少连接数LC的加权版也是LVS的默认算法。计算公式大概是活跃连接数1/权重谁的值小请求就给谁。在RS性能不均匀、请求消耗差异大的业务里WLC基本是首选——它既看当前连接情况又尊重硬件差异。SEDShortest Expected Delay最短期望延迟算法核心在于按“期望延迟”来分配也就是连接数除以权重后取最小值。它比WLC更大胆一些倾向于把请求扔给连接数增长更快的机器适合延迟敏感的场景。NQNever Queue永不排队SED的优化版。如果某台RS连接数为0直接分配给它不需要再做计算否则才按SED的下一个原则分。它能避免SED在“所有机器都有连接”时的排队等待适合吞吐敏感的场景。LBLCLocality-Based Least Connections基于本地的最少连接数基于目标IP地址的负载均衡算法。它不是全局做调度而是先看目标IP最近被分配给了哪台RS如果那台RS没有过载就仍然分配给它如果过载才去找一台负载更低的机器。这对Cache集群特别友好能尽量保持目标IP的访问集中在同一台缓存服务器。LBLCRLocality-Based Least Connections with Replication带复制的LBLC在LBLC上增加了“复制集群”的概念。一个目标IP可以对应一个RS组请求在组内做最少连接调度当组内机器都过载时才扩展到全局其他机器。这是最复杂的算法适合大热点场景的缓存集群但也最难调优。3.3 调度算法选型建议与参数配置说了这么多算法落到生产环境里的选择逻辑其实很简单后端机器配置一样、请求量均匀选RR或者LC就够了。后端配置有差选WRR或者WLC。有会话保持需求选SH或者在上层引入一致性哈希而不是依赖调度层强绑定。实际上现在很多网关层会话保持已经交给Nginx/SpringSessionLVS层兜底用SH也行。做缓存集群目标是提升Cache命中率首选LBLC/LBLCR。使用ipvsadm工具时可以通过-s参数指定调度算法。例如# 创建虚拟服务VIP 192.168.1.100端口80调度算法为wlc ipvsadm -A -t 192.168.1.100:80 -s wlc # 添加两台RS-g表示DR模式-w表示权重 ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:80 -g -w 2 ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.12:80 -g -w 1算法切换是实时的不会中断现有连接新连接会按新算法生效。所以线上有大活动或者突发流量时也可以动态调整调度策略这是LVS一个很贴心的特性。4. 实操过程从编译配置到Keepalived高可用集群搭建理论讲再多不落地都是扯淡。这一节我用一套完整的实操记录带你从零搭建一套LVSKeepalived的DR模式集群会覆盖环境准备、RS端配置、LVS端配置、高可用主备切换和验证压测的全过程。这套配置我在生产环境跑了几年稳定可靠可以直接抄作业。4.1 环境准备与内核模块检查首先准备三台服务器你的真实业务服务器可以是任意数量但为了演示方便我这里使用三台主机名IP角色备注lvs-master192.168.1.100LVS主调度器对外VIP192.168.1.199lvs-backup192.168.1.101LVS备调度器和主节点漂移同一VIPrs-1192.168.1.11真实服务器1Nginx端口80rs-2192.168.1.12真实服务器2Nginx端口80系统均为CentOS 7.9内核3.10。LVS的IPVS模块在主流Linux发行版里都内置了先确认一下# 确认ipvs模块是否已加载 lsmod | grep ip_vs # 若没有加载手动拉起来 modprobe ip_vs modprobe ip_vs_wrr modprobe ip_vs_sh # 安装ipvsadm管理工具 yum install -y ipvsadm如果lsmod输出里能看到ip_vs相关条目说明模块可用。后续为了让Keepalived自动管理模块我们还要把相关模块写到/etc/modules-load.d/ipvs.conf里。4.2 RS端配置ARP抑制与VIP绑定这是整个部署流程里最容易翻车的地方。DR模式下RS也必须响应VIP的请求但它不能对外广播VIP的MAC地址否则交换机会把直连用户流量全扔给RS绕过调度器集群瞬间失效。所以在每一台RS上需要先创建一个基于lo回环接口的子接口绑定VIP并将该接口的arp_ignore和arp_announce设为特殊值# 创建lo上的VIP子接口 ifconfig lo:0 192.168.1.199 netmask 255.255.255.255 up # 写入路由表避免VIP访问出现异常 route add -host 192.168.1.199 dev lo:0 # 调整ARP内核参数关键步骤 echo 1 /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 /proc/sys/net/ipv4/conf/all/arp_announce echo 1 /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 /proc/sys/net/ipv4/conf/lo/arp_announce sysctl -p这些参数的含义arp_ignore1意味着系统只回答目标IP是本机物理网卡IP的ARP请求不回应对VIP的ARP请求arp_announce2意味着ARP通告尽量使用可路由的物理IP地址而不是直接通告VIP。这样做的目的就是让RS“藏好”VIP只接收由LVS改写MAC后投递过来的请求包但不主动暴露自己拥有VIP的事实。注意由于lo接口的掩码是255.255.255.255实际上VIP掩码相当于一个独立主机地址不会影响RS自身路由。这一步配置错了唯一出现的现象就是VIP能ping通但流量随机打在某台机器上调度彻底失效。如果你是首次配置强烈建议在配置完每台RS后立刻检查cat /proc/sys/net/ipv4/conf/all/arp_ignore的返回值确保为1。4.3 LVS调度器端配置创建虚拟服务与RS条目LVS端的配置相对简单核心就几条ipvsadm命令# 开启ip_forward允许内核转发数据包 echo 1 /proc/sys/net/ipv4/ip_forward # 创建VIP虚拟服务使用wlc调度算法 ipvsadm -A -t 192.168.1.199:80 -s wlc # 添加RS-g指定DR模式-w设置权重 ipvsadm -a -t 192.168.1.199:80 -r 192.168.1.11:80 -g -w 1 ipvsadm -a -t 192.168.1.199:80 -r 192.168.1.12:80 -g -w 1 # 查看配置结果 ipvsadm -L -n输出会显示类似下面的内容IP Virtual Server version 1.2.1 Prot LocalAddress:Port Scheduler Flags - RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.1.199:80 wlc - 192.168.1.11:80 Route 1 0 0 - 192.168.1.12:80 Route 1 0 0看到Forward列是Route就说明DR模式生效了。此时如果直接从浏览器或curl访问http://192.168.1.199应该可以轮询到两台RS的Nginx页面。但是要注意一个细节以上ipvsadm规则重启后会丢失需要先保存再开机自启ipvsadm-save /etc/sysconfig/ipvsadm systemctl enable ipvsadm4.4 使用Keepalived实现VIP高可用单台LVS本身也是个单点。为了让调度器自身高可用我们引入Keepalived来实现VRRP虚拟路由冗余协议主备切换。主备两台LVS共享同一个VIP正常情况下VIP由master持有master宕机后backup会在几秒内接管VIP继续提供调度服务。先安装Keepalivedyum install -y keepalived主节点/etc/keepalived/keepalived.conf的最小可用配置如下global_defs { router_id LVS_MASTER } vrrp_instance VI_1 { state MASTER # 主节点 interface eth0 virtual_router_id 51 priority 100 # 主节点优先级高 advert_int 1 authentication { auth_type PASS auth_pass yourpassword } virtual_ipaddress { 192.168.1.199/24 dev eth0 } } virtual_server 192.168.1.199 80 { delay_loop 6 lb_algo wlc lb_kind DR protocol TCP real_server 192.168.1.11 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.1.12 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }备节点的配置几乎一致只需要把state改为BACKUPpriority改成90即可。这里的TCP_CHECK非常关键Keepalived通过这个健康检查机制定期探测RS的80端口一旦发现某台RS无响应就会自动把它从LVS规则里摘除等服务恢复后再加回。这一整套逻辑说白了就是“调度器做主备RS做健康检查流量自动切换”构成了一个完整的高可用集群闭环。配置完后分别启动服务systemctl start keepalived systemctl enable keepalived ip addr show eth0 # 确认VIP是否绑定成功4.5 验证压测与主备切换演练配置完不要急着上线先做一轮验证。从外部客户端连续访问VIP使用curl -I http://192.168.1.199观察返回的Server头确认请求确实调度到了不同RS。再用ipvsadm -L -n查看连接分布ActiveConn列应该比较均匀地分布在两台RS上。主备切换演练我建议直接暴力一点在master上执行init 0关机或者直接断开网卡然后在backup上观察VIP是否漂移过来# 在backup节点上观察 while true; do ip addr show eth0 | grep 192.168.1.199; sleep 1; done正常情况下master挂掉后backup在1-2秒内就会把VIP绑到自己的eth0上用户几乎无感知。实际业务里再有Nginx或者F5这种上层代理配合切换时的影响面会非常小。压测环节可以用wrk或者ab打一些流量观察LVS的表现wrk -t4 -c100 -d60s http://192.168.1.199/在60秒压测期间观察LVS节点的CPU和网络负载。你会发现即使后端QPS已经非常高LVS这台机器的CPU依然可以维持在一个比较低的水平这就是四层内核态转发的厉害之处。5. 常见问题与排查技巧实录LVS虽然稳定但配置和维护中的坑还是不少。我把自己实操里遇到过的、以及帮别人排查过的高频问题做成了速查表再挑几个重点展开讲讲。5.1 VIP不通的经典原因ARP配置丢失这是DR模式最常见的线上事故。往往是你改过服务器网络配置重启了网络服务或者有自动化脚本覆盖了sysctl参数导致RS上的arp_ignore和arp_announce被重置为0。结果RS开始对外应答VIP的ARP广播交换机把流量直接导给某台RS其他RS瞬间没流量而LVS上的连接调度直接失效。排查方式很简单登录LVS和RS分别执行arp -a看VIP的MAC地址对应的是LVS的物理网卡MAC还是某台RS的MAC。如果是RS的MAC说明ARP抑制配置丢了。解决方法是把sysctl参数固化到/etc/sysctl.d/下而不是只在命令行里临时修改cat /etc/sysctl.d/99-lvs-arp.conf EOF net.ipv4.conf.all.arp_ignore 1 net.ipv4.conf.all.arp_announce 2 net.ipv4.conf.lo.arp_ignore 1 net.ipv4.conf.lo.arp_announce 2 EOF sysctl --system5.2 高并发下的连接跟踪与超时问题LVS本身是全状态转发它会记录每条TCP连接的状态并存放在IPVS的连接表里。默认的超时时间对TCP来说通常在15分钟左右。但如果是类似WebSocket这种长连接或者大文件传输的连接有可能因为超时设置不合理导致连接被中途掐断。遇到这个问题时可以调整连接超时参数# 查看当前超时 ipvsadm -L --timeout # 修改例如设置TCP会话超时1200秒 ipvsadm --set 1200 1200 300在机器内存足够时还可以扩大IPVS连接哈希表的大小来提高连接处理上限。内核参数ip_vs_conn_tab_bits默认是15即2^15 32768条如果并发连接数很高需要调大需要提前在启动参数或模块加载参数中设置modprobe ip_vs conn_tab_bits20这个操作必须重新加载模块才能生效所以如果预计业务有几十万并发连接建议在装机阶段就把这个参数设置好。5.3 LVS性能调优的几个实用手段虽然LVS本身占用资源极低但有些因素仍然会拖慢它比如单队列网卡的中断全部跑在一个CPU核上。调优方向大致如下开启网卡多队列如果网卡支持RSSReceive Side Scaling将队列数设置为与CPU核数对齐可以让网卡中断分散到多个CPU核心避免单核被打爆。设置irqbalance确保系统自带的irqbalance服务处于运行状态让内核自动均衡硬件中断。如果某些性能极端敏感的业务模式你也可以手动把中断绑定到指定CPU但生产上让irqbalance自动调度通常已经很稳。优化连接复用如果请求都是短连接大量的TIME_WAIT连接会挤占IPVS连接表。建议在后端RS和客户端侧都允许端口复用内核参数net.ipv4.tcp_tw_reuse1net.ipv4.ip_local_port_range适当扩大。支撑超大流量时把VIP绑定到独立网卡不要用与管理网段共用的网卡去承载VIP流量这至少能避免管理突刺流量和业务流量互相干扰。5.4 排查命令汇总速查表为了方便排查我把常用的命令整理成一张表线上出问题时直接对照着执行省得手忙脚乱目的命令查看VIP是否绑定ip addr show eth0查看LVS规则和连接分布ipvsadm -L -n --stats查看IPVS超时参数ipvsadm -L --timeout查看RS是否在线ipvsadm -L -n观察ActiveConn数量测试VIP端口连通性telnet 192.168.1.199 80或curl -I检查ARP抑制是否生效cat /proc/sys/net/ipv4/conf/all/arp_ignore查看arp表确认VIP对应MACarp -a动态抓包确认MAC改写tcpdump -i eth0 tcp port 80 -nnKeepalived健康检查日志tail -f /var/log/messages6. 从LVS的调度思想看“等开销负载均衡”与后续扩展LVS虽说是一个二十多年前就成熟的技术但它背后的“调度”思想至今还在影响各个领域。最近讨论度很高的“等开销负载均衡”“CPU智能核心调度”本质上跟LVS的WLC算法是一脉相承的——都是先采集每个节点的“忙闲程度”指标再按开销最小的原则做分配。GPU调度的核心思想也类似只是把“连接数”换成了“显存占用”“计算密度”等维度。很多时候我们把LVS当成一个孤立的工具但把它放在调度器这条链路里去看能获得更多启发调度层级要明确入口调度管连接分发中间层管业务路由底层管资源分配。每一层都有各自的时间尺度和决策指标不要试图让底层把上层的活全干了。静态算法保底线动态算法提效LVS里静态算法比如WRR在机器性能差异大时也能兜底动态算法比如WLC在流量波动剧烈时能把请求导向负担最小的节点。健康检查决定整体可用性调度算法再好如果节点探测不及时一个坏节点也会拖垮整个集群。Keepalived的TCP_CHECK虽然简单但在多数场景下比复杂的探活脚本更可靠。如果你继续往下扩展这套集群架构通常可以考虑两个方向。一是“多级负载均衡架构”即前端LVS做四层分发后端Nginx做七层路由Nginx后面再挂应用集群形成LVS - Nginx - App的三级结构这也是目前很多团队的标准形态。二是“接入服务化”也就是把LVS的能力包装成统一的接入平台配合自动化脚本或K8s的Service抽象将VIP、RS、健康检查的管理全部流程化、可视化避免每次上线下线一台机器都要手动敲命令。我自己在实际操作中还有一个体会无论LVS、Nginx还是K8s任何调度器的核心不是技术本身而是“对失败的预期管理”。你要在系统设计阶段就想清楚某台RS挂了怎么办调度器自己挂了怎么办健康检查误判了怎么办把这些问题提前设计成自动化的应对策略远比事后手忙脚乱排查要有效得多。这套LVSKeepalived的组合之所以能在我维护的系统里安稳跑这么多年靠的就是这种对失败的充分预期和那几条看起来平平无奇、但关键时刻能救命的ARP内核参数。希望这篇拆解能帮你在自己的集群架构里少走些弯路。
返回列表