LVS-DR工作原理及答疑

我们都知道LVS有LVS-DR,LVS-NAT,LVS-TUN三种模式,其中DR模式意为Direct Routing(直接路由),是调度器与实际服务器都有一块网卡连在同一物理网段上的情况。本文主要对LVS/DR模式原理进行了阐述,另外还有一篇<a href="http://os.51cto.com/art/201105/262536.htm"><span>FAQs</span></a>,给有相关疑问的朋友们做个参考。



<strong>LVS-DR工作原理详解</strong>



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



<img src="https://www.361way.com/wp-content/uploads/2016/05/lvs-dr-mode.png" title="lvs-dr-mode" alt="lvs-dr-mode" height="422" width="490" />



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



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



实例场景设备清单:



<img src="https://www.361way.com/wp-content/uploads/2016/05/hostinfo.png" title="lvs-hostinfo" alt="lvs-hostinfo" height="68" width="578" />



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



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



<img src="https://www.361way.com/wp-content/uploads/2016/05/mac-addr-1.png" title="lvs-mac-addr" alt="lvs-mac-addr" height="132" width="561" />



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



<img src="https://www.361way.com/wp-content/uploads/2016/05/mac-addr-2.png" title="lvs-dr-mac-addr" alt="lvs-dr-mac-addr" height="129" width="557" />



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



<img src="https://www.361way.com/wp-content/uploads/2016/05/mac-addr-3.png" alt="" height="134" width="562" />



④&nbsp;如果client与VS同一网段,那么client(192.168.57.135)将收到这个回复报文。如果跨了网段,那么报文通过gateway/路由器经由Internet返回给用户。



<span style="font-family:黑体;">==================================================================================</span>



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



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包的内容.



<strong>2. RealServer为什么要在lo接口上配置VIP?在出口网卡上配置VIP可以吗?</strong>



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



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



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



<strong>3. RealServer为什么要抑制arp帧?</strong>



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



<br />
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
<br />



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



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



这两条是可以不用的,因为arp对逻辑接口没有意义。如果你的RS的外部网络接口是eth0,那么



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



其实真正要执行的是:



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



所以我个人建议把上面两条也加到你的脚本里去,因为万一系统里上面两条默认的值不是0,那有可能是会出问题滴。



<strong>4. LVS/DR load balancer(director)与RS为什么要在同一网段中?</strong>



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



<strong>5. 为什么director上eth0接口除了VIP另外还要配一个ip(即DIP)?</strong>



5.1 如果是用了keepalived等工具做HA或者Load Balance,则在健康检查时需要用到DIP。



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



<strong>6. LVS/DR ip_forward需要开启吗?</strong>



不需要。因为director跟realserver是同一个网段,无需开启转发。



<strong>7. director的vip的netmask一定要是255.255.255.255吗?</strong>



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



<br />
route add -host $VIP dev eth0:0
<br />



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



注:本篇内容非原创,原作者为戴海军(daihaijun@gmail.com)。



另有一篇也不很不错的值得参考的文章为:<a target="_blank" href="http://blog.csdn.net/lengzijian/article/details/8089661" rel="noopener">lvs-dr模式原理详解和可能存在的“假负载均衡”</a>

LVS-DR工作原理及答疑》有3条评论

  1. 请问怎么解决VIP冲突的?另外拓扑图是用什么工具画的,谢谢!

    1. visio就可以画,不过默认的图标比较丑陋,好看的图标可以网上去找下。

  2. 如何返回客户端的IP包是vip和rmac作为源,那么自从arp后到优先的规则,不就会造成ip欺骗吗,查资料说是通过arp_announce解决的,但是具体怎么解决的,并没了解到

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注