1.当客户端访问集群中的服务(例如web),源IP(定义为A)和目标IP(定义为B)如上图所示,发送数据报文到调度器上
<1>客户端发送报文必须到调度器上,不能到Rearserver上,不然无法实现调度
实现原理:虽然RS上的lo口也配置VIP,但是却无法相应,通过如下配置在RS上实现
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
arp_ignore(接受到arp请求时的响应级别,默认0)
1) 0:只要本地配置有相应的地址,给予响应
2) 1:仅在请求的目标地址配置请求到达的接口上的时候,才给于响应
arp_announce(将自己地址向外通告时的通告级别,默认0)
1) 0:将本地任何接口上的任何地址向外通告
2) 1:试图仅向目标网络通告语气网络匹配的地址
3) 2:仅向与本地接口上地址匹配的网络进行通告
2.调度器收到报文后查询ipvsadm规则,符合集群服务后发送报文到RS上,源目IP地址不变,是通过修改MAC地址发送到RS上的,
<1>调度器规则
ipvsadm -A -t 192.168.11.100:80 -s wrr
ipvsadm -a -t 192.168.11.100:80 -r 192.168.11.12 -g -w 2
ipvsadm -a -t 192.168.11.100:80 -r 192.168.11.13 -g -w 4
3.RS收到报文后,发现目标IP为自己的VIP(lo:0上配置,不对外响应,只做回报的源IP),用自己的VIP作为源地址发送报文
<1>如何实现发送报文时,源IP为自己的lo:0上的VIP,默认linux报文从哪个接口出源IP为那个接口
实现原理:ifconfig lo:1 192.168.11.100 netmask 255.255.255.255 up (配置RS的VIP,不对外响应)
route add -h 192.168.11.100 dev lo:0 (增加路由,报文目标IP为192.168.11.100的接口为lo:0,
这样回报也是通过lo:0回报,确保报文源IP为VIP)
<2>确保调度器上的发包正确,增加如下配置
ifconfig eth:0 192.168.11.100 netmask 255.255.255.255 up (添加VIP地址)
route add -h 192.168.11.100 dev eth:0
4.客户端收到后源IP为VIP,目的IP为客户端的IP,
报文的封装为:RS通过自己的lo:0回应报文,源IP则为VIP,目标IP则为客户端IP