LVS_DR集群的基本原理和相关配置
1、LVS集群的体系结构
1.1、LVS简介
LVS 是 Linux Virtual Server 的简称,也就是 Linux 虚拟服务器 , 是一个由章文嵩博士发起的自由软件项目,它的官方站点是 www.linuxvirtualserver.org 。现在 LVS 已经是 Linux标准内核的一部分,在Linux2.4 内核以前,使用 LVS 时必须要重新编译内核以支持 LVS 功能模块,但是从 Linux2.4内核以后,已经完全内置了 LVS 的各个功能模块,无需给内核打任何补丁,可以直接使用 LVS 提供的各种功能。
使用 LVS 技术要达到的目标是:通过LVS 提供的负载均衡技术和 Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。
1.2、LVS体系结构
使用LVS架设的服务器集群系统有三个部分组成:最前端的负载均衡层,用Load Balancer表示,中间的服务器群组层,用Server Array表示,最底端的数据共享存储层,用Shared Storage表示。
Load Balancer层:位于整个集群系统的最前端,有一台或者多台负载调度器(Director Server)组成,LVS模块就安装在Director Server上,而Director的主要作用类似于一个路由器,它含有完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array层的应用服务器(Real Server)上。同时,在Director Server上还要安装对Real Server服务的监控模块Ldirectord,此模块用于监测各个Real Server服务的健康状况。在Real Server不可用时把它从LVS路由表中剔除,恢复时重新加入。
Server Array层:由一组实际运行应用服务的机器组成,Real Server可以是WEB服务器、MAIL服务器、FTP服务器、DNS服务器、视频服务器中的一个或者多个,每个Real Server之间通过高速的LAN或分布在各地的WAN相连接。在实际的应用中,Director Server也可以同时兼任Real Server的角色。
Shared Storage层:是为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如Red hat的GFS文件系统,oracle提供的OCFS2文件系统等。
1.3、LVS的相关术语
名称 | 缩写 | 说明 |
---|---|---|
虚拟IP地址(Virtual IP Address) | VIP | Director用于向客户端计算机提供服务的IP地址 |
真实IP地址(Real Server IP Address) | RIP | 在集群下面节点上使用的IP地址 |
Director的IP地址(Director IP Address) | DIP | Director用于连接内外网网络的IP地址 |
客户端主机IP地址(Client IP Address) | CIP | 客户端用户计算机请求集群服务器的IP地址,该地址用作发送给集群的请求的源IP地址 |
LVS集群内部的节点称为真实服务器(Real Serve),也叫做集群节点。请求集群服务的计算机称为客户计算机。与计算机通常在网上交换数据包的方式相同,客户计算机、Director和真实服务器使用IP地址彼此进行通信。不同架构角色命名情况如下图:
1.4、LVS工作模式
LVS的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求 当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点,而Real Server节点如何返回数据给用户,是IPVS实现的重点技术,IPVS实现负载均衡机制有三种,分别是NAT、TUN和DR。
VS/NAT: 即(Virtual Server via Network Address Translation) 也就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时报文的目标端口也改成选定的Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到数据后,Real Server返回数据给用户时,需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。
VS/TUN :即(Virtual Server via IP Tunneling) 也就是IP隧道技术实现虚拟服务器。它的连接调度和管理与VS/NAT方式一样,只是它的报文转发方法不同,VS/TUN方式中,调度器采用IP隧道技术将用户请求转发到某个Real Server,而这个Real Server将直接响应用户的请求,不再经过前端调度器,此外,对Real Server的地域位置没有要求,可以和Director Server位于同一个网段,也可以是独立的一个网络。因此,在TUN方式中,调度器将只处理用户的报文请求,集群系统的吞吐量大大提高。
VS/DR: 即(Virtual Server via Direct Routing) 也就是用直接路由技术实现虚拟服务器。它的连接调度和管理与VS/NAT和VS/TUN中的一样,但它的报文转发方法又有不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上。
特别提示:(VS/DR)模式是互联网使用的最多多的一种模式,在LVS-DR配置中,Director将所有入站请求转发给集群内部节点,但集群内部的节点直接将他们的回复发送给客户端计算机(没有通过Director回来)。如下图所示
1.5、LVS调度算法
调度方法决定了如何在这些集群节点之间分布工作负荷。
当Director收到来自客户端计算机访问她的VIP上的集群服务的入站请求时,Director必须决定那个集群节点应该获得请求。Director可用于做出该决定的调度方法分成两个基本类别:
固定调度算法:rr,wrr,dh,sh
动态调度算法:wlc,lblc,lblcr,SED,NQ(后两种官方站点没提到)
10种调度算法见如下表格:
算法 | 说明 |
---|---|
rr | 轮循调度(Round-Robin),它将请求依次分配不同的RS,也就是在RS中均摊请求。这种算法简单,但是只适合于处理性能相差不大的情况 |
wrr | 加权轮循调度(Weighted Round-Robin)它将依据不同RS的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值较低的RS更多。相同权值的RS得到相同数目的连接数。 |
dh | 目的哈希调度(Destination Hashing)以目的地址为关键字查找一个静态hash表来获得需要的RS。 |
sh | 源地址哈希调度(source hashing)以源地址为关键字查找一个静态hash表来获得需要的RS。 |
wlc | 加权最小连接数调度(weighted leastconnection)假设各台RS的权值依次为wi(i=1..n),当前的TCP连接数依次为Ti(i=1..n),依次选取Ti/Wi为最小的RS作为下一个分配的RS。 |
lc | 最小连接数调度(Least-Connection),IPVS表存储了所有的活动的连接。把心的连接请求发送到当前连接数最小的RS。 |
lblc | 基于地址的最小连接数调度(locality-Based Least-Connection)将来自同一目的地址的请求分配给同一台RS如果这台服务器尚未满负荷,否则分配给连接数最小的RS,并以它为下一次分配的首先考虑。 |
lblcr | 基于地址带重复最小连接数调度(Locality-Based Least-Connection with Replication)对于某一目的地址,对应有一个RS子集。对此地址请求,为它分配子集中连接数最小RS;如果服务器中所有子集均已满负荷,则从集群中选择一个连接数较小服务器,将它加入到此子集并分配连接;若一定时间内,未被做任何修改,则将子集中负载最大的节点从子集删除。 |
SED | 最短期望的延迟(shortest expected delay scheduling SED)(SED) 基于wlc算法。这个必须举例来说了 ABC三台机器分别权重123,连接数也分别是123.那么如果使用wlc算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用sed算法后会进这样一个运算 A(1+1)/1 B(1+2)/2 C(1+3)/3 根据运算结果,把连接交给C。 |
NQ | 最少队列调度(Never Queue Scheduling NQ)(NQ) 无需队列。如果有台realserver的连接数=0就直接分配过去,不需要在进行sed运算 |
详细讲述最常用的四种调度算法:
轮询调度(Round Robin) “轮询”调度也叫1:1调度,调度器通过“轮询”调度算法将外部用户请求按顺序1:1的分配到集群中的每个Real Server上,这种算法平等地对待每一台Real Server,而不管服务器上实际的负载状况和连接状态。
加权轮询调度(Weighted Round Robin) “加权轮询”调度算法是根据Real Server的不同处理能力来调度访问请求。可以对每台Real Server设置不同的调度权值,对于性能相对较好的Real Server可以设置较高的权值,而对于处理能力较弱的Real Server,可以设置较低的权值,这样保证了处理能力强的服务器处理更多的访问流量。充分合理的利用了服务器资源。同时,调度器还可以自动查询Real Server的负载情况,并动态地调整其权值。
最少链接调度(Least Connections) “最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。
加权最少链接调度(Weighted Least Connections) “加权最少链接调度”是“最少连接调度”的超集,每个服务节点可以用相应的权值表示其处理能力,而系统管理员可以动态的设置相应的权值,缺省权值为1,加权最小连接调度在分配新连接请求时尽可能使服务节点的已建立连接数和其权值成正比。
2、LVS的DR模式
2.1、LVS-DR基本工作原理
-
当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
-
PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
-
IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
-
POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器
2.2、DR模式应用特点
- 所有集群节点RS必须和Director在相同的物理网段(即同一个局域网中);
- 所有客户端入站(而不是出站)请求由Director首先接收,并转发给集群节点RS;
- 集群节点RS通常来说最好带外部IP,而不使用Director及某固定机器作为默认网关,以便将数据包直接回复给客户端计算机,且不会产生回包的瓶颈;
- 所有集群节点RS上必须在lo网卡上绑定VIP地址,以便验证通过目的IP非RS的数据包;
- 由于所有集群节点RS上必须在lo网卡上绑定VIP地址,因此,带来arp问题,即集群节点RS默认会相应发往Director VIP的数据包。因此要对所有集群节点RS做ARP抑制处理,把响应VIP的请求交给LVS Director;
- 很多操作系统都可以用在集群内部的RS真实服务器上只要该操作系统能够实现ARP隐藏,如:Windows,linux,unix;
- LVS/DR模式不需要开启调度器转发功能,这点和LVS/NAT模式是不同的。 8)LVS/DR Director(服务器数量100台)可以比LVS-NAT Director(服务器数量10-20台)承受更多的并发请求和转发更多的服务器数量。
2.3、ARP抑制
如果不抑制RS端arp影响
图1:抑制RS端arp前的广播情况
图2:抑制RS端arp前响应情况
提示:广播消息会通过物理网卡到达真实服务器,而真实服务器上有VIP,所以,会响应此请求
抑制RS端arp响应后
图1:抑制RS端arp后广播情况 图2:抑制RS后arp响应情况图
LVS_DR模式让前端路由将请求发往VIP时,只能是Dirctor上VIP的解决方案
①:静态地址绑定;
未必有路由器的配置权限;
Director调用时静态地址绑定将难以适用;
②:arptables
Disable ARP for VIP
Basically, we have the following commands to disable ARP for VIP at real servers.
arptables -F
arptables -A INPUT -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
③:修改Linux内核参数,将RS上的VIP配置为lo接口的别名,限制Linux仅对对应接口的ARP请求做响应;
2.4、LVS_DR模式实验配置
2.4.1环境准备
主机名 | IP | 角色 |
openEuler-1 | 192.168.93.10 | Director Server |
openEuler-2 | 192.168.93.11 | Real Server1 |
openEuler-3 | 192.168.93.12 | Real Server |
Rocky8 | 192.168.93.20 | Client |
2.4.2、web服务器配置
在两台RS服务器配置nginx服务:
[root@openEuler-2 ~]# echo "this is test page!(ip:`hostname -I`)" > /usr/share/nginx/html/index.html
[root@openEuler-2 ~]# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@openEuler-2 ~]# curl localhost
this is test page!(ip:192.168.93.11 )另外一台RS上也是同样的配置
2.4.3、添加VIP的相关配置
在RS和DS上配置VIP:
[root@openEuler-1 ~]# nmcli connection add type dummy ifname dummy1 ipv4.method manual ipv4.addresses 192.168.93.100/32
Connection 'dummy-dummy1' (75ae495e-88f3-4acb-943d-223d4ea52000) successfully added.
[root@openEuler-1 ~]# ipa
-bash: ipa: command not found
[root@openEuler-1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:41:54:76 brd ff:ff:ff:ff:ff:ffinet 192.168.93.10/24 brd 192.168.93.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe41:5476/64 scope link noprefixroutevalid_lft forever preferred_lft forever
3: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000link/ether 26:ae:f8:98:76:0a brd ff:ff:ff:ff:ff:ffinet 192.168.93.100/32 scope global noprefixroute dummy1valid_lft forever preferred_lft foreverinet6 fe80::94ff:8672:4f70:a692/64 scope link noprefixroutevalid_lft forever preferred_lft forever
Linux Dummy 接口基础概念:
Dummy 接口是Linux操作系统中的一个虚拟网络接口,它不与任何物理硬件设备关联,主要用于测试和配置网络环境。Dummy 接口可以模拟一个网络接口,允许你在没有实际网络硬件的情况下进行网络相关的操作和测试。
2.4.4、配置ARP抑制
[root@openEuler-2 ~]# cat >> /etc/sysctl.conf << EOF
> net.ipv4.conf.all.arp_ignore = 1
> net.ipv4.conf.all.arp_announce = 2
> net.ipv4.conf.dummy1.arp_ignore = 1
> net.ipv4.conf.dummy1.arp_announce = 2
> EOF# 使其生效
[root@openEuler-2 ~]# sysctl -p
2.4.5、LVS配置
DR上安装ipvsadm.x86_64
[root@openEuler-1 ~]# ipvsadm -At 192.168.93.10:80 -s rr
[root@openEuler-1 ~]# ipvsadm -at 192.168.93.10:80 -r 192.168.93.11:80 -g
[root@openEuler-1 ~]# ipvsadm -at 192.168.93.10:80 -r 192.168.93.12:80 -g
[root@openEuler-1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.93.10:80 rr-> 192.168.93.11:80 Route 1 0 0-> 192.168.93.12:80 Route 1 0 0
[相关参数说明]
# ipvsadm –help
-A 添加虚拟服务器
-t 设置群集地址(VIP,Virtual IP)
-s 指定负载调度算法
-a 添加真实服务器
-d 删除真实服务器
-r 指定真实服务器(Real Server)的地址
-m 使用NAT模式;-g、-i分别对应DR、TUN模式
-w 为节点服务器设置权重,默认为1
2.4.6、测试
[root@Rocky-1 ~]# for ((i=1;i<10;i++)); do curl 192.168.93.100; done
this is test page!(ip:192.168.93.12 )
this is test page!(ip:192.168.93.11 )
this is test page!(ip:192.168.93.12 )
this is test page!(ip:192.168.93.11 )
this is test page!(ip:192.168.93.12 )
this is test page!(ip:192.168.93.11 )
this is test page!(ip:192.168.93.12 )
this is test page!(ip:192.168.93.11 )
this is test page!(ip:192.168.93.12 )
2.4.7、配置脚本
DR:
#!/bin/sh
#
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
#
### BEGIN INIT INFO
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly
# available server built on a cluster of real servers, with the load
# balancer running on Linux.
# description: start LVS of DRLOCK=/var/lock/ipvsadm.lock
VIP=192.168.93.100
RIP1=192.168.93.11
RIP2=192.168.93.12
DipName=ens33. /etc/rc.d/init.d/functions
start() {PID=`ipvsadm -Ln | grep ${VIP} | wc -l`if [ $PID -gt 0 ];thenecho "The LVS-DR Server is already running !"else#Set the Virtual IP Address/sbin/ifconfig ${DipName}:10 $VIP broadcast $VIP netmask 255.255.255.255 up/sbin/route add -host $VIP dev ${DipName}:10#Clear IPVS Table/sbin/ipvsadm -C#Set Lvs/sbin/ipvsadm -At $VIP:80 -s rr/sbin/ipvsadm -at $VIP:80 -r $RIP1:80 -g/sbin/ipvsadm -at $VIP:80 -r $RIP2:80 -g/bin/touch $LOCK#Run Lvsecho "starting LVS-DR Server is ok !"fi
}stop() {#clear Lvs and vip/sbin/ipvsadm -C/sbin/route del -host $VIP dev ${DipName}:10/sbin/ifconfig ${DipName}:10 down >/dev/nullrm -rf $LOCKecho "stopping LVS-DR server is ok !"
}status() {if [ -e $LOCK ];thenecho "The LVS-DR Server is already running !"elseecho "The LVS-DR Server is not running !"fi
}case "$1" instart)start;;stop)stop;;restart)stopstart;;status)status;;*)echo "Usage: $1 {start|stop|restart|status}"exit 1
esac
exit 0
RS:
#!/bin/sh
#
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
#
### BEGIN INIT INFO
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly
# available server built on a cluster of real servers, with the load
# balancer running on Linux.
# description: start LVS of DR-RIPLOCK=/var/lock/ipvsadm.lock
VIP=192.168.93.100. /etc/rc.d/init.d/functions
start() {PID=`ifconfig | grep lo:10 | wc -l`if [ $PID -ne 0 ];thenecho "The LVS-DR-RIP Server is already running !"else/sbin/ifconfig lo:10 $VIP netmask 255.255.255.255 broadcast $VIP up/sbin/route add -host $VIP dev lo:10echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/eth0/arp_announceecho "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announce/bin/touch $LOCKecho "starting LVS-DR-RIP server is ok !"fi
}stop() {/sbin/route del -host $VIP dev lo:10/sbin/ifconfig lo:10 down >/dev/nullecho "0" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "0" >/proc/sys/net/ipv4/conf/eth0/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/eth0/arp_announceecho "0" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/all/arp_announcerm -rf $LOCKecho "stopping LVS-DR-RIP server is ok !"
}status() {if [ -e $LOCK ];thenecho "The LVS-DR-RIP Server is already running !"elseecho "The LVS-DR-RIP Server is not running !"fi
}case "$1" instart)start;;stop)stop;;restart)stopstart;;status)status;;*)echo "Usage: $1 {start|stop|restart|status}"exit 1
esac
exit 0
3、LVS的NAT模式
3.1、LVS-NAT基本工作原理
①:当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
②:PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
③:IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP
④:POSTROUTING链通过选路,将数据包发送给Real Server
⑤:Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP
⑥:Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP
工作逻辑图:
3.2、LVS模式的应用特点
- 集群节点,必须在一个网络中;
- 真实服务器必须将网关指向负载调度器;
- RIP 通常都是私有 IP,仅用于各个集群节点通信;
- 负载调度器必须位于客户端和真实服务器之间,充当网关;
- 支持端口映射;
- 负载调度器操作系统必须是 Linux ,真实服务器可以使用任意系统。
3.3、LVS_NAT实验配置
3.3.1、环境准备
主机名 | IP | 角色 |
openEuler-1 | 192.168.93.10(公网)192.168.23.10(内网) | LVS |
openEuler-2 | 192.168.23.11 | Real Server1 |
openEuler-3 | 192.168.23.12 | Real Server1 |
Rocky8 | 192.168.93.20 | lient |
3.3.2、web服务配置
两台RS都做相同的配置,注意:RS的网关是LVS的DIP(内网地址)
[root@openEuler-2 ~]# echo "`hostname -I`" > /usr/share/nginx/html/index.html[root@openEuler-2 ~]# systemctl restart nginx[root@openEuler-2 ~]# curl localhost
192.168.23.11
3.3.3、LVS开启路由转发功能
临时开启:
1、echo1>/proc/sys/net/ipv4/ip_forward
2、sysctl -w net.ipv4.ip_forward=1
永久开启:
修改文件 /etc/sysctl.conf
net.ipv4.ip_forward=1
使生效:sysctl -p
3.3.4、LVS配置
[root@openEuler-1 ~]# yum install ipvsadm -y
[root@openEuler-1 ~]# ipvsadm -At 192.168.93.10:80 -s rr
[root@openEuler-1 ~]# ipvsadm -at 192.168.93.10:80 -r 192.168.23.11:80 -m
[root@openEuler-1 ~]# ipvsadm -at 192.168.93.10:80 -r 192.168.23.12:80 -m
[root@openEuler-1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.93.10:80 rr-> 192.168.23.11:80 Masq 1 0 0-> 192.168.23.12:80 Masq 1 0 0
3.3.5、测试
[root@Rocky-1 ~]# for ((i=1;i<10;i++)); do curl 192.168.93.10; done
192.168.23.12
192.168.23.11
192.168.23.12
192.168.23.11
192.168.23.12
192.168.23.11
192.168.23.12
192.168.23.11
192.168.23.12
4、LVS的持久连接
4.1、持久客户端连接
定义:每客户端持久。将来自于同一个客户端的所有请求统统定向至此前选定的 RS ;也就是只要 IP 相同,分配的服务器始终相同。
示例代码:
ipvsadm -A -t 172.16.0.8:0 -s wlc -p 120
# 添加一个 tcp 负载集群,集群地址为 172.16.0.8 ,算法为 wlc,持久化时间为 120s
4.2、持久端口连接
定义:每端口持久。将来自于同一个客户端对同一个服务 ( 端口 ) 的请求,始终定向至此前选定的 RS。
示例代码:
ipvsadm -A -t 172.16.0.8:80 -s rr -p 120
# 添加一个 tcp 负载集群,集群地址为 172.16.0.8:80 ,算法为 wlc,持久化时间为 120s
4.3、持久防火墙标记连接
定义:将来自于同一客户端对指定服务 ( 端口 ) 的请求,始终定向至此选定的 RS。 不过它可以将两个毫不相干的端口定义为一个集群服务。
示例代码:
iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 80 -j MARK --set-mark 10
# 添加一个防火墙规则,当目标地址为 172.16.0.8 并且 目标端口为 80 时给数据包打一个标记,设置mark 值为 10iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 443 -j MARK --set-mark 10
# 添加一个防火墙规则,当目标地址为 172.16.0.8 并且 目标端口为 443 时给数据包打一个标记,
设置mark 值为 10service iptables save
# 保存防火墙规则持久化生效ipvsadm -A -f 10 -s wlc -p 120
# 添加一个负载调度器,当 mark 值为 10 时进行负载均衡使用wlc 算法,持久化生效时间为 120s
5、LVS高可用性实现
LVS 不可用时:
Director 不可用,整个系统将不可用。
解决方案:高可用, keepalived 、 heartbeat/corosync。
RS 不可用时:
某 RS 不可用时, Director 依然会调度请求至此 RS。
解决方案: 由 Director 对各 RS 健康状态进行检查,失败时禁用,成功时启用。
常用解决方案
- keepalived
- heartbeat/corosync
- ldirectord
解决方式
- 网络层检测, icmp
- 传输层检测,端口探测
- 应用层检测,请求某关键资源
ldirectord 软件:
ldirectord 是专门为 LVS 监控而编写的,用来监控 lvs 架构中服务器池( server pool ) 的服务器状态。ldirectord 运行在 IPVS 节点上, ldirectord 作为一个守护进程启动后会对服务器池中的每个真实服务器发送请求进行监控, 如果 服务器没有响应 lldirectord 的请求,那么 ldirectord 认为该服务器不可用,ldirectord 会运行 ipvsadm 对 IPVS 表中该服务器进行删除,如果等下次再次检测有相应则通过 ipvsadm进行添加。
ldirectord :监控和控制 LVS 守护进程,可管理 LVS 规则
下载链接:
http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/15.6/x86_64/ldirectord-4.1.0+git59.a0452207-150600.1.2.x86_64.rpm
配置文件示例:
[root@openEuler-1 ~]# rpm -ql ldirectord
/etc/ha.d/resource.d
/etc/ha.d/resource.d/ldirectord
/etc/logrotate.d/ldirectord
/usr/lib/systemd/system/ldirectord.service
/usr/sbin/ldirectord
/usr/sbin/rcldirectord
/usr/share/doc/packages/ldirectord
/usr/share/doc/packages/ldirectord/ldirectord.cf # 配置模板
/usr/share/man/man8/ldirectord.8.gz
NAT模型示例:
checktimeout=10
checkinterval=5
autoreload=yes
logfile="/var/log/ldirectord.log"
quiescent=novirtual=192.168.93.10:80
real=192.168.23.11:80 masq
real=193.168.23.12:80 masq
service=http
scheduler=rr
protocol=tcp
checktype=negotiate
checkport=80
request="index.html"
receive="Welcome to nginx!"
测试:关闭一台RS上的nginx服务
[root@Rocky-1 ~]# for ((i=1;i<10;i++)); do curl 192.168.93.10; done
192.168.23.11
192.168.23.11
192.168.23.11
192.168.23.11
192.168.23.11
192.168.23.11
192.168.23.11
192.168.23.11
192.168.23.11