LVS (Linx Virtual Server)

📅 发布时间:2026/7/3 8:38:58 👁️ 浏览次数:
LVS (Linx Virtual Server)
一、LVS运行原理1. LVS简介LVSLinux Virtual Server是Linux内核层实现高性能、高可用的负载均衡集群技术。核心是将前端调度器VS的请求数据分发到后端多台真实服务器RS从而提升服务的并发处理能力和可用性VS: Virtual Server负责调度RS:RealServer负责真正提供服务LVS 官网http://www.linuxvirtualserver.org/2. LVS集群结构工作原理 VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS根据调度算法来挑选RSVSVirtual Server调度器RSReal Server 真实业务主机CIPClient IP 客户端主机的ipVIP: Virtual serve IP VS外网的IP 对外开放的让客户访问的ipDIP: Director IP VS内网的IP 调度器负责访问内网的ipRIP: Real server IP 真实业务主机IP3. lvs集群的类型lvs-nat 修改请求报文的目标IP,多目标IP的DNATlvs-dr 操纵封装新的MAC地址lvs-tun 在原请求IP报文之外新加一个IP首部lvs-fullnat 修改请求报文的源和目标IP3.1 NAT模式第一层物理层第二层MAC第三层IP第四层端口# nat模式走的是第三层修改ip地址可以跨网络# 真实nat环境下后台服务器rs建议不超过10台不然会导致调度器响应不过来# Ivs-nat:本质是多目标IP的DNAT通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和 PORT实现转发RIP和DIP应在同一个IP网络且应使用私网地址;RS的网关要指向DIP请求报文和响应报文都必须经由Director转发Director易于成为系统瓶颈支持端口映射可修改请求报文的目标PORTVS必须是Linux系统RS可以是任意OS系统# 访问流程客户端发送访问请求请求数据包中含有请求来源cip访问目标地址VIP访问目标端口 9000portVS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口RS1相应请求发送响应数据包包中的相应保温为数据来源RIP1响应目标CIP相应端口 9000portVS服务器接收到响应数据包改变包中的数据来源RIP1--VIP,响应目标端口9000--80VS服务器把修改过报文的响应数据包回传给客户端lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机所以lvs的调度机容易阻塞3.2 DR模式在nat模式下数据来回传输都要通过调度器所以当后台服务器超过10台时会导致调度器响应不过来因此出现dr模式dr模式下rs收到请求后不会将数据传回给vs而是直接传给用户所以rs和vs上同时有vipdr模式和nat模式不一样dr模式走的是第二层修改mac地址不能跨网络# 访问流程客户端发送数据帧给vs调度主机帧中内容为客户端IP客户端的MACVIPVIP的MACVS调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC此时帧中的数据为客户端IP客户端 的MACVIPRS1的MACRS1得到2中的数据包做出响应回传数据包数据包中的内容为VIPRS1的MAC客户端IP客户端IP的 MAC二、LVS调度算法ipvs scheduler根据其调度时是否考虑各RS当前的负载状态被分为两种静态方法和动态方法静态方法仅根据算法本身进行调度不考虑RS的负载情况动态方法主要根据每RS当前的负载状态及调度算法进行调度Overheadvalue较小的RS将被调度1.LVS静态调度算法RRroundrobin 轮询 RS分别被调度当RS配置有差别时不推荐WRRWeighted RR加权轮询根据RS的配置进行加权调度性能差的RS被调度的次数少SHSource Hashing实现session sticky源IP地址hash将来自于同一个IP地址的请求始终发往 第一次挑中的RS从而实现会话绑定DHDestination Hashing目标地址哈希第一次轮询调度至RS后续将发往同一个目标地址的请 求始终转发至第一次挑中的RS典型使用场景是正向代理缓存场景中的负载均衡如宽带运营商2.LVS动态调度算法LCleast connections最少链接发 适用于长连接应用Overhead负载值activeconns活动链接数 x 256inactiveconns非活 动链接数WLCWeighted LC权重最少链接 默认调度方法Overhead(activeconns x 256inactiveconns)/weightSEDShortest Expection Delay, 初始连接高权重优先Overhead(activeconns1inactiveconns) x 256/weight 但是当node1的权重为1node2的权重为10经过运算前几次的调度都会被node2承接NQNever Queue第一轮均匀分配后续SEDLBLCLocality-Based LC动态的DH算法使用场景根据负载状态实现正向代理LBLCRLBLC with Replication带复制功能的LBLC解决LBLC负载不均衡问题从负载重的复制 到负载轻的RS3.在4.15版本内核以后新增调度算法# FO(Weighted Fai Over)调度算法常用作灰度发布在此FO算法中遍历虚拟服务所关联的真实服务器链表找到还未过载(未设置IP_VS_DEST_F OVERLOAD标志)的且权重最高的真实服务器进行调度当服务器承接大量链接我们可以对此服务器进行过载标记IP_VS_DEST_F OVERLOAD那么vs调度 器就不会把链接调度到有过载标记的主机中。# OVF(Overflow-connection)调度算法基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器直到其活动 连接数量超过权重值之后调度到下一个权重值最高的真实服务器,在此OVF算法中遍历虚拟服务相关 联的真实服务器链表找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条 件: 未过载(未设置IP_VS_DEST_F OVERLOAD标志) 、真实服务器当前的活动连接数量小于其权重值、其权重值不为零三、NAT实验1.NAT的实验环境# 实验幻境至少需要3台主机一台调度器vsnode两台真实服务器rs1和rs2# vsnode有两张网卡——NAT和仅主机模式的网卡# rs1和rs2都是仅主机模式的网卡# 配置vsnode环境[rootvsnode ~]# ip.sh eth0 192.168.153.100 vsnode[rootvsnode ~]# ip.sh eth1 172.25.254.100 vsnode noroute# 配置rs1环境[rootrs1 ~]# ip.sh eth0 172.25.254.10 rs1 noroute[rootrs1 ~]# nmcli connection modify eth0 ipv4.gateway 172.25.254.100[rootrs1 ~]# nmcli connection reload[rootrs1 ~]# nmcli connection up eth0[rootrs1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection[rootrs1 ~]# route -n[rootrs1 ~]# dnf install httpd -y[rootrs1 ~]# systemctl enable --now httpd[rootrs1 ~]# echo rs1 - 172.25.254.10 /var/www/html/index.html# 配置rs2环境[rootrs2 ~]# ip.sh eth0 172.25.254.20 rs2 noroute[rootrs2 ~]# nmcli connection modify eth0 ipv4.gateway 172.25.254.100[rootrs2 ~]# nmcli connection reload[rootrs2 ~]# nmcli connection up eth0[rootrs2 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection[rootrs2 ~]# route -n[rootrs2 ~]# dnf install httpd -y[rootrs2 ~]# systemctl enable --now httpd[rootrs2 ~]# echo rs2 - 172.25.254.20 /var/www/html/index.html# 在vsnode上测试网络[rootvsnode ~]# curl 172.25.254.10rs1 - 172.25.254.10[rootvsnode ~]# curl 172.25.254.20rs2 - 172.25.254.202.NAT模式实现2.1添加策略# 在vsnode做配置开启内核路由功能编写策略[rootvsnode ~]# echo net.ipv4.ip_forward1 /etc/sysctl.conf[rootvsnode ~]# sysctl -p[rootvsnode ~]# dnf install ipvsadm-1.31-6.el9.x86_64 -y[rootvsnode ~]# ipvsadm -C[rootvsnode ~]# ipvsadm -A -t 192.168.153.100:80 -s wrr[rootvsnode ~]# ipvsadm -a -t 192.168.153.100:80 -r 172.25.254.10:80 -m -w 1[rootvsnode ~]# ipvsadm -a -t 192.168.153.100:80 -r 172.25.254.20:80 -m -w 1[rootvsnode ~]# ipvsadm -Ln# 测试[rootvsnode ~]# for i in {1..10};do curl 192.168.153.100;done2.2更改权重更改rs1的权重为3rs2的权重不变为1则访问时访问rs1 3次访问rs2 1次[rootvsnode ~]# ipvsadm -e -t 192.168.153.100:80 -r 172.25.254.10:80 -m -w 3[rootvsnode ~]# ipvsadm -Ln[rootvsnode ~]# for i in {1..10};do curl 192.168.153.100;done3.规则持久化3.1自定义文件持久化用“ipvsadm-save -n”-n不做解析查看IPVS规则将显示的信息覆盖到这个新建的文件ipvsadm.rule里在清空规则进行测试[rootvsnode ~]# ipvsadm-save -n[rootvsnode ~]# ipvsadm-save -n /mnt/ipvsadm.rule[rootvsnode ~]# ipvsadm -C[rootvsnode ~]# ipvsadm -Ln[rootvsnode ~]# ipvsadm-restore /mnt/ipvsadm.rule[rootvsnode ~]# ipvsadm -Ln3.2守护进程持久化在使用自定义文件持久化时当系统重启后IPVS规则会自动消失需要手动恢复规则“ipvsadm-restore /mnt/ipvsadm.rule”# 可以利用守护进程让系统开机时自动读取文件“/etc/sysconfig/ipvsadm”获取规则[rootvsnode ~]# systemctl restart ipvsadm.service[rootvsnode ~]# systemctl status ipvsadm.service[rootvsnode ~]# ipvsadm-save -n /etc/sysconfig/ipvsadm[rootvsnode ~]# ipvsadm -Ln[rootvsnode ~]# ipvsadm -C[rootvsnode ~]# ipvsadm -Ln[rootvsnode ~]# systemctl enable --now ipvsadm.service[rootvsnode ~]# ipvsadm -Ln四、DR实验1. DR的实验环境实验环境至少需要5台主机一台客户端NAT一台路由器NAT仅主机一台调度器仅主机两台真实服务器rs1和rs2仅主机1.1配置客户端环境配置IP地址网关配置路由器ip[rootclient ~]# ip.sh eth0 192.168.153.99 client[rootclient ~]# nmcli connection modify eth0 ipv4.gateway 192.168.153.100[rootclient ~]# nmcli connection reload[rootclient ~]# nmcli connection up eth0[rootclient ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection[rootclient ~]# route -n1.2配置路由器环境配置IP地址开启内核路由功能添加数据转发策略[rootrouter ~]# ip.sh eth0 192.168.153.100 router[rootrouter ~]# ip.sh eth1 172.25.254.100 router noroute[rootrouter ~]# echo net.ipv4.ip_forward1 /etc/sysctl.conf[rootrouter ~]# sysctl -p[rootrouter ~]# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 172.25.254.100[rootrouter ~]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.153.100[rootrouter ~]# iptables -t nat -nL1.3配置调度器环境配置IP地址添加网关和vip环回口[rootvsnode ~]# ip.sh eth0 172.25.254.201 vsnode noroute[rootvsnode ~]# nmcli connection modify eth0 ipv4.gateway 172.25.254.100[rootvsnode ~]# nmcli connection modify lo ipv4.addresses 172.252.54.200/32[rootvsnode ~]# nmcli connection reload[rootvsnode ~]# nmcli connection up eth0[rootvsnode ~]# nmcli connection up lo[rootvsnode ~]# ip a[rootvsnode ~]# route -n1.4配置rs1环境# 配置IP地址添加网关和vip环回并添加arp禁止响应# 限制响应级别:arp_ignore0默认值接收并回复1接收但不回复# 限制通告级别:arp_announce0默认值接收并回复1不接收2接受但不回复[rootrs1 ~]# ip.sh eth0 172.25.254.10 rs1 noroute[rootrs1 ~]# nmcli connection modify eth0 ipv4.gateway 172.25.254.100[rootrs1 ~]# nmcli connection modify lo ipv4.addresses 172.25.254.200/32[rootrs1 ~]# nmcli connection reload[rootrs1 ~]# nmcli connection up eth0[rootrs1 ~]# nmcli connection up lo[rootrs1 ~]# ip a[rootrs1 ~]# echo 1 /proc/sys/net/ipv4/conf/all/arp_ignore[rootrs1 ~]# echo 1 /proc/sys/net/ipv4/conf/lo/arp_ignore[rootrs1 ~]# echo 2 /proc/sys/net/ipv4/conf/all/arp_announce[rootrs1 ~]# echo 2 /proc/sys/net/ipv4/conf/lo/arp_announce1.5配置rs2环境模仿rs1配置IP地址添加网关和vip环回并添加arp禁止响应[rootrs2 ~]# ip.sh eth0 172.25.254.20 rs2 noroute[rootrs2 ~]# nmcli connection modify eth0 ipv4.gateway 172.25.254.100[rootrs2 ~]# nmcli connection modify lo ipv4.addresses 172.25.254.200/32[rootrs2 ~]# nmcli connection reload[rootrs2 ~]# nmcli connection up eth0[rootrs2 ~]# nmcli connection up lo[rootrs2 ~]# ip a[rootrs2 ~]# echo 1 /proc/sys/net/ipv4/conf/all/arp_ignore[rootrs2 ~]# echo 1 /proc/sys/net/ipv4/conf/lo/arp_ignore[rootrs2 ~]# echo 2 /proc/sys/net/ipv4/conf/all/arp_announce[rootrs2 ~]# echo 2 /proc/sys/net/ipv4/conf/lo/arp_announce1.6测试环境# 测试全网可通[rootclient ~]# ping 172.25.254.10[rootclient ~]# ping 172.25.254.20[rootrs2 ~]# ping 172.25.254.100[rootrs2 ~]# ping 192.168.153.1002. DR模式实现# 添加轮询算法rr# 因为dr模式走的是第二层修改mac地址指定rs的算法时不能跨端口[rootvsnode ~]# dnf install ipvsadm-1.31-6.el9.x86_64 -y[rootvsnode ~]# ipvsadm -C[rootvsnode ~]# ipvsadm -A -t 172.25.254.200:80 -s rr[rootvsnode ~]# ipvsadm -a -t 172.25.254.200:80 -r 172.25.254.10:80 -g -w 1[rootvsnode ~]# ipvsadm -a -t 172.25.254.200:80 -r 172.25.254.20:80 -g -w 1[rootvsnode ~]# ipvsadm-save -n[rootvsnode ~]# ipvsadm-save -n /etc/sysconfig/ipvsadm[rootvsnode ~]# systemctl restart ipvsadm.service# 配置apache服务进行测试# 最后实现的效果和nat模式大差不差是因为用的算法类似但是dr模式最后结果即数据是由rs真实服务器提供的而nat模式的数据是由vs调度器提供的[rootrs1 ~]# dnf install httpd -y[rootrs1 ~]# echo rs1 - 172.25.254.10 /var/www/html/index.html[rootrs1 ~]# systemctl restart httpd.service[rootrs2 ~]# dnf install httpd -y[rootrs2 ~]# echo rs2 - 172.25.254.20 /var/www/html/index.html[rootrs2 ~]# systemctl restart httpd.service[rootclient ~]# for i in {1..10};do curl 172.25.254.200;done