一、LVS是什么?
Linux Virtual Server ,即Linux虚拟服务器,LVS主要用于多服务器的负载均衡。工作在网络4层,主要用来实现高性能,高可用的服务器集群。具有易用、配置简单、负载均衡方式多样的特点,同时稳定可靠、可拓展性较好。
目标是通过集群和Linux操作系统实现一个高性能、高可用的服务器,具有较好的可伸缩性。
二、LVS基础
1.LVS组成:由2部分程序组成,为ipvs和ipvsadm
相关名词解释:
DS:director server,即负载均衡器,根据一定的负载均衡算法将流量分发到后端的真实服务器上
RS:real server 真实的提供服务的server,可被DS划分到一个或多个负载均衡组.
BDS:backup director server,为了保证负载均衡器的高可用衍生出的备份.
VS:vitual server,负载均衡集群对外提供的IP+Port.
VIP:VS的IP,client请求服务的DIP(destination IP address),定义在DS上,client或其网关需要有其路由
2.Lvs的优点:
高性能:LVS工作在内核层,性能高效,能够处理大量并发请求。
高可用性:通过配置Keepalived等工具,LVS可以实现高可用性,确保服务的持续运行。
灵活性强:支持多种负载均衡算法和工作模式,适应不同的应用场景。
三.Lvs架构
Lvs整体架构:
LVS的整体架构主要包括负载均衡器(Load Balancer)、后端服务器(Real Server)和客户端三部分。客户端的请求首先到达负载均衡器,然后由负载均衡器根据一定的调度算法将请求转发到后端服务器进行处理,处理结果再返回给客户端。
四.Lvs工作模式
LVS支持三种主要的工作模式:
LVS-NAT(Network Address Translation):在该模式下,负载均衡器不仅需要修改请求报文的目标地址,还需要修改响应报文的源地址,适用于小规模集群。
LVS-DR(Direct Routing):在该模式下,负载均衡器只修改请求报文的目标MAC地址,而不修改IP地址,后端服务器直接将响应报文发回客户端,适用于大规模集群。
LVS-TUN(IP Tunneling):该模式通过IP隧道将请求转发到后端服务器,后端服务器直接将响应报文发回客户端,适用于地理位置分散的集群。
五.Lvs调度算法
调度算法类型:
根据其调度时是否考虑各RS当前的负载状态被分为两种:静态方法和动态方法。静态方法:仅根据算法本身进行调度,不考虑RS的负载情况。动态方法:主要根据每RS当前的负载状态及调度算法进行调度。
静态算法:
1. 轮询(Round Robin,RR):将请求依次分配给各个真实服务器,依次循环。
2. 加权轮询(Weighted Round Robin,WRR):给每个真实服务器设置一个权重,根据权重的比例将请求分配给服务器。权重越高,分配到的请求越多。
3.目标地址散列(Destination Hashing, DH):根据请求的目标 IP 地址进行哈希运算,将请求分配到固定的服务器。
4.源地址散列(Source Hashing, SH):根据请求的源 IP 地址进行哈希运算,将请求分配到固定的服务器。
动态算法:
1. 最少连接(Least Connections,LC):将新的请求分配给当前连接数最少的真实服务器。
2. 加权最少连接(Weighted Least Connections,WLC):为真实服务器设置权重,综合考虑服务器的权重和当前连接数来分配请求。
3. 基于局部性的最少连接(Locality-Based Least Connections,LBLC):主要考虑请求的目标 IP 地址,优先将请求分配给同一 IP 地址对应的真实服务器。
4. 带复制的基于局部性最少连接(Locality-Based Least Connections with Replication,LBLCR):结合了 LBLC 和复制功能,对于目标 IP 地址相同的请求,如果对应的真实服务器没有活动连接,则可以在有活动连接的真实服务器中选择一个,并复制该连接。
六.Lvs的nat模式
实验环境:三个虚拟机。其中lvs需要两个网络适配器,其中一个为nat模式,一个为仅主机模式。而server1和server2均为仅主机模式。
Lvs主机:
[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth1.connection
[connection]
id=eth1
type=ethernet
interface-name=eth1
[ipv4]
address1=192.168.0.100/24
method=manual
nmcli c reload
nmcli c up eth1
server1:
[root@webserver1 ~]# cat /etc/NetworkManager/system-connections/eth0.connection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual
nmcli c reload
nmcli c up eth0
server2:
[root@webserver2 ~]# cat /etc/NetworkManager/system-connections/eth0.connection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=192.168.0.20/24,192.168.0.100
method=manual
nmcli c reload
nmcli c up eth0
在Lvs中启用内核路由功能:
vim /etc/sysctl.conf
net.ipv4.ip_forwaed = 1
sysctl -p
Lvs安装ipvsadm:
yum install ipvsadm -y
Lvs添加策略:
ipvsadm -A -t 172.25.254.100:80 -s rr
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
ipvsadm -Ln
watch -n 1 ipvsadm -Ln --rate
server1和server2中配置:
yum install httpd -y
echo webserver1-192.168.0.10 > /var/www/html/index.html #server1
echo webserver1-192.168.0.20 > /var/www/html/index.html #server2
在client上测试:
[root@client ~]# for i in {1..10}; do curl 172.25.254.100; done
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
七.Lvs的dr模式
DR模式的特点:
1.Director 和各 RS 都配置有 VIP
2. 确保前端路由器将目标 IP 为 VIP 的请求报文发往 Director
3. 在前端网关做静态绑定 VIP 和 Director 的 MAC 地址
4.RS 的 RIP 可以使用私网地址,也可以是公网地址; RIP 与 DIP 在同一 IP 网络;
5.RIP 的网关不能指向 DIP ,以确保响应报文不会经由 Director
6.RS 和 Director 要在同一个物理网络
7. 请求报文要经由 Director ,但响应报文不经由 Director ,而由 RS 直接发往 Client
8. 不支持端口映射(端口不能修败)
9.RS 可使用大多数 OS 系统
实验环境:五个虚拟机。其中客户端主机为nat模式。路由器主机需有两个网络适配器一个为nat模式,一个为仅主机模式。其它三个均为仅主机模式。
client:
[root@client ~]# cat /etc/NetworkManager/system-connections/eth0.connection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=172.25.254.200/24,172.25.254.100
method=manual
nmcli c reload
nmcli c up eth0
router:
[root@router ~]# cat /etc/NetworkManager/system-connections/eth0.connection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=172.25.254.100/24,172.25.254.2
dns=114.114.114.114;
method=manual
[root@router ~]# cat /etc/NetworkManager/system-connections/eth1.connection
[connection]
id=eth1
type=ethernet
interface-name=eth1
[ipv4]
address1=192.168.0.100/24
method=manual
nmcli c reload
nmcli c up eth0
nmcli c up eth1
配置lvs主机:
[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth0.connection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=192.168.0.50/24,192.168.0.100
method=manual
nmcli connection reload
nmcli connection up eth0
[root@lvs ~]# ip addr add dev lo 192.168.0.200/32
配置server1:
[root@server1 ~]# cat /etc/NetworkManager/system-connections/eth0.connection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual
nmcli c reload
nmcli c up eth0
[root@server1 ~]# ip addr add dev lo 192.168.0.200/32
配置server2:
[root@server2 ~]# cat /etc/NetworkManager/system-connections/eth0.connection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=192.168.0.20/24,192.168.0.100
method=manual
nmcli c reload
nmcli c up eth0
[root@server2 ~]# ip addr add dev lo 192.168.0.200/32
server1和server2:
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
配置ipvsadm:
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
router:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 #在最后一行添加
ipvsadm -p
在server1和server2上配置
yum install httpd -y
echo 11111111 > /var/www/html/index.html #server1
echo 22222222 > /var/www/html/index.html #server2
测试:
[root@client ~]# for i in {1..10}; do curl 192.168.0.200; done
222222222
1111111111
222222222
222222222
1111111111
222222222
222222222
1111111111
222222222
222222222
八.lvs的调度算法
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 ,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商。
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
在4.15版本内核以后新增调度算法:
1.FO(Weighted Fai Over) 调度算法:常用作灰度发布
在此 FO 算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载 ( 未设置 IP_VS_DEST_F
OVERLOAD 标志 ) 的且权重最高的真实服务器,进行调度。当服务器承接大量链接,我们可以对此服务器进行过载标记(IP_VS_DEST_F OVERLOAD ),那么 vs 调度器就不会把链接调度到有过载标记的主机中。
2.OVF(Overflow-connection) 调度算法 基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器, 在此 OVF 算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条 件:
1.未过载 ( 未设置 IP_VS_DEST_F OVERLOAD 标志 )。
2.真实服务器当前的活动连接数量小于其权重值。
3.其权重值不为零。