- 简介
在VS/NAT 的集群系统中,请求和响应的数据报文都需要通过负载调度器,当真实服务器的数目在10台和20台之间时,负载调度器将成为整个集群系统的新瓶颈。大多数 Internet服务都有这样的特点:请求报文较短而响应报文往往包含大量的数据。如果能将请求和响应分开处理,即在负载调度器中只负责调度请求而响应直 接返回给客户,将极大地提高整个集群系统的吞吐量。
IP隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技 术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。
我们利用IP隧道技术将请求报文封装转 发给后端服务器,响应报文能从后端服务器直接返回给客户。但在这里,后端服务器有一组而非一个,所以我们不可能静态地建立一一对应的隧道,而是动态地选择 一台服务器,将请求报文封装和转发给选出的服务器。这样,我们可以利用IP隧道的原理将一组服务器上的网络服务组成在一个IP地址上的虚拟网络服务。 VS/TUN的体系结构如下图所示,各个服务器将VIP地址配置在自己的IP隧道设备上。
- IP-TUN网络拓扑图
- 网络环境准备
准备五台计算机,一台模拟外网的互联网用户(可以是Linux也可以是Windows),一台模拟LVS服务器(必须是Linux),另三台模拟真实的服务器(Linux)。我们这里使用VMWare安装CentOS5.6作为LVS服务器,另外用VMWare再clone三台CentOS5.6作为Real Server。用WMWare安装windows(我这里用的是windows2003)作为外网的互联网用户,做实验时,请将防火墙关掉。
- 克隆三台RealServer
在CentOS5.6关机状态下,进行克隆。右击VM->Manage->Clone->Next....
这里我将3个虚拟机命名为:CentOS5.6.11,CentOS5.6.12,CentOS5.6.13
LVS的负载均衡需要用到ipvsadm,这里我们在CentOS5.6上用yum安装该软件
yum install ipvsadm
- 设置网卡的连接方式
这里LVS只需要一块网卡,所以将所有计算机的网卡都设置为:vmnet1。
- 配置IP地址
windows2003
ip:8.8.8.200 netmask:255.255.255.0
CentOS5.6
ifconfig eth0 8.8.8.10 netmask 255.255.255.0
CentOS5.6.1
ifconfig eth0 8.8.8.11 netmask 255.255.255.0
CentOS5.6.2
ifconfig eth0 8.8.8.12 netmask 255.255.255.0
CentOS5.6.3
ifconfig eth0 8.8.8.13 netmask 255.255.255.0
因为这里都是外网IP,所以不需要网关
配置ip-tun
CentOS5.6
#配置tunl0的ip地址及子网掩码 ifconfig tunl0 8.8.8.100 netmask 255.255.255.255 #添加路由表 route add -host 8.8.8.100 dev tunl0
用下面的命令查看是否多出一块tunl0的网卡:
ifconfig tunl0
用下面的命令查看路由表
route -n
说明:在一个计算机上的两个网卡不能属于同一网段,这里tunl0的子网掩码是255.255.255.255,可以将8.8.8.100划分到和其他ip地址为8.8.8.*并且子网掩码为255.255.255.0的不同网段,因为他们的子网掩码和IP地址相与得到的结果不同,前者是8.8.8.100,而后者是8.8.8.0。
在每台真实服务器(Real Server)上做如下相同操作
在CentOS5.6.1,CentOS5.6.2,CentOS5.6.3都输入下面命令
ifconfig tunl0 8.8.8.100 netmask 255.255.255.255 route add -host 8.8.8.100 dev tunl0
在每台真实服务器(Real Server)上都做arp忽略和arp宣告操作
在CentOS5.6.1,CentOS5.6.2,CentOS5.6.3都输入下面命令
echo 1 > /proc/sys/net/ipv4/conf/tunl0/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/tunl0/arp_announce echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
说明:
这里将arp_ignore设为1,arp_announce设为2的目的是,当arp广播时8.8.8.11,8.8.8.12,8.8.8.13,作出应答,而每个网卡上的8.8.8.100不做应答。具体的arp_ignore和arp_announce的含义可以参考下面的介绍
arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式
0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求
1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
4-7 - 保留未使用
8 -不回应所有(本地地址)的arp查询
arp_announce:对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址
1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.
CentOS5.6(LVS)设置ipvsadm
#清除之前的调度转换表 ipvsadm -C #增加一个带有调度算法的转换表,-A增加 t是指tcp,-s用于指明调度算法 ipvsdam -At 8.8.8.100:80 -s rr #增加要调度的真实服务器(RealServer)-r指真实服务器(Real),-m之Nat模式 -g指dr模式 -i指ip隧道模式 ipvsadm -at 8.8.8.100:80 -r 8.8.8.11:80 -i ipvsadm -at 8.8.8.100:80 -r 8.8.8.12:80 -i ipvsadm -at 8.8.8.100:80 -r 8.8.8.11:80 -i
用下面命令查看ipvsadm是否设置成功
ipvsadm -L -n
如果成功结果如图所示
- 测试是否配置成功
开启CentOS5.6.11,CentOS5.6.12,CentOS5.6.13的apache(CentOS5.6不需要启动apache),在每服务器的网站的根目录都添加一个index.html,内容分别为8.8.8.11,8.8.8.12,8.8.8.13(在真实环境中每台真实服务器的内容是一样的,这里为了看到NAT的轮询效果,把他们的内容设置为每天服务器的IP地址),在windows2003上,通过浏览器访问8.8.8.100,刷新几次,如果配置成功,则网页上会交替显示:8.8.8.11,8.8.8.12,8.8.8.13。
- IP-TUN的优缺点
在VS/TUN 的集群系统中,负载调度器只将请求调度到不同的后端服务器,后端服务器将应答的数据直接返回给用户。这样,负载调度器就可以处理大量的请求,它甚至可以调 度百台以上的服务器(同等规模的服务器),而它不会成为系统的瓶颈。即使负载调度器只有100Mbps的全双工网卡,整个系统的最大吞吐量可超过 1Gbps。所以,VS/TUN可以极大地增加负载调度器调度的服务器数量。VS/TUN调度器可以调度上百台服务器,而它本身不会成为系统的瓶颈,可以 用来构建高性能的超级服务器。
VS/TUN技术对服务器有要求,即所有的服务器必须支持“IP Tunneling”或者“IP Encapsulation”协议。目前,VS/TUN的后端服务器主要运行Linux操作系统,我们没对其他操作系统进行测试。因为“IP Tunneling”正成为各个操作系统的标准协议,所以VS/TUN应该会适用运行其他操作系统的后端服务器。