web集群(LVS-DR)
LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项 目,它的官方站点是 www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在 Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已 经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。 使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用 的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。 LVS自从1998年开始,发展到现在已经是一个比较成熟的技术项目了。可以利用LVS技术实现高可伸缩 的、高可用的网络服务,例如WWW服务、Cache服务、DNS服务、FTP服务、MAIL服务、视频/音频点 播服务等等,有许多比较著名网站和组织都在使用LVS架设的集群系统,例如:Linux的门户网站( w.linux.com)、向RealPlayer提供音频视频服务而闻名的Real公司( ww www.real.com)、全球最大的开 源网站(sourceforge.net)等。
LVS-DR模式工作原理
首先,来自客户端计算机CIP的请求被发送到Director的VIP。然后Director使用相同的VIP目的IP地址将 请求发送到集群节点或真实服务器。然后,集群某个节点将回复该数据包,并将该数据包直接发送到客 户端计算机(不经过director),并且以此回复数据包使用的目的VIP 地址作为源IP地址。因此,实际上 是客户计算机被“欺骗”了,客户计算机始终认为它正与同一台计算机对话,而实际上它正在发送请求数 据包给一台计算机(LB),并从另一台计算机(RS)接收回复的数据包。
LVS-DR模式应用特点
1)所有集群节点RS必须和Director在相同的物理网段(即同一个局域网中);
2)所有客户端入站(而不是出站)请求由Director首先接收,并转发给集群节点RS;
3)集群节点RS通常来说最好带外部IP,而不使用Director及某固定机器作为默认网关,以便将数据包直 接回复给客户端计算机,且不会产生回包的瓶颈;
4)所有集群节点RS上必须在lo网卡上绑定VIP地址,以便验证通过目的IP非RS的数据包;
5)由于所有集群节点RS上必须在lo网卡上绑定VIP地址,因此,带来arp问题,即集群节点RS默认会相 应发往Director VIP的数据包。因此要对所有集群节点RS做ARP抑制处理,把响应VIP的请求交给LVS Director;
6)很多操作系统都可以用在集群内部的RS真实服务器上只要该操作系统能够实现ARP隐藏,如: Windows,linux,unix;
7)LVS/DR模式不需要开启调度器转发功能,这点和LVS/NAT模式是不同的。
8)LVS/DR Director(服务器数量100台)可以比LVS-NAT Director(服务器数量10-20台)承受更多的 并发请求和转发更多的服务器数量。
ipvsadm工具使用
ipvsadm工具常用的参数选项有:
-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显示转发速率信息(瞬时值)
实验部分
手动配置部分
准备三台实验机:Rocky 8.10,IP地址192.168.126.13{0..132},其中130为DS服务器,其余为RS服务器
为了验证效果,先在131,132主机上面安装nginx服务
systemctl stop firewalld
setenforce 0
dnf install nginx -y
echo "this is a test page which from ip:$(hostname -I)" > /usr/share/nginx/html/index.html
systemctl start nginx
添加虚拟IP地址,这里有两种方式:
nmcli con add type dummy ifname lvsTest ipv4.method manual ipv4.addresses 192.168.126.140/32
ifconfig ens160:10 192.168.126.140 broadcast 192.168.126.140 netmask 255.255.255.255 up
上面是两种不同的方式配置虚拟IP地址,选一种进行执行即可,一般建议不是脚本类执行的话可以考虑nmcli,否则ifconfig
-
nmcli
:适用于创建虚拟接口和持久化配置,适合现代系统和复杂网络配置。 -
ifconfig
:适用于在同一物理接口上绑定多个 IP 地址,适合临时配置和简单场景。
ARP抑制
在RS主机上面需要配置ARP抑制,要不然当ARP包寻求140这个虚拟主机时候,它会和DS一同响应。
echo '1' > /proc/sys/net/ipv4/conf/lvsTest/arp_ignore
echo '2' > /proc/sys/net/ipv4/conf/lvsTest/arp_announce
0 -(默认值):回应任何网络接口上对任何本地IP地址的arp查询请求。
1 – 只回答目标IP地址是来访网络接口本地地址的ARP查询请求。
2 – 只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内。
以上的内容请配置于所有的RS服务器
配置DS服务器
dnf install ipvsadm -y
nmcli con add type dummy ifname lvsTest ipv4.method manual ipv4.addresses 192.168.126.140/32
#添加规则
ipvsadm -At 192.168.126.140:80 -s rr -p20
ipvsadm -at 192.168.126.140:80 -r 192.168.126.131:80
ipvsadm -at 192.168.126.140:80 -r 192.168.126.132:80
[root@host130 ~]# 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.126.140:80 rr
-> 192.168.126.131:80 Route 1 0 2
-> 192.168.126.132:80 Route 1 0 3
此时打开一个终端cmd,直接访问140这个IP地址
以上就是反复在131和132之间访问,下面进行脚本部署
自动化脚本配置
先把RS服务的关于140的ARP服务给打开
echo '0' > /proc/sys/net/ipv4/conf/lvsTest/arp_ignore
echo '0' > /proc/sys/net/ipv4/conf/lvsTest/arp_announce
删除nmcli添加的虚拟IP,我们后续使用ifconfig配置
nmcli con del dummy-lvsTest
Connection 'dummy-lvsTest' (c6e1603c-640a-4a98-96f6-d36fadcf813c) successfully deleted.
RS的系统服务脚本:在/etc/init.d/目录下面创建一个名为LVSRS的脚本
vim /etc/init.d/LVSRS
#!/bin/sh
#chkconfig: - 28 72
#description: Initialise the Linux Virtual Server for DR
#Provides: ipvsadm
#Required-Start: $local_fs $network $named
#Required-Stop: $local_fs $network $remote_fs
LOCK=/var/local/ipvsadm.lock
VIP=192.168.126.140
DevName=ens160
. /etc/rc.d/init.d/functions
start(){
PID=$(ifconfig | grep lo:10 | wc -l)
if [ $PID -ne 0 ]
then
echo "The LVS_DR_RIP Server is already running!"
else
/sbin/ifconfig lo:10 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:10
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/${DevName}/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/${DevName}/arp_announce
/bin/touch $LOCK
echo "Starting LVS-DR-RIP Server is ok!"
fi
}
stop(){
sbin/route del -host $VIP dev lo:10
/sbin/ifconfig lo:10 down >/dev/null
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/${DevName}/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/${DevName}/arp_announce
rm -rf $LOCK
echo "stopping LVS-DR-RIP server is ok !"
}
status() {
if [ -e $LOCK ];
then
echo "The LVS-DR-RIP Server is already running !"
else
echo "The LVS-DR-RIP Server is not running !"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo "Usage: $1 {start|stop|restart|status}"
exit 1
esac
exit 0
上面使用回环地址来创建,而不是直接创建一个虚拟接口,原因:
-
lo:10
是本地回环接口的别名,通常用于本地通信,数据包不会离开主机。 -
ens160:10
是一个物理网络接口的别名(虚拟接口),通常用于实际的网络通信。
我们的DS服务会使用ens160创建一个虚拟接口,vim /etc/init.d/LVSDS
#!/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
LOCK=/var/lock/ipvsadm.lock
VIP=192.168.126.140
RIP1=192.168.126.131
RIP2=192.168.126.132
DipName=ens160
. /etc/rc.d/init.d/functions
start() {
PID=`ipvsadm -Ln | grep ${VIP} | wc -l`
if [ $PID -gt 0 ];
then
echo "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 Lvs
echo "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/null
rm -rf $LOCK
echo "stopping LVS-DR server is ok !"
}
status() {
if [ -e $LOCK ];
then
echo "The LVS-DR Server is already running !"
else
echo "The LVS-DR Server is not running !"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo "Usage: $1 {start|stop|restart|status}"
exit 1
esac
exit 0
以上脚本增加执行权限chmod + x
添加到系统服务chkconfig --add LVSRS
启动systemctl start LVSRS,下面就表示已经启动了。
[root@host130 ~]# systemctl restart LVSDS
[root@host130 ~]# systemctl status LVSDS
● LVSRS.service - LSB: Initialise the Linux Virtual Server for DR
Loaded: loaded (/etc/rc.d/init.d/LVSRS; generated)
Active: active (exited) since Thu 2025-02-13 07:08:09 EST; 16s ago
Docs: man:systemd-sysv-generator(8)
Process: 2217 ExecStart=/etc/rc.d/init.d/LVSRS start (code=exited, status=0/SUCCESS)
Feb 13 07:08:09 host130 systemd[1]: Starting LSB: Initialise the Linux Virtual Server>
Feb 13 07:08:09 host130 LVSRS[2217]: The LVS-DR Server is already running !
Feb 13 07:08:09 host130 systemd[1]: Started LSB: Initialise the Linux Virtual Server >
RS同上
验证效果: