Z.S.K.'s Records

LVS-DR工作原理图文详解

VS/DR的体系结构:

为了阐述方便,我根据官方原理图另外制作了一幅图,如下图所示:

LVS-DR1

LVS-DR:

LVS-DR2

DR 值 Direct Routing,直接路由,DR 模型中,Director 和 Realserver 处在同一网络中,对于 Director,VIP 用于接受客户端请求,DIP 用于和 Realserver 通信。对于 Realserver,每个 Realserver 都配有和 Director 相同的 VIP(此 VIP 隐藏,关闭对 ARP 请求的响应),仅用户响应客户端的请求,RIP 用于和 Director 通信。
当客户端请求集群服务时,请求报文发送至 Director 的 VIP(Realserver的 VIP 不会响应 ARP 请求),Director 将客户端报文的源和目标 MAC 地址进行重新封装,将报文转发至 Realserver,Realserver 接收转发的报文。此时报文的源 IP 和目标 IP 都没有被修改,因此 Realserver 接受到的请求报文的目标 IP 地址为本机配置的 VIP,它将使用自己的 VIP 直接响应客户端。
LVS-DR 模型中,客户端的响应报文不会经过 Director,因此 Director 的并发能力有很大提升。

LVS-DR 模型特性:

  • 保证前端路由器将目标地址为 VIP 的报文通过 ARP 解析后送往 Director。
  • 静态绑定:在前端路由将 VIP 对应的目标 MAC 地址静态配置为Director VIP 接口的 MAC 地址。
  • arptables:在各 Realserver 上,通过 arptables 规则拒绝Realserver响应来自客户端对 VIP 的 ARP 广播请求
  • 修改内核参数:在 Realserver 上修改内核参数,并结合地址的配置方式实现拒绝响应对 VIP 的 ARP 广播请求
  • 各RIP 必须与 DIP 在同一个物理网络中
  • RS 的 RIP 可以使用私有地址,也可以使用公网地址,以方便配置
  • Director 仅负责处理入站请求,响应报文由 Realserver 直接发往客户端
  • Realserver 不能将网关指向 DIP,而直接使用前端网关
  • 不支持端口映射

我将结合这幅原理图及具体的实例来讲解一下LVS-DR的原理,包括数据包、数据帧的走向和转换过程。
官方的原理说明:Director接收用户的请求,然后根据负载均衡算法选取一台realserver,将包转发过去,最后由realserver直接回复给用户。

实例场景设备清单:

LVS-DR3

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

① client向目标vip发出请求,Director接收。此时IP包头及数据帧头信息如下:
LVS-DR4
② VS根据负载均衡算法选择一台active的realserver(假设是192.168.57.122),将此RIP所在网卡的mac地址作为目标mac地址,发送到局域网里。此时IP包头及数据帧头信息如下:
LVS-DR5
③ realserver(192.168.57.122)在局域网中收到这个帧,拆开后发现目标IP(VIP)与本地匹配,于是处理这个报文。随后重新封装报文,发送到局域网。此时IP包头及数据帧头信息如下:
LVS-DR6
④ 如果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
    

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

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

    这两条是可以不用的,因为arp对逻辑接口没有意义。

  4. 如果你的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地址作为优先的网络接口
  5. LVS/DR load balancer(director)与RS为什么要在同一网段中?
    从第一个问题中大家应该明白vs/dr是如何将请求转发给RS的了吧?它是在数据链路层来实现的,所以director必须和RS在同一网段里面。

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

    • 如果是用了keepalived等工具做HA或者Load Balance,则在健康检查时需要用到DIP。
    • 没有健康检查机制的HA或者Load Balance则没有存在的实际意义。
  7. LVS/DR ip_forward需要开启吗?
    不需要。因为director跟realserver是同一个网段,无需开启转发。

  8. 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地址一样对外通告的,不要搞得这么特殊.

参考文章:

转载请注明出处https://izsk.me


Z.S.K. wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?