一:LVS简介
LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案。
1.LVS的实现原理和作用,它能够实现高性能、高可用性的负载均衡集群,具有良好的可靠性、可扩展性和可操作性。LVS通过IOS提供的负载均衡技术和LINUX操作系统实现高性能高可用的服务器集群 。LVS具有超强的承载能力和并发处理能力,支持上万并发连接。
2.LVS(Linux Virtual Server)的优点:基于IP加端口做分发、性能强、稳定性好、成本低廉、配置简单、支持多种算法和工作模式。 LVS是基于IP加端口,工作在网络四层之上,仅做分发使用。LVS性能最强,稳定性最好,内存和CPU资源消耗最低,成本低廉。 LVS支持多种工作模式,可根据业务场景使用不同的工作模式解决请求处理问题。
3.LVS的核心组件,包括基于内核的工作模式和服务器端、客户端的管理工具,以及VS、DR、RS等专业术语的含义。LVS的核心组件分为基于内核的服务器端和客户端 IP vs是运行在内核上的程序,是实现LVS功能的室内核模块 DR是负载均衡器,real server是真正的服务器,会标注在设备上
4.负载均衡器相关的专业术语,包括客户端IP、虚拟IP、负载均衡IP、后端请求处理服务器IP等,对理解负载均衡技术有帮助。后端请求处理服务器是用来处理来自负载均衡器分发的请求 负载均衡器有两个IP,一个是负载均衡IP(dip),一个是虚拟IP(VIP) real server IP是web服务器的IP地址,全称real se。
二:LVS负载均衡四种工作模式
LVS/NAT:网络地址转换模式,进站/出站的数据流量经过分发器(IP负载均衡,他修改的是IP地址)-利用三层功能。
LVS/DR:直接路由模式,只有进站的数据流量经过分发器(数据链路层负载均衡,因为他修改的是目的mc地址)-利用二层功能mac地址。
LVS/TUN:隧道模式,只有进站的数据流量经过分发器。
LVS/ful-nat:双向转换:通过请求报文的源地址为DIP,目标为RIP来实现转发:对于响应报文而言,修改源地址为VIP,目标地址为CIP来实现转发。
nat模式
- 客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP)访问目标端口(9000port)
- VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口
- RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口(9000port)
- VS服务器接收到响应数据包,改变包中的数据来源(RIP1-->VIP),响应目标端口(9000-->80)
- VS服务器把修改过报文的响应数据包回传给客户端
- lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞
客户请求到达vip后进入PREROUTING,在没有ipvs的时候因该进入本机INPUT,当IPVS存在后访问请求在通过PREROUTING后被ipvs结果并作nat转发
因为ipvs的作用点是在PREROUTING和INPUT链之间,所以如果在prerouting中设定规则会干扰ipvs的工作。所以在做lvs时要把iptables的火墙策略全清理掉。
DR模式
DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源 IP/PORT,以及目标IP/PORT均保持不变
DR模式数据传输过程
- 客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC
- VS调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC,此时帧中的数据为客户端IP+客户端的MAC+VIP+RS1的MAC
- RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的 MAC
三:LVS部署NAT模式集群案例
3.1:4台主机的IP地址配置
红帽9虚拟机充当LVS主机,设置两个网络类型NAT模式和仅主机模式。
LVS主机ip地址
红帽9虚拟机充当websever1
红帽9虚拟机充当websever2
3.2:LVS主机开启内核
打开路由功能,进行刷新
[root@localhost ~]# sysctl -a |grep ip_forward
[root@localhost ~]# vim /etc/sysctl.conf
[root@localhost ~]# sysctl -p
3.3:安装外部服务httpd
websever1安装外部服务httpd,启动httpd
[root@localhost ~]# yum install httpd
[root@localhost ~]#systemctl enable --now httpd
[root@localhost ~]#echo websever1 - 192.168.0.20 > /var/www/html/index.html
websever2安装外部服务httpd
[root@localhost ~]# yum install httpd
[root@localhost ~]#systemctl enable --now httpd
[root@localhost ~]#echo websever2 - 192.168.0.20 > /var/www/html/index.html
3.4:LVS安装策略
修改为权重调用算法
[root@localhost ~]# yum install ipvsadm
[root@localhost ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@localhost ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@localhost ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
测试效果
[Administrator.WIN-20240602BIS] ➤ for N in {1..6};do curl 172.25.254.100;done
RS2 server - 192.168.0.10
RS1 server - 192.168.0.20
RS1 server - 192.168.0.10
RS2 server - 192.168.0.20
RS1 server - 192.168.0.10
RS1 server - 192.168.0.20
四:LVS部署DR模式集群案例
4.1:5台主机的IP地址配置
1.实验使用虚拟机9充当LVS主机(网络类型为仅主机模式)
192.168.0.50(网关192.168.0.100)
2.两台主机以虚拟机9模拟用户为websever1(192.168.0.10)网关192.168.0.100(主机IP地址)
websever2(192.168.0.20)网关192.168.0.100。
websever1的ip地址(网络类型为仅主机模式)
websever2的IP地址(网络类型为仅主机模式)
3.routher主机(网络类型为仅主机模式)
192.168.0.100(无需网关)
172.25.254.100(网关172.25.254.2)
client客户端主机(网络类型为NAT模式)
172.25.254.200(网关172.25.254.100)
4.2:LVS主机配置策略
安装ipvsadm,, yum install ipvsadm
ip a a 192.168.0.200/32 dev lo
ipvsadm -A -t 192.168.0.200:80 -s wrr
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2
检测策略
[root@localhost ~]# ipvsadm -Ln
4.3:routher主机开启内核路由
[root@localhost ~]# vim /etc/sysctl.conf
开启生效
4.4:websever1和websever2使vip不对外显示,两台虚拟机都要配置
websever1
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
websever2
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
LVS,websever1和websever2三台主机添加VIP192.168.0.200
LVS主机
[root@localhost ~]# ip a a 192.168.0.200/32 dev lo
websever1主机
[root@localhost ~]# ip a a 192.168.0.200/32 dev lo
websever2主机
[root@localhost ~]# ip a a 192.168.0.200/32 dev lo
测试效果
[root@node10 ~]# for N in {1..6};do curl 192.168.0.200;done
RS2 server - 192.168.0.10
RS1 server - 192.168.0.20
RS2 server - 192.168.0.10
RS1 server - 192.168.0.20
RS2 server - 192.168.0.10
RS1 server - 192.168.0.20
五:LVS算法
5.1:lvs的调度算法
LVS调度算法有多种分类,其中最常见的有静态调度算法和动态调度算法。静态调度算法是指按照固定的规则将请求分配给服务器,如轮询调度算法(Round Robin,RR)、源地址散列(Source Hashing,SH)和目标地址散列(Destination Hashing,DH)。动态调度算法则是根据服务器的负载情况动态地分配请求,如最少连接调度算法(Least Connections,LC)。
ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态被分为两种:静态方法和动态方法静态方法:仅根据算法本身进行调度,不考虑RS的负载情况
动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
5.2:lvs静态调度算法
1、RR:roundrobin 轮询 RS分别被调度,当RS配置有差别时不推荐
2、WRR:Weighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
3、SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
4、DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
5.3:lvs动态调度算法
主要根据RS当前的负载状态及调度算法进行调度Overhead=value较小的RS会被调度
1、LC:least connections(最少链接发)
适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活动链接数)
2、WLC:Weighted LC(权重最少链接)
默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight 3、SED:Shortest Expection Delay,
初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight
但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接
4、NQ:Never Queue,第一轮均匀分配,后续SED
5、LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
6、LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS
六:ipvsadm工具使用
- 工作在内核空间的IPVS模块。LVS的能力实际上都是由IVPS模块实现。
- 工作在用户空间的ipvsadm管理工具。其作用是向用户提供一个命令接口,用于将配置的虚拟服务、真实服务等传给IPVS模块。
-A --add-service | 添加一条新的虚拟服务 |
-E --edit-service | 编辑虚拟服务 |
-D --delete-service | 删除虚拟服务 |
-C --clear | 清除所有的虚拟服务规则 |
-R --restore | 恢复虚拟服务规则 |
-a --add-server | 在一个虚拟服务中添加一个新的真实服务器 |
-e --edit-server | 编辑某个真实服务器 |
-d --delete-server | 删除某个真实服务器 |
-L | -l --list | 显示内核中的虚拟服务规则 |
-n --numeric | 以数字形式显示IP端口 |
-c --connection | 显示ipvs中目前存在的连接,也可以用于分析调度情况 |
-Z --zero | 将转发消息的统计清零 |
-p --persistent | 配置持久化时间 |
--set tcp tcpfin udp | 配置三个超时时间(tcp/tcpfin/udp) |
-t | -u | TCP/UDP协议的虚拟服务 |
-g | -m | -i | LVS模式为:DR | NAT | TUN |
-w | 配置真实服务器的权重 |
-s | 配置负载均衡算法,如:rr, wrr, lc等 |
--timeout | 显示配置的tcp/tcpfin/udp超时时间 |
--stats | 显示历史转发消息统计(累加值) |
--rate | 显示转发速率信息(瞬时值) |
示例:
6.1: 管理虚拟服务
添加一个虚拟服务192.168.1.100:80,使用轮询算法
ipvsadm -A -t 192.168.1.100:80 -s rr
修改虚拟服务的算法为加权轮询
ipvsadm -E -t 192.168.1.100:80 -s wrr
删除虚拟服务
ipvsadm -D -t 192.168.1.100:80
6.2: 管理真实服务
添加一个真实服务器192.168.1.123,使用DR模式,权重2
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.123 -g -w 2
修改真实服务器的权重
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.123 -g -w 5
删除真实服务器
ipvsadm -d -t 192.168.1.100:80 -r 192.168.1.123
6.3.:查看统计
查看当前配置的虚拟服务和各个RS的权重
ipvsadm -Ln
查看当前ipvs模块中记录的连接(可用于观察转发情况)
ipvsadm -lnc
查看ipvs模块的转发情况统计
ipvsadm -Ln --stats | --rate
6.4:stat选项是统计自该条转发规则生效以来的包
1. Conns (connections scheduled) 已经转发过的连接数
2. InPkts (incoming packets) 入包个数
3. OutPkts (outgoing packets) 出包个数
4. InBytes (incoming bytes) 入流量(字节)
5. OutBytes (outgoing bytes) 出流量(字节)
6.5:ate选项是显示速率信息
1. CPS (current connection rate) 每秒连接数
2. InPPS (current in packet rate) 每秒的入包个数
3. OutPPS (current out packet rate) 每秒的出包个数
4. InBPS (current in byte rate) 每秒入流量(字节)
5. OutBPS (current out byte rate) 每秒入流量(字节)