LVS-DR工做原理图文详解

原文地址: http://www.cnblogs.com/czh-liyu/archive/2011/11/29/2267963.htmlhtml

为了阐述方便,我根据官方原理图另外制做了一幅图,以下图所示:VS/DR的体系结构:算法

LVS-DR工做原理

我将结合这幅原理图及具体的实例来说解一下LVS-DR的原理,包括数据包、数据帧的走向和转换过程。网络

官方的原理说明:Director接收用户的请求,而后根据负载均衡算法选取一台realserver,将包转发过去,最后由realserver直接回复给用户。负载均衡

实例场景设备清单:tcp

实例场景设备清单

说明:我这里为了方便,client是与vip同一网段的机器。若是是外部的用户访问,将client替换成gateway便可,由于IP包头是不变的,变的只是源mac地址。工具

① client向目标vip发出请求,Director接收。此时IP包头及数据帧头信息以下:server

client向目标vip发出请求

② VS根据负载均衡算法选择一台active的realserver(假设是192.168.57.122),将此RIP所在网卡的mac地址做为目标mac地址,发送到局域网里。此时IP包头及数据帧头信息以下:htm

③ realserver(192.168.57.122)在局域网中收到这个帧,拆开后发现目标IP(VIP)与本地匹配,因而处理这个报文。随后从新封装报文,发送到局域网。此时IP包头及数据帧头信息以下:blog

④ 若是client与VS同一网段,那么client(192.168.57.135)将收到这个回复报文。若是跨了网段,那么报文经过gateway/路由器经由Internet返回给用户。接口

 

LVS/DR模式工做原理的常见问题。

1. LVS/DR如何处理请求报文的,会修改IP包内容吗?

1.1 vs/dr自己不会关心IP层以上的信息,即便是端口号也是tcp/ip协议栈去判断是否正确,vs/dr自己主要作这么几个事:

1)接收client的请求,根据你设定的负载均衡算法选取一台realserver的ip;

2)以选取的这个ip对应的mac地址做为目标mac,而后从新将IP包封装成帧转发给这台RS;

3)在hash table中记录链接信息。

vs/dr作的事情不多,也很简单,因此它的效率很高,不比硬件负载均衡设备差多少。

数据包、数据帧的大体流向是这样的:client --> VS --> RS --> client

1.2 前面已做了回答,vs/dr不会修改IP包的内容.

2. RealServer为何要在lo接口上配置VIP?在出口网卡上配置VIP能够吗?

2.1 既然要让RS可以处理目标地址为vip的IP包,首先必需要让RS能接收到这个包。

在lo上配置vip可以完成接收包并将结果返回client。

2.2 答案是不能够将VIP设置在出口网卡上,不然会响应客户端的arp request,形成client/gateway arp table紊乱,以致于整个load balance都不能正常工做。

3. RealServer为何要抑制arp帧?

这个问题在上一问题中已经做了说明,这里结合实施命令进一步阐述。咱们在具体实施部署的时候都会做以下调整:

       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

我相信不少人都不会弄懂它们的做用是什么,只知道必定得有。我这里也不打算拿出来详细讨论,只是做几点说明,就当是补充吧。

3.1

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

这两条是能够不用的,由于arp对逻辑接口没有意义。

3.2 若是你的RS的外部网络接口是eth0,那么

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

其实真正要执行的是:

echo "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/eth0/arp_announce

因此我我的建议把上面两条也加到你的脚本里去,由于万一系统里上面两条默认的值不是0,那有多是会出问题滴。

arp_ignore:

定义对目标地址为本地IP的ARP询问不一样的应答模式0

0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求

1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求

2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内

3 - 不回应该网络界面的arp请求,而只对设置的惟一和链接地址作出回应

4-7 - 保留未使用

8 -不回应全部(本地地址)的arp查询 

肯定了向外发送ARP请求的发出地址 也即便VIP 地址

arp_announce - INTEGER

对网络接口上,本地IP地址的发出的,ARP回应,做出相应级别的限制:  

肯定不一样程度的限制,宣布对来自本地源IP地址发出Arp请求的接口

0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址

1 -尽可能避免不在该网络接口子网段的本地地址作出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候颇有用.此时会检查来访IP是否为全部接口上的子网段内ip之一.若是改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.

2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通讯的本地地址.首要是选择全部的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 若是没有合适的地址被发现,将选择当前的发送网络接口或其余的有可能接受到该ARP回应的网络接口来进行发送. 

限制了使用本地的vip地址做为优先的网络接口

 

4. LVS/DR load balancer(director)与RS为何要在同一网段中?

从第一个问题中你们应该明白vs/dr是如何将请求转发给RS的了吧?它是在数据链路层来实现的,因此director必须和RS在同一网段里面。

5. 为何director上eth0接口除了VIP另外还要配一个ip(即DIP)?

5.1 若是是用了keepalived等工具作HA或者Load Balance,则在健康检查时须要用到DIP。

5.2 没有健康检查机制的HA或者Load Balance则没有存在的实际意义。

6. LVS/DR ip_forward须要开启吗?

不须要。由于director跟realserver是同一个网段,无需开启转发。

7. director的vip的netmask必定要是255.255.255.255吗?

lvs/dr里,director的vip的netmask 不必设置为255.255.255.255,也不须要再去

route add -host $VIP dev eth0:0

director的vip原本就是要像正常的ip地址同样对外通告的,不要搞得这么特殊.

相关文章
相关标签/搜索