关于LVS_DR模型的工作流程

来源:互联网 发布:网络打印机添加xp 编辑:程序博客网 时间:2024/06/06 08:50

客户端:CIP

调度器VS:VIP,DIP(VIP用于接收客户端的请求;DIP用于和本网段中的RS通讯,以便获取$RIP的MAC地址;)

真实服务器RS:VIP,RIP(VIP用于发送响应包给客户端;RIP用于和调度器通讯,以便调度器区分不同的RS;)

客户端发送一个目标是VIP的请求包,通过路由器最终到达调度器。进入VIP的网卡,经过调度器的PREROUTING链之后,查看自己的路由表,发现目标是自己,然后就会发往INPUT链;在数据到达INPUT链之前,被IPVS拦下来,通过查看IPVS中的定义的规则和算法("规则"就是通过ipvsadm命令添加的数据,例如:"ipvsadm -a -t $VIP:80 -r $RIP:80 -g -w 1"),确定了要将该请求发送到哪台RS服务器上。

在发送请求包之前,调度器会先发送一个广播包,询问"$RIP,你的mac地址是什么?"$RIP收到广播之后,就发送一个回应的广播包,说:"$RIP的MAC地址是*****"。(注意:并不是每次都要询问$RIP的MAC地址的,如果调度器中有缓存的话,也就不会再问了。)

问题:有人可能会有疑问,RS上不是拒绝响应arp请求的吗?怎么还会回应!

答案:RIP中配置的两个参数,arp_ignore=1,表示"如果这个arp请求,是询问我这个接口上的IP的mac地址的话,我才会响应。而0,表示,这个arp只要是询问我这个主机上的任何一个IP,我都要响应。"由于调度器发的arp请求中,询问的IP是$RIP,所以,只会有$RIP对应的那个网卡才会响应。

调度器收到$RIP回应的广播包之后,就将客户端的请求重新封装,请求包中的源IP和目标IP不变,将包中的目标mac地址改成$RIP的mac地址,然后将包发送给$RIP所对应的RS服务器。

当RS收到从调度器转发来的客户端的请求的时候,通过解封装后,得知客户端的请求,然后做出响应,将响应包通过本机上经过特殊处理的VIP,发送给网关。通过互联网发送给客户端。

DR配置中,有几个比较特别的步骤:

LVS上的:

ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up

表示:在eth0网卡上声明一个网卡别名eth0:0,它对应的IP是$VIP,他的广播域是他自己;(将VIP和DIP绑定在一个物理网卡上。)

route add -host $vip dev eth0:0

表示:在路由表中添加一条路由,指定,目标IP地址是$RIP的数据包,走eth0:0接口。(由于LVS上的VIP和DIP是在一个网卡上的,必须通过eth0:0接口才可以出去。)

RS上的:

ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up

表示:在本地回环网卡上声明一个网卡别名lo:0,他对应的IP是VIP,它的广播域是他自己;

route add -host $vip lo:0

表示:在路由表中添加一条路由,指定,目标IP地址是$VIP的数据包,走lo:0接口。(从这个接口,他出不去,只会在lo:0里面转。)

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore

表示:arp请求,如果是询问我这个接口上的IP的mac地址的话,我才会响应。而0,表示,这个arp只要是询问我这个主机上的任何一个IP,我都要响应。由于每个RS上都有VIP,默认值"0",会造成局域网中IP地址冲突。当路由器询问谁$VIP的mac地址的时候,RS不要响应。

注意:对于arp_ignore参数,all/ 和{interface}/ 下两者同时比较,取较大一个值生效。

echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce

echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

表示:不对外声明我在使用Vip地址,因为由于调度器和RS在同一个网络中,如果RS声明自己有$VIP的地址的话,会造成通讯紊乱,影响调度器和路由器之间的通讯。all/ 和{interface}/ 下两者同时比较,取较大一个值生效。提高约束级别有益于从指定的目标接受应答,而降低级别可以给予更多的arp查询者以反馈信息

注意:默认情况下,上面四个参数的值都是"0";