LVS (Linux virtual server)

📅 2026/7/29 3:29:51
LVS (Linux virtual server)
LVS Linux virtual serverLVS Linux Virtual Server是LInux内核层实现的高性能、高可用的负载均衡核心作用是将前端的请求流量分发到后端多台真实服务器上提高服务的并发处理能力和可用性一.LVS运行原理1.1 LVS集群体系结构1.2 LVS的相关概念VSVirtual Server调度器RSReal Server业务服务器CIPClient IP客户端的IPVIPVirtual server IP外网的IP用于客户访问DIPDirector IP内网的IP调度器负责访问内网的IPRIPReal Server IP真实的业务服务器访问流程CIP — VIP DIP — RIP1.2.1 LVS的部署命令程序包ipvsadm1.2.1.1 ipvsadm命令核心功能集群服务管理增 删 改集群服务的RS管理增 删 改查看命令参数# 管理集群服务ipvsadm -A添加|E编辑 -ttcp|uudp|f防火墙标签 service-address集群地址[-s scheduler调度算法][-p[timeout]]会话持久[-M netmask]掩码[--pepersistence_engine]引擎类型[-b sched-flags]标记 ipvsadm-D-t|u|f service-address 删除 ipvsadm-C清空 ipvsadm-R重载 ipvsadm-S保存1.2.1.2 LVS集群中的增删改1管理集群服务中的增删改ipvsadm -A | E | u | f service-address-A添加-E修改-ttcp服务-uudp服务-s指定调度算法默认为WLC-p设置持久连接超时-f火墙标记是一个数字2管理集群中RealServer的增删改ipvsadm -a|-e -t|-u|f service-address …-a添加realserver-e修改realserver-ttcp协议-uudp协议-f火墙标记-rrealserver地址-g直连路由模式-iip隧道模式-mnat模式-w设置权重-Z清空计数器-C清空LVS策略-L列出LVS策略--rate输出速率信息1.3 LVS集群的类型LVS-NAT修改请求报文的目标IP多目标的DNATLVS-DR封装新的MAC地址LVS-TUN在请求报文IP报文之外新加一个IP首部LVS-FULLNAT修改请求报文的源和目标IP1.3.1 NAT模式本质是多目标IP的DNAT修改请求报文中的目标地址和目标端口修改为挑出的RS的RIP和PORT实现转发RIP和DIP应在同一个网络且使用私网地址RS的网关要指向DIP请求报文和响应报文都必须经由Director转发支持端口映射可修改的请求报文的目标PORTVS必须是liunx系统RS可以是任意OS系统1.3.1.1 NAT模式数据逻辑1客户端发送请求数据包中包含源IP目标IP和访问端口90002VS服务器收到请求后把数据包中的DIP的VIP换为RS的RIP和相应端口3RS1响应请求发送应答数据包包中包含DIP,SIPPORT90004VS收到应答报文改变包中的数据来源DIP改为VIP目标端口改为80然后传回给客户端1.3.1.2 NAT模式集群案例1VS调度器采用双网卡一个是NAT 连接外网一个是仅主机网卡与后端的服务器相连2Web服务器网关指向DIP并且不需要连接外网1.3.1.2.1 实验环境主机名IPVIP角色LVS192.168.146.100192.168.136.100调度器VSRS1192.168.146.10,GW192.168.146.100null后端服务器1RS2192.168.146.20,GW192.168.146.100null后端服务器2Node192.168.136.10测试机1.3.1.2.2 配置命令注意RS的网关是DIP1RS1[rootRS1 ~]# yum install httpd [rootRS1 ~]# echo RS1 /var/www/html/index.html [rootRS1 ~]# systemctl enable --now httpd2RS2[rootRS2 ~]# yum install httpd [rootRS2 ~]# echo RS2 /var/www/html/index.html [rootRS2 ~]# systemctl enable --now http3,LVS调度器[rootLVS ~]# yum install ipvsadm.x86_64 -y[rootLVS ~]# echo net.ipv4.ip_forward1 /etc/sysctl.conf[rootLVS ~]# sysctl -pnet.ipv4.ip_forward1[rootLVS ~]# ipvsadm -A -t 192.168.136.100:80 -s wrr[rootLVS ~]# ipvsadm -a -t 192.168.136.100:80 -r 192.168.146.10:80 -m -w 1[rootLVS ~]# ipvsadm -a -t 192.168.136.100:80 -r 192.168.146.20:80 -m -w 1[rootLVS ~]# ipvsadm -LnIP Virtual Server version1.2.1(size4096)Prot LocalAddress:Port Scheduler Flags -RemoteAddress:Port Forward Weight ActiveConn InActConn TCP192.168.136.100:80 wrr -192.168.146.10:80 Masq100-192.168.146.20:80 Masq100[rootLVS ~]# systemctl enable --now ipvsadm.service# 测试# 修改权重[rootLVS ~]# ipvsadm -e -t 192.168.136.100:80 -r 192.168.146.10:80 -m -w 2[rootLVS ~]# ipvsadm -LnIP Virtual Server version1.2.1(size4096)Prot LocalAddress:Port Scheduler Flags -RemoteAddress:Port Forward Weight ActiveConn InActConn TCP192.168.136.100:80 wrr -192.168.146.10:80 Masq200-192.168.146.20:80 Masq100[rootLVS ~]# for i in {1..10};do curl 192.168.136.100;doneRS1 RS2 RS1 RS2 RS1 RS2 RS1 RS2 RS1 RS2# 修改权重[rootLVS ~]# ipvsadm -e -t 192.168.136.100:80 -r 192.168.146.10:80 -m -w 2[rootLVS ~]# ipvsadm -LnIP Virtual Server version1.2.1(size4096)Prot LocalAddress:Port Scheduler Flags -RemoteAddress:Port Forward Weight ActiveConn InActConn TCP192.168.136.100:80 wrr -192.168.146.10:80 Masq200-192.168.146.20:80 Masq100[rootLVS ~]#[rootLVS ~]# for i in {1..10};do curl 192.168.136.100;doneRS2 RS1 RS1 RS2 RS1 RS1 RS2 RS1 RS1 RS21.3.2 DR模式DRDirect Routing直接路由LVS默认模式应用最广泛通过给请求报文重新封装一个MAC首部进行转发源MAC是DIP所在的接口MAC目标MAC是某挑选出RS的RIP所在接口的MAC地址源IP/PORT以及目标IP/PORT均保持不变1.3.2.1 DR模式数据逻辑在DR模式中RS接收到访问请求后不需要回传给LVS调度器直接把数据回传给Client所有RS和VS上都要有VIP1.3.2.2 DR模式数据传输过程1客户端发送请求报文给到VS调度器内容为客户端IP客户端MACVIPVIP的MAC2VS调度器接收到报文后把里面的VIP的MAC改为RS1的MAC3RS1回复响应报文数据包中内容为VIPRS1的MAC客户端IP客户端IP的MAC1.3.2.3 DR模式的特点1Director和各RS都配置有VIP2确保前端路由器将目标IP为VIP的请求报文发往Director3 在前端网关做静态绑定VIP和Director的MAC地址4RS的RIP可以使用私网地址也可以是公网地址RIP和DIP在同一IP网络5RIP的网关不能指向DIP以确保响应报文不会经由Director6RS和Director要在同一个物理网络7响应报文直接发往Client8不支持端口映射1.3.2.4 部署DR模式集群案例1.3.2.4.1 实验环境1.3.2.4.2 配置命令RS的配置与NAT模式的配置相同1DR# 开启内核路由功能[rootDR ~]# echo net.ipv4.ip_forward1 /etc/sysctl.conf[rootDR ~]# sysctl -pnet.ipv4.ip_forward1# 数据转发策略[rootDR ~]# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.146.100[rootDR ~]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.136.100# 配置网络[rootDR ~]# sh vmset.sh eth0 192.168.136.100 DR[rootDR ~]# sh vmset.sh eth1 192.168.146.10 DR2,LVS调度器# 添加VIP[rootLVS ~]# vim /etc/NetworkManager/system-connections/lo.nmconnection[connection]idlotypeloopback interface-namelo[ipv4]methodmanualaddress1127.0.0.1/8address2192.168.146.100/32# vip# 注意网关[rootLVS ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection[connection]ideth0uuidcdf80ff8-490d-4a3e-a1ec-90910407a6e7typeethernet interface-nameeth0[ipv4]methodmanualaddress1192.168.146.200/24,192.168.146.10# 网关为DR对内网卡的IPdns8.8.8.8# 添加策略[rootLVS ~]# ipvsadm -A -t 192.168.146.100:80 -s wrr[rootLVS ~]# ipvsadm -a -t 192.168.146.100:80 -r 192.168.146.101:80 -g[rootLVS ~]# ipvsadm -a -t 192.168.146.100:80 -r 192.168.146.102:80 -g[rootLVS ~]# ipvsadm -LnIP Virtual Server version1.2.1(size4096)Prot LocalAddress:Port Scheduler Flags -RemoteAddress:Port Forward Weight ActiveConn InActConn TCP192.168.146.100:80 wrr -192.168.146.101:80 Route100-192.168.146.102:80 Route100# 测试[Administrator.WIN-G01HRFS4OB1]⮞forNin{1..6};docurl192.168.146.100;doneRS2 RS1 RS2 RS1 RS2 RS11.3.3 TUN模式转发方式不修改请求报文的IP头部而在IP头部另外封装一个IP头部将报文发往挑选出的目标RSRS直接响应给客户端1.3.3.1 TUN模式数据传输过程1客户端发送请求报文包含源IPVIP端口2到达VS调度器给客户端发来的数据重新添加IP报文头部添加的报文头部包含DIPRS发送到对应的RS3RS收到调度器发送的数据包做出响应生成的响应包含VIPCIPport直接传输给client1.3.3.2 TUN模式特点1DIPVIPRIP都是公网地址2RS的网关一般不能指向DIP3请求报文要经由Director但响应是直接给Director4不支持端口映射5RS的OS必须支持隧道功能1.3.4 Fullnet 模式fullnat通过同时修改请求报文的源IP地址和目标IP地址进行转发1.4 LVS工作模式总结NAT模式TUN模式DR模式RS操作系统不限支持隧道禁用arp调度器和服务器网络可跨网络可跨网络不可跨网络调度服务器数量服务器数量少多多RS服务器网关指向到调度器DIP指向到路由指向到路由LVS-NAT与LVS-fullnat请求和响应报文都经由DirectorLVS-NATRIP的网关要指向DIPLVS-FullnatRIP和DIP未必在同一网络但要能通信LVS-DR和LVS-TUN请求报文要经由Director但响应报文由RS直接发往ClientLVS-DR通过封装新的MAC首部实现通过MAC网络转发LVS-TUN通过在源IP报文首部添加新IP头部转发实现远距离传输1.5 LVS调度算法1.5.1 LVS调度算法类型ipvs scheduler根据其调度时是否考虑各RS当前的负载状态被分为两种静态和动态算法静态算法仅根据算法本身进行调度不考虑RS的负载情况动态算法主要依据RS的当前负载状态及调度算法进行调度Overheadvalue较小的RS将被调度1.5.2 LVS静态调度算法1RRRoundrobin轮询 RS将被分别调度RS配置有差别时不推荐2WRRWeight Roundrobin 加权轮询 根据RS的配置进行加权调度3SHSource Hashing 实现session sticky源地址hash将来自于同一个IP地址的请求始终发往第一次挑选中的RS实现会话绑定4DHDestination Hashing 目标地址哈希第一次轮询调度至RS后续将发往同一个目标地址的请求始终转发至第一次挑中的RS1.5.3 LVS动态调度算法主要依据当前RS的负载状态进行调度1LCLeast Connections — 最少连接法适用于长连接应用Overhead负载值 activeconns活动连接数* 256 inactiveconns而非活动连接数2WLCWeight LC — 权重最少连接默认调度方法为Onerheadconnections * 256 inconnections/weight3SDEShortest Expection Delay初始连接高权重优先Overheadactiveconns 1 inactiveconns * 256 / weight4NQNever Queue第一轮均匀分配后续SED5LBLCLocality-Based LC动态的DH算法6LBLCRLBLC with Reolication带复制功能的LBLC解决LBLC负载不均衡问题从负载重的复制到负载轻的