VS/DR的架构:
1、调度器和服务器组都必须在物理上有一个网卡通过局域网相连,如通过高速的交换机或者HUB相连。
2、VIP地址被调度器和服务器共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文。
3、所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外是不可见的,只是用于处理目标地址为VIP的网络请求。
VS/DR的连接调度和管理与VS/NAT和VS/TUN一样,但它的报文转发方法不同:它将报文直接路由给目标服务器。
在VS/DR中,调度器根据各自服务器的负载情况,动态的选择一台服务器,
“不修改也不封装IP报文,而是将数据帧的MAC地址改为选出服务器的MAC地址,再将修改后的数据帧在服务器组所在的局域网内发送“;
因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该IP报文。
当服务器发现报文的目标地址(VIP地址)是在本地的网络设备上,服务器处理则个报文后,就会根据路由表将响应报文直接返回给客户。
在VS/DR中,根据默认的TCP/IP协议栈处理,请求报文的目标地址为VIP,响应报文的源地址肯定也为VIP,所以响应报文不需要做任何修改,可以直接返回给客户,客户得到正常的服务,
但不会知道是哪一台服务器处理的。
VS/DR负载调度器与VS/TUN一样,只处于从客户到服务器的半连接中,按照半连接的TCP有限状态机进行状态迁移。
当client发送请求到路由器时,此时的报文是CIP|VIP,应该发往VIP,作为DR模型来讲,所有主机均共享一个IP,那么,这就出问题了,这个报文到底发往哪个服务器上,是发往realserver上还是director上,本应该是发往director,进行调度的,但是由于具有相同的ip,就不知道应该发往哪台主机,那么,就在这个数据帧改一个MAC地址,表明director的地址,这样固然是对的,但是Router怎么知道你的MAC地址呢,而且这个Router未必是你的,有可能是运营商的,当然是自己的更好,往Router写上MAC就行,这个就是第一种方式:
1、VIP:手动绑定MAC地址
但是,通用的来讲,这种固然不行,那么就出现一种情况,谁先响应我就认为谁是director,额,肯定不行,所以应该给realserver设定规则,当是VIP的目标地址时,realserver的响应级别就没有director的响应级别高,那么,就好办了,,所以在RedHat系列的OS上,有一个arptables表,这个表记录了IP到MAC地址之间的关系,允不允许响应,允不允许访问,这个也挺好,可实现
2、arptables:写规则不予响应
但是作为一个OS,能在内核上实现必然是最好的,Linux具有了这个功能,如下所示,第一个定义响应级别,第二个定义通告级别
3、Kernel parameter:
arp_ignore:接收到ARP请求时的响应级别;
0:只要本地配置的有相应地址就给予相应;
1:仅在请求的目标地址与请求到达的接口上的时候才给予响应;
…
arp_announce:定义将自己地址向外通告时的通告级别;
默认都为0
0:将本机任何接口上的任何地址向外通告
1:试图仅向目标网络通告与其网络匹配的地址
2:仅向与本地接口上地址匹配的网络进行通告
Director:
eth0,DIP:172.16.100.2
eth0:0 , VIP:172.16.100.1
RS1:
eth0,RIP1:172.16.100.7
LO:0,VIP:172.16.100.1
RS2:
eth0,RIP1:172.16.100.8
LO:0,VIP:172.16.100.1
都为桥接
Director:
setup–> eth0 172.16.100.2/16
ifconfig eth0:0 172.16.100.1/16
#route add -host 172.16.100.1 dev eth0:0
#ipvsadm -A -t 172.16.100.1:80 -s wlc
#ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.7 -g
#ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.8 -g
RS1:
#vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
ONBOOT=no
NETMASK=255.255.0.0
IPADDR=172.16.100.7
GATEWAY=172.16.0.1
TYPE=Ethernet
#cd /proc/sys/net/ipv4/conf/
sysctl -w net.ipv4.conf.eth0.arp_announce=2
sysctl -w net.ipv4.conf.all.arp_announce=2
#sysctl -w net.ipv4.conf.eth0.arp_ignore=1
#sysctl -w net.ipv4.conf.all.arp_ignore=1
#ifconfig lo:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up
#route add -host 172.16.100.1 dev lo:0
echo “RS1” > /var/www/html/index.html & service httpd start
RS2:
#vim /etc/sysconfig/network-scripts/ifcfg-eth0
NETMASK=255.255.0.0
IPADDR=172.16.100.8
GATEWAY=172.16.0.1
TYPE=Ethernet
#cd /proc/sys/net/ipv4/conf/
sysctl -w net.ipv4.conf.eth0.arp_announce=2
sysctl -w net.ipv4.conf.all.arp_announce=2
#sysctl -w net.ipv4.conf.eth0.arp_ignore=1
#sysctl -w net.ipv4.conf.all.arp_ignore=1
#ifconfig lo:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up
#route add -host 172.16.100.1 dev lo:0
echo “RS2” > /var/www/html/index.html & service httpd start
访问172.16.100.1即可;;
如果其中的RS2坏了怎么办,例如
iptables -t -A INPUT -p tcp –dport 80 -d 172.16.100.8 -j REJECT
这是就没法轮询到RS2
转下一个
有脚本。。。。。。。。。。