场景一:拥有多个公网IP且在同一网段
这是最容易部署的一种场景,但并不是最优化的应用场景。之所以说它不是最优化的应用场景,是因为这是最消耗公网IP的一种场景,在这个后ipv4的时代,ip地址是紧缺资源,在达到系统性能最大化之后应该考虑尽量节约资源。
实验环境
在实验环境下使用的是私网IP,映射到公网IP后同样的网络拓扑依然可行。所以下文将视图【VS/DR 结构图(一)】中的所有IP地址为公网IP。
实验环境分析
在上图【VS/DR 结构图(一)】中,用四台Linux主机组成一个LVS集群。其中一台主机(P0/4)作为Director,其他三台(P0/1、P0/2、P0/3)作为RealServer。
由图分析可看出此集群共消耗了5个公网IP,但只有三个RealServer对外部用户提供服务。其实在当前场景中:群集所消耗的公网IP = RealServer数 + 2;在提供同样服务的情况下与其他场景比较,这种场景是最消耗公网IP的。
环境配置
实验环境配置分为两部分,第一部是对负载调度器主机也就是Director主机的配置,第二部分是对各个真实服务器节点的配置。稍候分小节介绍。现在对实验环境的主机和系统进行说明。
路由器和交换机各一台都是使用的是DynamipsGUI(小凡)模拟的思科3640。
P0/0是使用VMWare虚拟的一台win10系统,ip地址为192.168.3.101。用于请求LVS中的http服务器,来验证LVS配置完成且工作正常。
P0/1、P0/2、P0/3、P0/4都是使用VMWare虚拟出来的CentOS6.9系统。其中P0/4作为Director,其他三台作为 RealServer。IP地址与图片【VS/DR 结构图(一)】中描述的完全一至。
有关如何将VMWare虚拟出来的机器与DynamipsGUI模拟出来的跟帖相连的问题,我会在另一篇文章中详细说明。等写完后会把链接更新到这里。在后面的场景中不再赘述。
对Director主机的配置
首先是要安装ipvsadm软件包:
yum install -y ipvsadm
然后是对ipvsadm进行配置:
-A -t 192.168.11.20:80 -s rr
-a -t 192.168.11.20:80 -r 192.168.11.22:80 -g -w 1
-a -t 192.168.11.20:80 -r 192.168.11.22:80 -g -w 1
-a -t 192.168.11.20:80 -r 192.168.11.23:80 -g -w 1
从图片【VS/DR 结构图(一)】中可以看到在Director中VIP是配置在lo:0上面的。
ifconfig lo:0 192.168.11.20 netmask 255.255.255.255 up
你也可以把Director中的VIP配置在一个真实网卡,前提条件是你得有这么一个网卡,并且通过这个网卡可以接收来自互联网的访问。
ifconfig eth1 192.168.11.20 netmask 255.255.255.255 up
至此Director的配置工作结束。
需要特别说明的是:在VS/DR模块下Director是不需要开启ip_forword(路由转发)功能的。在此后的各个场景中不再赘述。
对RealServer节点的配置
所有RealServer节点,除了RIP不同之外,其他配置都是一样的。
首先需要把VIP配置在RealServer节点的lo:0网卡上:
ifconfig lo:0 192.168.11.20 netmask 255.255.255.255 up
因为所有RealServer与Director是在同一个网段中(同一局域网中),所以需要对所有RealServer进行ARP抑制;避免因RealServer主机应答对VIP的ARP询问,而造成局域网内ARP解析混乱。如果不对RealServer进行ARP抑制,那么用户对VIP的请求是由哪台服务器应答的将不可预知。
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
有关arp_ignore 和 arp_announce参数更详细的介绍请参阅Linux 内核参数 arp_ignore & arp_announce 详解。
至此RealServer的配置也完成了。
编制自动化脚本
为了启动和关闭方便,我们可以编制两个使用service指令进行服务管理的脚本,还可以把他们注册到系统服务中,并设置开机启动。
注:编制自动化脚本的示例只在此场景中说明一次,后面场景的自动化脚本读者可以根据当前场景的两个脚本进行适当的改造后得到。
Director上的启动脚本 lvs_dr-d
#!/bin/sh
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
#
LOCK=/var/lock/lvs-dr.lock
VIP=192.168.11.20
RIP1=192.168.11.21
RIP2=192.168.11.22
RIP3=192.168.11.23
. /etc/rc.d/init.d/functions
start() {
PID=`ipvsadm -Ln | grep ${VIP} | wc -l`
if [ $PID -gt 0 ];
then
echo "The LVS-DR Director Server is already running !"
else
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
#Clear IPVS Table
/sbin/ipvsadm -C
#Set Lvs
/sbin/ipvsadm -At $VIP:80 -s rr
/sbin/ipvsadm -at $VIP:80 -r $RIP1:80 -g -w 1
/sbin/ipvsadm -at $VIP:80 -r $RIP2:80 -g -w 1
/sbin/ipvsadm -at $VIP:80 -r $RIP3:80 -g -w 1
/bin/touch $LOCK
#Run Lvs
echo "starting LVS-DR Director Server is ok !"
fi
}
stop() {
#stop Lvs server
/sbin/ipvsadm -C
/sbin/ifconfig lo:0 down >/dev/null
rm -rf $LOCK
echo "stopping LVS-DR Director server is ok !"
}
status() {
if [ -e $LOCK ];
then
echo "The LVS-DR Director Server is already running !"
else
echo "The LVS-DR Director Server is not running !"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 1
start
;;
status)
status
;;
*)
echo "Usage: $1 {start|stop|restart|status}"
exit 1
esac
exit 0
把上面的脚本放到/etc/init.d/目录下。并授予其可执行权限:
chmod o+x /etc/init.d/lvs_dr-d
然后使用如下指令设置为开机启动。
chkconfig --level 35 lvs_dr-d on
RealServer上的启动脚本 lvs_dr-r
#!/bin/sh
#
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR-RealServer
#
LOCK=/var/lock/ipvsadm.lock
VIP=192.168.11.20
. /etc/rc.d/init.d/functions
start() {
PID=`ifconfig | grep lo:0 | wc -l`
if [ $PID -ne 0 ];
then
echo "The LVS-DR-RealServer is already running !"
else
# 配置lo:0网卡
/sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP up
# 配置lo:0网卡的arp策略
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-RealServer is ok !"
fi
}
stop() {
# 关闭lo:0网卡
/sbin/ifconfig lo:0 down
# 配置lo:0网卡的arp策略
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-RealServer is ok !"
}
status() {
if [ -e $LOCK ];
then
echo "The LVS-DR-RealServer is already running !"
else
echo "The LVS-DR-RealServer 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
把上面的脚本放到/etc/init.d/目录下。并授予其可执行权限:
chmod o+x /etc/init.d/lvs_dr-r
然后使用如下指令设置为开机启动。
chkconfig --level 35 lvs_dr-r on
场景二:只有一个公网IP
这是最节约公网IP的一种场景,无论你有多少个RealServer节点都只需要一个公网IP。但你必须要有一个可自主配置的路由器才行。
实验环境
如上图【VS/DR 结构图(二)】中,虽然使用的都是私网的IP地址,但我们可以认为192.168.x.x为公网IP(映射到公网后该网络拓扑依然可行)。而10.0.0.x为私网IP。从这个图中你应该能理解为什么说这种场景需要有一个可自主配置的路由器了。因为你需要在路由器E0/1口上配置私网IP。
关于实验环境的分析,大家可以参考场景一自行理解,在此就不赘述了。
对Director主机的配置
首先是要安装ipvsadm软件包:
yum install -y ipvsadm
然后是对ipvsadm进行配置:
-A -t 192.168.11.20:80 -s rr
-a -t 192.168.11.20:80 -r 10.0.0.21:80 -g -w 1
-a -t 192.168.11.20:80 -r 10.0.0.22:80 -g -w 1
-a -t 192.168.11.20:80 -r 10.0.0.23:80 -g -w 1
从图片【VS/DR 结构图(二)】中可以看到在Director中VIP是配置在eth1上面的。
ifconfig eth1 192.168.11.20 netmask 255.255.255.0 up
## OR
ifconfig eth1 192.168.11.20 netmask 255.255.255.255 up
如果你的网卡资源不够,你也可以把Director中的VIP配置在环回网卡lo上或eth0:0网卡上。
ifconfig lo:0 192.168.11.20 netmask 255.255.255.0 up
ifconfig eth0:0 192.168.11.20 netmask 255.255.255.0 up
## OR
ifconfig lo:0 192.168.11.20 netmask 255.255.255.255 up
ifconfig eth0:0 192.168.11.20 netmask 255.255.255.255 up
不过这种情况下你的网络拓扑也需要做相应的调整:
细心的朋友可能发现了,这里在Director上对VIP的配置子网掩码有两种。其实在当前场景下,子网掩码的选择只要保证VIP与DIP、RIP不在同一网段就行了。(其实是因为我制作拓扑图时笔误了,把Director中VIP的子网掩码写成了24位,于是就随便扩展了一下这个小知识点)
至此Director的配置工作结束。
对RealServer节点的配置
所有RealServer节点,除了RIP不同之外,其他配置都是一样的。
首先需要把VIP配置在RealServer节点的lo:0网卡上:
ifconfig lo:0 192.168.11.20 netmask 255.255.255.255 up
因为所有RealServer是在同一个网段中(同一局域网中),所以需要对所有RealServer进行ARP抑制;避免因RealServer主机应答对VIP的ARP询问,而造成局域网内ARP解析混乱。
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
至此RealServer的配置也完成了。
小结
当前场景有两种网络拓扑可供选择,但谁优谁劣我也不好评断,大家根据自己的实际情况选择吧。至于当前场景的自动化脚本,大家可以根据前面场景中的自动化脚本修改得到。
场景三:拥有多个不在同一网段的公网IP
当你拥有多个不在同一网段的公网IP,又想把它们统统利用起来时,这个场景就适用了。当你多次在多个网络运营商处购买IP地址和带宽时,通过会得到处于多个网段的IP,并且这些IP分别拥有一定的网络出口带宽。为了充分利用现有IP和带宽资源,你可以参考一下这个实验场景。
这个场景实验中的的配置方式和前面的两个场景没什么两样,不再赘述。下面把实验环境的网络拓扑分享一下,并对需要注意的细节做简要说明。
实验环境
需要注意的细节
在这个实验环境中,对的RealServer来说,Director分发过来的数据包,入口网卡是各个主机的eth1网卡,而响应数据包的出口网卡是各个主机的eth0网卡。所以就需要在各个RealServer主机上配置反向路由校验策略。
echo "2" > /proc/sys/net/ipv4/conf/all/rp_filter
## OR
echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter
echo "0" > /proc/sys/net/ipv4/conf/eth1/rp_filter
echo "0" > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo "0" > /proc/sys/net/ipv4/conf/lo/rp_filter
有关rp_filter参数更详细的介绍请参阅Linux内核参数 rp_filter。
场景四:使用多个DIP进行部署
这个场景我感觉没什么实用价值,但部署这个场景可以更深入的理解LVS中VS/DR模式的工作原理。当然你也可以拿去炫技装B。
这个场景实验中的的配置方式和前面的三个场景没什么两样,不再赘述。网络拓扑图大家自行脑补吧。
总结
通过以上面四个场景的分析与实际部署可以发现,其实在VS/DR的所有场景中VIP和DIP、RIP是不在同一网段的,而DIP和RIP是在同一网段的,通过他们的子网掩码可以看出。
1