一、NAT 模式和 DR 模式的介绍
DR模式
- 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
- PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
- IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群
服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链 - POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将
数据包最终发送给后端的服务器
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台)承受更多的
并发请求和转发更多的服务器数量。
优点: VS/DR跟 VS/TUN 方法相同,负载调度器中只负责调度请求,而服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量。
缺点: 要求负载均衡器的网卡必须与物理网卡在一个物理段上
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
LVS-NAT模式的应用特点
1.集群节点,必须在一个网络中
2.真实服务器必须将网关指向负载调度器
3.RIP 通常都是私有 IP,仅用于各个集群节点通信
4.负载调度器必须位于客户端和真实服务器之间,充当网关
5.支持端口映射
优点: 集群中的物理服务器可以使用任何支持TCP/IP操作系统它只需要一个 IP 地址配置在调度器上,服务器组可以用私有的 IP 地址。
缺点: 扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢。
两种模式的区别
DR模式用户的访问请求会经过负载均衡器的转发到节点服务器,但是节点服务器的请求响应报文是直接返回给客户端不会经过负载均衡器。
NAT模式的负载均衡器会作为用户的请求入口,也会作为节点服务器响应请求的出口,负载均衡器响应请求的出口,负载均衡器的服务器性能将会成为整个集群的瓶颈。
二、DR模式集群构建配置
虚拟机环境:基于Centos7.9
创建四台虚拟机
192.168.15.128 Client(客户端)
192.168.15.137 LVS(负载均衡调度器)
192.168.15.133 RS01(真实的服务器)
192.168.15.130 RS02(真实的服务器)
实验前注意关闭防火墙和selinux
真实服务器上
1.安装web服务
[root@rs01 ~]# yum install httpd -y
[root@rs02 ~]# yum install httpd -y
2.配置不同主页信息
[root@RS01 ~]# echo "This is `hostname -I`:Web test page." > /var/www/html/index.html
[root@RS02 ~]# echo "This is `hostname -I`:Web test page." > /var/www/html/index.html
3.启动httpd服务
[root@rs01 ~]# systemctl start httpd
[root@rs02 ~]# systemctl start httpd
LVS负载均衡调度器上
1.安装负载均衡软件包
[root@lvs ~]# yum install ipvsadm -y
2.配置LVS虚拟IP(VIP)
[root@lvs ~]# nmcli con mod ens33 +ipv4.addresses 192.168.15.136/24
[root@lvs ~]# nmcli conn up ens33
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
3.配置LVS策略
# 对TCP80端口提供负载分流服务,使用的调度为轮询
[root@lvs ~]# ipvsadm -A -t 192.168.15.136:80 -s rr
# 添加节点服务器RS
[root@lvs ~]# ipvsadm -a -t 192.168.15.136:80 -r 192.168.15.130:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.15.136:80 -r 192.168.15.133:80 -g
查看本地规则
[root@lvs ~]# 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.15.136:80 rr
-> 192.168.15.130:80 Route 1 0 0
-> 192.168.15.133:80 Route 1 0 0
4.保存配置,重启服务失效
[root@lvs ~]# ipvsadm-save
-A -t lvs:http -s rr
-a -t lvs:http -r 192.168.15.130:http -g -w 1
-a -t lvs:http -r 192.168.15.133:http -g -w 1
ipvsadm相关参数
[root@Directory ~] # ipvsadm –help
-A 添加虚拟服务器
-t 设置群集地址(VIP,Virtual IP )
-s 指定负载调度算法
-a 添加真实服务器
-d 删除真实服务器
-r 指定真实服务器(Real Server)的地址
-m 使用 NAT 模式; -g 、 -i 分别对应 DR 、 TUN 模式
-w 为节点服务器设置权重,默认为 1
-C 清除策略
RS端
所有真实主机都做
1.绑定VIP,添加本机访问VIP的路由信息
[root@RS01 ~]# ifconfig lo:136 192.168.15.136 netmask 255.255.255.255 up
[root@RS01 ~]# route add -host 192.168.15.136 dev lo
2.手工在RS端抑制ARP响应
[root@localhost ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@localhost ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@localhost ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@localhost ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
测试
客户端访问
[root@Client ~]# for ((i=1;i<11;i++));do curl 192.168.15.136;done
LVS上监控
[root@node02 ~]# watch ipvsadm -Ln
脚本实现LVS-DR模式配置
LVS上
删除VIP
[root@lvs ~]# nmcli connection modify ens33 -ipv4.addresses 192.168.15.136/24
[root@lvs ~]# nmcli connection up ens33
脚本代码
[root@lvs init.d]# vim lvs_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 DR
LOCK=/var/lock/ipvsadm.lock
VIP=192.168.15.136
RIP1=192.168.15.130
RIP2=192.168.15.133
DipName=ens33
. /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}:136 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev ${DipName}:136
#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}:136
/sbin/ifconfig ${DipName}:136 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
添加使用权限以及设置开机自启动
[root@lvs ~]# chmod +x /etc/init.d/lvs_dr
[root@lvs ~]# chkconfig --add lvs_dr
[root@lvs ~]# chkconfig lvs_dr on
[root@lvs ~]# systemctl start lvs_dr
设置启动级别
[root@lvs ~]# chkconfig --del lvs_dr #删除默认的启动级别
[root@lvs ~]# chkconfig --level 35 lvs_dr on
[root@lvs ~]# chkconfig --list lvs_dr
验证是否成功
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-RIP
LOCK=/var/lock/ipvsadm.lock
VIP=192.168.15.136
. /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:136 $VIP netmask 255.255.255.255 broadcast $VIP up
/sbin/route add -host $VIP dev lo:136
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/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
/bin/touch $LOCK
echo "starting LVS-DR-RIP server is ok !"
fi
}
stop() {
/sbin/route del -host $VIP dev lo:136
/sbin/ifconfig lo:136 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/eth0/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/eth0/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/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
添加为系统服务,设置启动级别并设置为开机自启动
[root@rs01 ~]# chmod +x /etc/init.d/lvs_rs
[root@rs01 ~]# chkconfig --add lvs_rs
[root@rs01 ~]# chkconfig lvs_rs on
[root@rs01 ~]# chkconfig --level 35 lvs_rs on
[root@rs01 ~]# systemctl start lvs_rs
验证