LVS(Linux virual server)运维入门指南

发布时间:2026/9/3 14:52:09
LVS(Linux virual server)运维入门指南 集群到底是什么集群把多台独立服务器节点组合在一起对外看成一个整体协同完成工作。单台服务器单点一旦宕机服务直接挂性能上限固定。集群一堆机器组队。分担压力、互相备份组成集群的每一台服务器叫做节点node。集群三大经典分类负载均衡集群 LBLoad Balance目标分摊流量提升处理能力解决并发压力。请求统一发到调度器分发到后端多台业务服务器。典型组件LVS、HAProxy、Nginx 负载均衡场景网站、API 服务、Ollama 多实例集群例子上万用户访问网站一台扛不住多台 web 服务器组成集群流量分散。高可用集群 HAHigh Availability目标防止单点故障机器坏了业务不中断实现故障自动转移。核心冗余、故障切换failover典型组件Keepalived、Pacemaker场景数据库主备、关键中间件例子主服务器宕机备用服务器立刻接管虚拟 IP用户无感知。场景网站流量突增单台服务器扛不住压力页面加载卡顿、接口超时甚至直接宕机。这时候负载均衡就成了救命稻草而LVSLinux Virtual Server作为Linux内核层的高性能负载均衡方案更是大型系统架构中不可或缺的一环。一、初识LVS什么是Linux Virtual ServerLVS全称Linux Virtual Server即Linux虚拟服务器是由章文嵩博士开发的一款开源负载均衡技术目前已成为Linux内核的标准模块之一。它的核心作用很简单将前端客户端的请求流量智能分发到后端多台真实服务器Real Server简称RS上实现负载分担从而提升服务的并发处理能力、可用性和稳定性。这里要划重点LVS工作在OSI七层模型的第四层传输层基于IP和端口进行流量转发属于“四层负载均衡”相比Nginx等七层负载均衡它的优势在于性能极高——因为是内核层转发几乎没有用户态到内核态的切换开销能轻松承载百万级并发。二、了解LVS核心术语VSVirtual Server虚拟服务器也就是LVS调度器对外提供一个统一的访问入口VIP负责接收客户端请求并分发到后端RS。RSReal Server真实服务器真正提供业务服务的服务器比如Web服务器、应用服务器后端可以有多台形成集群。VIPVirtual IP虚拟IPVS对外暴露的IP地址是客户端唯一的访问地址相当于集群的“门面”。DIPDirector IP调度器的内网IP用于和后端RS通信转发请求和接收响应部分模式下。RIPReal IP真实服务器的IP地址后端RS的内网IP用于和VS通信。CIPClient IP客户端的IP地址发起请求的终端IP。总结访问流程客户端CIP访问VIP → VS调度器DIP接收请求 → 调度器将请求分发到某台RSRIP → RS处理请求并响应 → 响应结果返回给客户端。LVS四大工作模式LVS有四种核心工作模式分别是NAT模式、DR模式、TUN模式和FULLNAT模式其中NAT和DR是最常用的两种TUN和FULLNAT仅作了解即可。三、LVS四大工作模式重点掌握这两种LVS有四种核心工作模式分别是NAT模式、DR模式、TUN模式和FULLNAT模式其中NAT和DR是最常用的两种TUN和FULLNAT仅作了解即可我们重点拆解前两种。3.1 NAT模式简单易部署适合小规模集群NATNetwork Address Translation模式本质是“多目标IP的DNAT”核心是通过修改请求报文的目标IP和端口将请求转发到后端RS所有请求和响应都需要经过VS调度器。核心原理客户端发送请求数据包中包含CIP源IP、VIP目标IP和目标端口比如80。VS调度器接收请求将数据包的目标IPVIP改为某台RS的RIP目标端口改为RS的对应端口然后转发给该RS。RS处理请求后发送响应数据包源IP是RIP目标IP是CIP。VS调度器接收响应将源IPRIP改为VIP目标端口如果有修改改回客户端请求的端口再将响应转发给客户端。优缺点优点部署简单RS不需要配置VIP支持端口映射RS可以是任意操作系统Windows、Linux都可以。缺点所有请求和响应都经过VSVS容易成为性能瓶颈适合后端RS数量较少建议不超过10台的小规模集群。注意NAT模式下RS的网关必须指向VS的DIP否则响应报文无法返回给VS同时要清空iptables防火墙策略避免干扰LVS工作。3.2 DR模式性能最优生产环境首选DRDirect Routing模式即直接路由模式是LVS的默认模式也是应用最广泛的模式。它的核心是不修改IP地址和端口仅通过重新封装MAC地址将请求转发到后端RS响应报文由RS直接返回给客户端不经过VS。核心原理客户端发送请求数据帧中包含CIP、客户端MAC、VIP、VIP的MAC。VS调度器接收数据帧将帧中的目标MACVIP的MAC改为某台RS的MAC地址源MAC改为VS的DIP对应接口的MAC然后转发给该RSIP和端口不变。RS接收数据帧发现目标IP是VIPRS上也配置了VIP就处理请求然后直接将响应报文发送给客户端源IP是VIP目标IP是CIP不经过VS。优缺点优点性能极高响应报文不经过VSVS仅负责分发请求不会成为瓶颈支持大规模集群后端RS可达到上百台。缺点部署相对复杂VS和RS必须在同一个物理网络不能跨网段RS和VS上都需要配置VIP需要解决VIP地址冲突问题。解决VIP冲突的方法重点方法1在前端网关做静态绑定将VIP和VS的MAC地址绑定确保请求都发送到VS。方法2在RS上使用arptables工具禁止RS响应VIP的ARP请求。方法3修改RS的内核参数arp_ignore和arp_announce限制ARP响应和通告级别避免RS对外暴露VIP。3.3 TUN模式和FULLNAT模式了解即可TUN模式通过在原IP报文外封装一个新的IP首部源IP是DIP目标IP是RIP实现远距离转发适合VS和RS不在同一物理网络的场景但RS必须支持隧道功能且所有IPDIP、VIP、RIP都需是公网地址。FULLNAT模式同时修改请求报文的源IPCIP→DIP和目标IPVIP→RIP支持跨网段部署但Linux内核默认不支持需要手动打补丁应用场景较少。3.4LVS工作模式总结四、LVS调度算法LVS的调度算法决定了请求如何分配到后端RS分为静态算法不考虑RS负载和动态算法根据RS负载动态分配我们重点掌握常用的几种。4.1 静态调度算法RR将请求依次分发到后端RS简单公平但不考虑RS的性能差异适合所有RS配置相同的场景。WRR根据RS的权重分配请求权重越高的RS被分配到请求的次数越多适合RS配置不同的场景比如高性能服务器权重高。SH根据客户端的源IPCIP进行哈希计算将同一个IP的请求始终分发到同一台RS实现会话绑定session sticky适合需要保持会话的场景比如用户登录后的数据交互。DHDestination Hashing目标地址哈希第一次轮询调度至RS后续将发往同一个目标地址的请 求始终转发至第一次挑中的RS典型使用场景是正向代理缓存场景中的负载均衡如宽带运营商4.2 动态调度算法WLC权重最少链接LVS默认调度算法根据RS的权重和当前连接数动态分配请求权重越高、连接数越少的RS被优先分配请求适合大多数生产场景。默认调度方法Overhead(activeconns x 256inactiveconns)/weightLC最少链接发不考虑权重仅将请求分配给当前连接数最少的RS适合RS配置相同的场景。 适用于长连接应用Overhead负载值activeconns活动链接数 x 256inactiveconns非活动链接数FO4.15内核后新增常用作灰度发布优先调度权重最高且未过载的RS若RS过载则不再分配请求。在此FO算法中遍历虚拟服务所关联的真实服务器链表找到还未过载(未设置IP_VS_DEST_F OVERLOAD标志)的且权重最高的真实服务器进行调度当服务器承接大量链接我们可以对此服务器进行过载标记IP_VS_DEST_F OVERLOAD那么vs调度器就不会把链接调度到有过载标记的主机中。SEDShortest Expection Delay,初始连接高权重优先Overhead(activeconns1inactiveconns) x 256/weight但是当node1的权重为1node2的权重为10经过运算前几次的调度都会被node2承接NQNever Queue第一轮均匀分配后续SEDLBLCLocality-Based LC动态的DH算法使用场景根据负载状态实现正向代理LBLCRLBLC with Replication带复制功能的LBLC解决LBLC负载不均衡问题从负载重的复制到负载轻的RS五、实战部署5.1 实验环境准备DR模式主机名IP地址VIP角色网关router路由NAT-eth0:172.25.254.100仅主机-eth1:192.168.0.100无路由器无LVS调度器VIP-192.168.0.200 DIP-192.168.0.50仅主机模式192.168.0.200lo接口VS192.168.0.100路由器IPRS1真实服务器RIP-192.168.0.10仅主机模式192.168.0.200lo接口RSWeb服务器192.168.0.100RS2真实服务器RIP-192.168.0.20仅主机模式192.168.0.200lo接口RSWeb服务器192.168.0.100client测试机CIP-172.25.254.10NAT模式无测试客户端172.25.254.1005.2 部署步骤第一步配置所有主机的网络确保互相ping通以lvs调度器为例配置网卡和VIPrs1、rs2配置类似# 配置eth0网卡仅主机模式 vim /etc/NetworkManager/system-connections/eth0.nmconnection [connection] ideth0 typeethernet interface-nameeth0 [ipv4] methodmanual address1192.168.50.0/24,192.168.0.100 # 配置VIPlo接口 vim /etc/NetworkManager/system-connections/lo.nmconnection [connection] idlo typeloopback interface-namelo [ipv4] methodmanual address1127.0.0.1/8 address2192.168.0.200/32 # 重启网络连接 nmcli connection up lo nmcli connection up eth0第二步在RSrs1、rs2上解决VIP冲突修改内核参数# 修改内核参数限制ARP响应和通告 echo 1 /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 /proc/sys/net/ipv4/conf/lo/arp_announce echo 2 /proc/sys/net/ipv4/conf/all/arp_announce # 安装Web服务用于测试 yum install httpd -y # 分别在rs1、rs2上创建测试页面 # rs1 echo RS1 - 192.168.0.10 /var/www/html/index.html # rs2 echo RS2 - 192.168.0.20 /var/www/html/index.html # 启动httpd服务 systemctl start httpd systemctl enable httpd第三步在VSlvs配置调度策略# 安装ipvsadm工具LVS的管理工具 yum install ipvsadm -y # 先清除现有LVS策略 ipvsadm -C # 添加集群服务VIP192.168.0.200端口80调度算法WRR ipvsadm -A -t 192.168.0.200:80 -s wrr # 添加后端RS指定DR模式-g表示DR模式 ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g # 查看LVS策略 ipvsadm -Ln # 保存策略避免重启失效 ipvsadm -Sn /etc/sysconfig/ipvsadm-config # 设置ipvsadm开机自启 systemctl enable --now ipvsadm.service第四步测试LVS集群效果# 循环访问VIP查看响应结果 for N in {1..10};do curl 192.168.0.100;done测试结果5.3 实战二NAT模式部署NAT模式部署无需配置VIP仅VS需要VIP无需解决VIP冲突步骤更简洁适合后端RS数量少的小规模场景以下是完整部署流程环境与DR模式复用仅调整网络和调度配置主机名IP地址网卡模式VIP仅VS配置角色网关关键配置lvs调度器eth0172.25.254.100NAT模式对外通信eth1192.168.0.100仅主机模式对内通信172.25.254.100VS双网卡转发请求无rs1真实服务器192.168.0.10仅主机模式无RSWeb服务器IP192.168.0.100rs2真实服务器192.168.0.20仅主机模式无RSWeb服务器IP192.168.0.100client测试机172.25.254.10NAT模式无测试客户端172.25.254.100NAT模式要求VS具备双网卡外网网卡NAT模式内网网卡仅主机模式负责转发外网请求到内网RSRS网关必须指向VS的内网IP否则响应报文无法返回VS这是NAT模式部署的核心要点。5.3.2 部署步骤第一步配置VSlvs双网卡及内核转发VS作为调度器需配置双网卡外网eth0、内网eth1并开启内核IP转发功能确保请求能正常转发。# 1. 配置外网网卡eth0NAT模式对外暴露VIP vim /etc/NetworkManager/system-connections/eth0.nmconnection [connection] ideth0 typeethernet interface-nameeth0 [ipv4] methodmanual address1172.25.254.100/24 # 此IP即为VIP对外暴露 # 2. 配置内网网卡eth1仅主机模式与RS通信 vim /etc/NetworkManager/system-connections/eth1.nmconnection [connection] ideth1 typeethernet interface-nameeth1 [ipv4] methodmanual address1192.168.0.100/24 # 内网IP与RS同一网段 # 3. 重启网络连接使网卡配置生效 nmcli connection up eth0 nmcli connection up eth1 # 4. 开启内核路由转发功能 echo net.ipv4.ip_forward 1 /etc/sysctl.conf sysctl -p # 5. 清空iptables防火墙策略 iptables -F iptables -t nat -F第二步配置RSrs1、rs2网络及Web服务RS无需配置VIP仅需配置IP、指定网关VS内网IP并安装Web服务用于测试两台RS配置步骤一致仅IP不同。# 1. 配置RS网卡仅主机模式 vim /etc/NetworkManager/system-connections/eth0.nmconnection [connection] ideth0 typeethernet interface-nameeth0 [ipv4] methodmanual address1192.168.0.10/24,192.168.0.100 # IP网关网关必须是VS内网IP # 2. 重启网络连接 nmcli connection up eth0 # 3. 安装Web服务 yum install httpd -y # rs1创建测试页面 echo RS1 - 192.168.0.10 /var/www/html/index.html # rs2创建测试页面 # echo RS2 - 192.168.0.20 /var/www/html/index.html # 4. 启动httpd服务并设置开机自启 systemctl start httpd systemctl enable httpd # 5. 测试RS能否ping通VS内网IP192.168.0.10确保通信正常 ping -c 3 192.168.0.10第三步在VSlvs上配置LVS NAT模式调度策略NAT模式调度策略与DR模式的核心区别的是添加RS时指定-N参数表示NAT模式无需配置VIP到lo接口VIP直接配置在eth0外网网卡。# 1. 安装ipvsadm工具 yum install ipvsadm -y # 2. 清除现有LVS策略 ipvsadm -C # 3. 添加集群服务 ipvsadm -A -t 172.25.254.100:80 -s rr # 4. 添加后端RS指定NAT模式-m表示NAT模式 ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10 -m ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20 -m # 5. 查看LVS策略确认配置生效 ipvsadm -Ln # 正常输出应包含TCP 172.25.254.100:80 rr及两台RS的信息Forward为Masq即NAT模式 # 6. 保存策略避免重启失效 ipvsadm-save /etc/sysconfig/ipvsadm # 7. 设置ipvsadm开机自启确保重启后策略生效 systemctl enable --now ipvsadm.service第四步测试NAT模式LVS集群效果在测试机client上执行循环访问命令for N in {1..10};do curl 172.25.254.100;done结果若测试失败优先检查RS网关是否指向VS内网IP、VS内核转发是否开启、防火墙是否清空。以下实验是在DR模式下进行的5.4 利用火墙标记解决轮询错误以http和https为例当我们在RS中同时开放80和443端口那么默认控制是分开轮询的这样我们就出现了一个轮询错乱的问题当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上因此我们需要解决这个问题1.在rs主机中同时开启http和https两种协议dnf install mod_ssl -y systemctl restart httpd systemctl restart httpd2.在VS调度器中中添加https的轮询策略ipvsadm -A -t 192.168.0.200:80 -s rr ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20 -g ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10 -g ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:443 -g ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g ipvsadm -Ln IP Virtual Server version 1.2.1 (size4096) Prot LocalAddress:Port Scheduler Flags - RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.0.200:80 rr - 192.168.0.10:80 Route 1 0 0 - 192.168.0.20:80 Route 1 0 0 TCP 192.168.0.200:443 rr - 192.168.0.10:443 Route 1 0 0 - 192.168.0.20:4433.使用客户端轮询错误展示curl 192.168.0.200;curl -k https://192.168.0.200 RS2 - 192.168.0.20 RS2 - 192.168.0.204.解决方案使用火墙标记访问vip的80和443的所有数据包设定标记为6666然后对此标记进行负载在vS调度器ptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666 ipvsadm -A -f 6666 -s rr ipvsadm -a -f 6666 -r 192.168.0.10 -g ipvsadm -a -f 6666 -r 192.168.0.20 -g#测试在客户端5.5.lvs持久链接在我们客户上网过程中有很多情况下需要和服务器进行交互客户需要提交响应信息给服务器如果单纯的进行调度会导致客户填写的表单丢失为了解决这个问题我们可以用sh算法但是sh算法比较简单粗暴可能会导致调度失衡解决方案在进行调度时不管用什么算法只要相同源过来的数据包我们就把他的访问记录在内存中也就是把这个源的主机调度到了那个RS上如果在短期默认360S内同源再来访问我仍然按照内存中记录的调度信息把这个源的访问还调度到同一台RS上。如果过了比较长的时间默认最长时间360s同源访问再次来访那么就会被调度到其他的RS上在VS调度器 ipvsadm -A -f 6666 -s rr -p 1 ipvsadm -Ln IP Virtual Server version 1.2.1 (size4096) Prot LocalAddress:Port Scheduler Flags - RemoteAddress:Port Forward Weight ActiveConn InActConn FWM 6666 rr persistent 1 - 192.168.0.10:0 Route 1 0 0 - 192.168.0.20:0 使用客户端 curl 192.168.0.200 RS1 - 192.168.0.10 curl 192.168.0.200 RS1 - 192.168.0.10 在VS调度器 watch -n 1 ipvsadm -Lnc IPVS connection entries pro expire state source virtual destination TCP 01:56 FIN_WAIT 172.25.254.99:42420 192.168.0.200:80 192.168.0.20:80 IP 00:57 ASSURED 172.25.254.99:0 0.0.26.10:0 192.168.0.20:0 TCP 01:54 FIN_WAIT 172.25.254.99:46216 192.168.0.200:80 192.168.0.20:80 TCP 01:55 FIN_WAIT 172.25.254.99:46222 192.168.0.200:80 192.168.0.20:80