目录
LVS(Linux Virtual Server)常见的调度算法
LVS原理
LVS(Linux Virtual Server,Linux 虚拟服务器)的基本原理是通过将多个真实服务器组合成一个虚拟服务器集群,实现对客户端请求的高效负载均衡和高可用性服务。 其主要工作流程如下:
1. 客户端向虚拟服务器(VIP)发送请求。
2. 负载均衡器(通常称为 Director)接收到请求。
3. Director 根据预先配置的负载均衡算法(如轮询、加权轮询、最少连接等)选择一个合适的真实服务器(Real Server)。
4. Director 将客户端请求转发到选定的 Real Server。
5. Real Server 处理请求,并将响应直接返回给客户端。
为了实现请求的转发,LVS 支持多种工作模式,如 NAT(Network Address Translation,网络地址转换)模式、TUN(IP Tunneling,IP 隧道)模式和 DR(Direct Routing,直接路由)模式。
在 NAT 模式中,Director 不仅负责调度,还对请求和响应数据包进行网络地址转换。
在 TUN 模式中,Director 将请求数据包封装后发送给 Real Server,Real Server 处理后直接将响应返回给客户端。
在 DR 模式中,Director 根据算法选择 Real Server 后,将请求的 MAC 地址修改为选定 Real Server 的 MAC 地址,然后通过局域网将请求直接发送给 Real Server,Real Server 处理后直接响应给客户端。
通过 LVS 的负载均衡机制,可以提高服务器集群的整体性能、可扩展性和可用性,确保客户端能够获得快速和可靠的服务。
LVS概念
名称 | 意义 |
VS(Virtual Server)/虚拟服务器 | 负责调度,将客户端的请求分配到合适的后端服务器 |
RS(Real Server)/真实服务器 | 负责真正提供服务,处理来自 VS 调度分配的请求 |
CIP(Client IP)/客户端主机IP地址 | 客户端用户计算机请求集群服务器的IP地址,该地址用作发送给集群的请求的源IP地址 |
VIP(Virtual serve IP)/虚拟IP地址 | Director用于向客户端计算机提供服务的IP地址 |
DIP(Director IP)/Director的IP地址 | Director用于连接内外网网络的IP地址 |
RIP(Real server IP)/真实IP地址 | 在集群下面节点上使用的IP地址 |
访问过程:CIP<-->VIP == DIP<-->RIP
lvs集群的类型
(此处我们详细讲解lvs-nat和lvs-br)
lvs-nat
解释
LVS(Linux Virtual Server)的网络地址转换(NAT)模式是一种在网络层(第四层)实现负载均衡的方法。在NAT模式中,Director Server(DS)充当所有服务器节点的网关,既是客户端请求的入口,也是Real Server响应客户端的出口。优点是可以进行端口转换,缺点是存在性能瓶颈。它主要工作在OSI模型的第三层(网络层)和第四层(传输层)。NAT允许内部网络使用私有IP地址,并通过公共IP地址进行外部通信。
传输过程
1.客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP)访问目标端口 (9000port)
2.VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口
3.RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口 (9000port)
4.VS服务器接收到响应数据包,改变包中的数据来源(RIP1-->VIP),响应目标端口(9000-->80)
5.VS服务器把修改过报文的响应数据包回传给客户端 6.lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞
客户请求到达vip后进入PREROUTING,在没有ipvs的时候因该进入本机INPUT,当IPVS存在后访问请求在通 过PREROUTING后被ipvs结果并作nat转发 因为ipvs的作用点是在PREROUTING和INPUT链之间,所以如果在prerouting中设定规则会干扰ipvs的工 作。所以在做lvs时要把iptables的火墙策略全清理掉。
lvs-dr
解释
LVS(Linux Virtual Server)的 DR(Direct Routing,直接路由)模式,这种模式适用于非ARP设备的Real Server,Real Server网络是局域网,同样支持大量Real Server(高达100个),Real Server有自己的路由器。优点是性能最佳,缺点是不支持跨网段和端口转换。工作在数据链路层。在DR模式中,RS接收到访问请求后不需要回传给VS调度器,直接把回传数据发送给client,所以RS和vs 上都要有vip
传输过程
1.客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC
2.VS调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC,此时帧中的数据为客户端IP+客户端 的MAC+VIP+RS1的MAC
3.RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的 MAC
特点
1.Director和各RS都配置有VIP
2.确保前端路由器将目标IP为VIP的请求报文发往Director
3.在前端网关做静态绑定VIP和Director的MAC地址
lvs-tun
LVS(Linux Virtual Server)的 TUN(IP Tunneling,IP 隧道)模式是另一种负载均衡模式。
在 TUN 模式中,Director 接收到客户端请求后,根据负载均衡算法选择一台合适的 Real Server。然后,Director 将请求数据包重新封装在一个新的 IP 数据包中,并将其发送给所选的 Real Server。
Real Server 接收到数据包后,解封装得到原始的请求数据包,并进行处理。处理完成后,Real Server 直接将响应数据包返回给客户端,而不经过 Director。
TUN 模式的优点是可以跨越不同的网络区域对服务器进行负载均衡,Real Server 可以位于不同的物理网络。但它也有一些缺点,比如需要所有服务器支持 IP 隧道功能,会增加一定的系统开销。
LVS(Linux Virtual Server)常见的调度算法
静态调度算法 | RR,WRR,DH,SH |
动态调度算法 | LC,WLC,LBLC,LBLCR |
静态调度算法
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 地址相同的请求,如果对应的真实服务器没有活动连接,则可以在有活动连接的真实服务器中选择一个,并复制该连接。
防火墙标记(Firewall Marking)结合轮询调度
在 LVS 环境中,使用防火墙标记(Firewall Marking)结合轮询调度可以实现更灵活和定制化的负载均衡策略。
通过防火墙标记,可以为不同的连接或数据包打上特定的标记。然后,在 LVS 的配置中,可以根据这些标记来进行调度决策,而不仅仅依赖于默认的轮询方式。
实战案例
lvs的nat模式配置
准备工作
lvs主机需要两个网络适配器,其中一个为NAT模式,另外一个为仅主机模式,还需要两个server主机,一个为server1还有一个为server2,都为仅主机模式
配置过程
配置ip
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
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
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
在lvs主机中配置
lvs中打开内核路由功能,ip_forward = 1通常表示启用了 IP 转发功能,使网络适配器分别为nat和仅主机之间连通
vim /etc/sysctl.conf #在最后一行添加
net.ipv4.ip_forwaed = 1 #启用了 IP 转发功能
sysctl -p #使配置生效
下载ipvsadm
yum install ipvsadm -y
配置规则
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.10 -m
ipvsadm -Ln
watch -n 1 ipvsadm -Ln --rate #也可以使用监控命令来看
在server主机配置
yum install httpd -y #两个都要下载httpd
echo webserver1-192.168.0.10 > /var/www/html/index.html #server1中配置
ystemctl restart httpd
echo webserver1-192.168.0.10 > /var/www/html/index.html #server2中配置
systemctl restart httpd
测试结果
lvs的dr模式综合实践
node | ip | vip | 角色 | 模式 |
client | 172.25.254.200 | 客户端 | NAT | |
router | 192.168.0.100 172.25.254.100 | 路由器 | NAT,仅主机 | |
lvs | 192.168.0.50 | lo:192.168.0.200/32 | 调度器 | 仅主机 |
webserver1 | 192.168.0.10 | lo:192.168.0.200/32 | 真实服务器 | 仅主机 |
webserver2 | 192.168.0.20 | lo:192.168.0.200/32 | 真实服务器 | 仅主机 |
虚拟机配置(准备五个虚拟机)
配置过程
配置ip
配置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
[root@client ~]# nmcli connection reload
[root@client ~]# nmcli connection 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
[root@router ~]# nmcli connection reload
[root@router ~]# nmcli connection up eth0
[root@router ~]# nmcli connection up eth1
配置lvs主机(vip使用环回来创建)
[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
[root@lvs ~]# nmcli connection reload
[root@lvs ~]# nmcli connection up eth0
[root@lvs ~]# ip addr add dev lo 192.168.0.200/32
配置server1主机(vip使用环回来创建)
[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
[root@server1 ~]# nmcli connection reload
[root@server1 ~]# nmcli connection up eth0
[root@server1 ~]# ip addr add dev lo 192.168.0.200/32
配置server2主机(vip使用环回来创建)
[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
[root@server2 ~]# nmcli connection reload
[root@server2 ~]# nmcli connection up eth0
[root@server2 ~]# ip addr add dev lo 192.168.0.200/32
修改Linux内核参数。
server1和server2上面都要做
(rs主机中使vip不对外响应,将RS上的VIP配置为lo接口的别名,限制Linux仅对对应接口的ARP请求做响应;)
限制响应级别 :arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
限制通告级别 :arp_announce
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2:必须避免将接口信息向非本网络进行通告
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
在lvs主机中进行配置 IP 虚拟服务器
yum install ipvsadm -y
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
启用 IP 转发功能
在router主机进行配置
(设置持久连接,保持客户端与后端服务器的连接关系)
vim /etc/sysctl.conf #在最后一行添加
net.ipv4.ip_forward = 1
ipvsadm -p
配置web服务
yum install httpd -y
echo 11111111 > /var/www/html/index.html #server1中配置
ystemctl restart httpd
echo 22222222 > /var/www/html/index.html #server2中配置
systemctl restart httpd
测试结果
for i in {1..10}; do curl 192.168.0.200; done
lvs的防火墙标记解决轮询调度问题
错误示范
ipvsadm -A -t 192.168.0.200:80 -s rr
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
ipvsadm -A -t 192.168.0.200:443 -s rr
ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:80 -g
ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:80 -g
错误结果
[root@lvs ~]# curl -k https://192.168.0.200;curl 192.168.0.200
1111111
1111111
正确示范
FWM:FireWall Mark
MARK target 可用于给特定的报文打标记,
--set-mark value
其中:value 可为0xffff格式,表示十六进制数字借助于防火墙标记来分类报文,而后基于标记定义集群服 务:可将多个不同的应用使用同一个集群服务进行调度
#在lvs主机打标记:
#并且lvs主机基于标记定义集群服务:
iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dport 80,443 -j MARK --set-mark 66
ipvsadm -A -f 66 -s rr #设定调度规则
ipvsadm -a -f 66 -r 192.168.0.10 -g
ipvsadm -a -f 66 -r 192.168.0.20 -g