架构图:
(1)保证前端路由器将目标IP为VIP的请求报文发送给director,将RS上的VIP配置为lo接口的别名;
解决办法:
静态绑定
arptables
修改RS主机内核参数:/proc/sys/net/ipv4/conf
arp_ignore=1
arp_announce=2
(2)RS的RIP可以使用私有地址,也可以使用公网地址
(3)RS和Director必须在同一物理网络中
(4)请求报文经由Director调度,但响应报文一定不能经由Director,由RS直接响应给client。
(5)不支持端口映射
(6)RS可以支持大多数OS
(7)RS网关不能指向DIP
工作方式:
上面说了NAT模型的实现方式,那么NAT模型有个缺陷,因为进出的每个数据包都要经过Director Server,当集群系统负载过大的时候Director Server将会成为整个集群系统的瓶颈,
那么DR模型就避免了这样的情况发生,DR模型在只有请求的时候才会经过Director Server, 回应的数据包由Real Server 直接响应用户不需要经过Director Server,其实三种模型中最常用的也就是DR模型了。
下面是它的工作流程:
1, 首先用户用CIP请求VIP
2, 根据上图可以看到,不管是Director Server还是Real Server上都需要配置VIP,那么当用户请求到达我们的集群网络的前端路由器的时候,请求数据包的源地址为CIP目标地址为VIP,
此时路由器会发广播问谁是VIP,那么我们集群中所有的节点都配置有VIP,此时谁先响应路由器那么路由器就会将用户请求发给谁,这样一来我们的集群系统是不是没有意义了,
那我们可以在网关路由器上配置静态路由指定VIP就是Director Server,或者使用一种机制不让Real Server 接收来自网络中的ARP地址解析请求,这样一来用户的请求数据包都会经过Director Servrer
3,当Director Server收到用户的请求后根据此前设定好的调度算法结果来确定将请求负载到某台Real Server上去,假如说此时根据调度算法的结果,会将请求负载到RealServer 1上面去,
此时Director Server 会将数据帧中的目标MAC地址修改为Real Server1的MAC地址,然后再将数据帧发送出去
4,当Real Server1 收到一个源地址为CIP目标地址为VIP的数据包时,Real Server1发现目标地址为VIP,而VIP是自己,于是接受数据包并给予处理,当Real Server1处理完请求后,
会将一个源地址为VIP目标地址为CIP的数据包发出去,此时的响应请求就不会再经过Director Server了,而是直接响应给用户。
编辑DR有三种方式(目的是让用户请求的数据都通过Director Server)
第一种方式:在路由器上明显说明vip对应的地址一定是Director上的MAC,只要绑定,以后再跟vip通信也不用再请求了,这个绑定是静态的,所以它也不会失效,也不会再次发起请求,但是有个前提,我们的路由设备必须有操作权限能够绑定MAC地址,万一这个路由器是运行商操作的,我们没法操作怎么办?第一种方式固然很简便,但未必可行。
第二种方式:在给别主机上(例如:红帽)它们引进的有一种程序arptables,它有点类似于iptables,它肯定是基于arp或基于MAC做访问控制的,很显然我们只需要在每一个real server上定义arptables规则,如果用户arp广播请求的目标地址是本机的vip则不予相应,或者说相应的报文不让出去,很显然网关(gateway)是接受不到的,也就是director相应的报文才能到达gateway,这个也行。第二种方式我们可以基于arptables。
第三种方式:在相对较新的版本中新增了两个内核参数(kernelparameter),第一个是arp_ignore定义接受到ARP请求时的相应级别;第二个是arp_announce定义将自己地址向外通告是的通告级别。【提示:很显然我们现在的系统一般在内核中都是支持这些参数的,我们用参数的方式进行调整更具有朴实性,它还不依赖于额外的条件,像arptables,也不依赖外在路由配置的设置,反而通常我们使用的是第三种配置】
arp_ignore:定义接受到ARP请求时的相应级别
0:只要本地配置的有相应地址,就给予响应。
1:仅在请求的目标地址配置请求到达的接口上的时候,才给予响应(当别人的arp请求过来的时候,如果接收的设备上面没有这个ip,就不响应,默认是0,只要这台机器上面任何一个设备上面有这个ip,就响应arp请求,并发送MAC地址应答。)
2:只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3:不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
4-7:保留未使用
8:不回应所有(本地地址)的arp查询
arp_announce:定义将自己地址向外通告是的通告级别;
0: 将本地任何接口上的任何地址向外通告
1:试图仅想目标网络通告与其网络匹配的地址
2:仅向与本地借口上地址匹配的网络进行通告
部署
在Real Server1 和Real Server2上做以下配置
# 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
#以上命令需填加到/etc/rc.local文件中让其开机自动生效
# vim /etc/sysconfig/network-scripts/ifcfg-lo:0 内容如下
DEVICE=lo:0
IPADDR=100.64.227.87
NETMASK=255.255.255.255
BROADCAST=100.64.227.87
ONBOOT=yes
NAME=loopback
# ifdown lo:0
# ifup lo:0
# route add -host 100.64.227.87 dev lo:0
# echo "route add -host 100.64.227.87 dev lo:0" >> /etc/rc.local
在Director Server上做以下配置
# vim /etc/sysconfig/network-scripts/ifcfg-ens33:0 内容如下
DEVICE=ens33:0
IPADDR=100.64.227.87
NETMASK=255.255.255.255
BROADCAST=100.64.227.87
ONBOOT=yes
# ifdown ens33:0
#命令
# ifup ens33:0
# route add -host 100.64.227.87 dev ens33:0
# echo "route add -host 100.64.227.86 dev ens33:0" >> /etc/rc.local
# echo "1" > /proc/sys/net/ipv4/ip_forward
# echo "echo "1" > /proc/sys/net/ipv4/ip_forward" >> /etc/rc.local
# ipvsadm -A -t 100.64.227.87:80 -s wlc
# ipvsadm -a -t 100.64.227.87:80 -r 172.16.100.10 -g -w 2
# ipvsadm -a -t 100.64.227.87:80 -r 172.16.100.11 -g -w 1