LVS 三种模式(VS/NAT、VS/DR、VS/TUN)

VS/NAT 地址转换

    基于 NAT 的负载机制其实是经过修改数据包中的目的 IP 地址,将用户的请求转发给 Real Server 。算法

  1. 用户请求 VIP,请求报文经过客户端发送到 Director Server;
  2. Director Server 根据调度算法从后端 Real Server 中选出一台,并将数据包中的目的地址(VIP)改成选定服务器的 IP 地址,并转发报文;
  3. Real Server 接收请求报文处理,并发送响应报文到 Director Server(由于此时的源地址为 RIP,这样会暴露Real Server 的 IP 地址,与 LVS 集群理念背道而驰);
  4. Director Server 接收响应报文,并修改源地址为 VIP,发送响应报文给用户;

    可是在这种机制下,Director Server 即接收请求报文,同时也接收响应报文,每每会成为瓶颈的存在。后端

vip=192.168.0.200
rip1=10.10.0.1
rip2=10.10.0.2
ipvsadm -E -t $vip:80 -s wrr
ipvsadm -e -t $vip:80 -r $rip1 -m -w 3
ipvsadm -e -t $vip:80 -r $rip2 -m -w 1

    只需在 Director Server 使用 ipvsadm 工具配置便可bash

# 查看配置的 LVS 规则
ipvsadm -L -n

    

VS/DR 直接路由

    LVS 经常使用的负载机制,配合 keepalive 使用能够做为一个高吞吐量的集群。服务器

  1. 用户请求 VIP,在 VS/DR 机制下,Director Server 和 Real Server 都配置有 VIP,经过抑制 Real Server 的 ARP 响应来使只有 Director Server 会收到来自路由的数据包;
  2. Director Server 根据调度算法将请求负载到 Real Server,Director Server 会修改数据帧中的目标 MAC 地址为选中的 Real Server 的 MAC 地址,并将数据帧发送出去;
  3. Real Server 收到源地址为 VIP 的数据包时,因为自身绑定了 VIP,因而接受并处理,接着响应一个源地址为 VIP 目标地址的数据包,此时响应请求无需通过 Director Server 修改源地址,由于源地址已是 VIP 了,这样就无需通过 Director Server 了,直接响应给用户。

 

    那么其中关键的一环就是让请求报文只能到达 Director Server,一般用到的方法是修改内核参数:arp_ignore、arp_announce网络

arp_ignore: INTEGER(整数)

        定义对目标地址为本地 IP 的 ARP 询问不一样的应答模式
        
        0 - 默认:回应任何网络接口上对任何本地 IP 地址的 arp 查询请求;
        1 - :只回答目标 IP 地址是来访问网络接口自身地址的 arp 查询请求(0 和 1 不一样在于,假设有 eth0:192.168.0.1/2四、eth1:10.10.0.1/24,那么 eth0 网卡收到 10.10.0.1 的 arp 查询,只有设置为 0 时才会回应,1 只有在查询 192.168.0.1 时才回应)
        2 -:只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
        3 -: 不回应该网络界面的arp请求,而只对设置的惟一和链接地址作出回应
        4-7: 保留未使用
        8 -:不回应全部(本地地址)的arp查询




arp_announce:INTEGER(整数)

        对网络接口上本地 IP 地址发出的 ARP 回应做出相应级别的限制:
        肯定不一样程度的限制,宣布对来自本地源 IP 地址发出 Arp 请求的接口
        0 - (默认) 在任意网络接口上的任何本地地址
        1 -尽可能避免不在该网络接口子网段的本地地址. 当发起ARP请求的源 IP 地址是被设置应该经由路由达到此网络接口的时候颇有用.此时会检查来访IP是否为全部接口上的子网段内 ip 之一.若是改来访IP 不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
        2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个 IP 数据包的源地址并尝试选择与能与该地址通讯的本地地址.首要是选择全部的网络接口的子网中外出访问子网中包含该目标 IP 地址的本地地址. 若是没有合适的地址被发现,将选择当前的发送网络接口或其余的有可能接受到该 ARP 回应的网络接口来进行发送

 

    经过在 Real Server 执行:并发

    

vip=192.168.0.38
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0

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

    添加 VIP 到 lo,这样就保证了 Real Server 的 eth0 网口收到 arp 查询时不会响应,同时 vip 也绑定到 Real Server 上了。工具

 

VS/TUN:隧道

    机制跟 DR 同样,只是在转发的时候,它须要从新包装IP报文。这里的real server(图中为RIP)离得都比较远。spa

    用户请求之后,到director上的VIP上,它跟DR模型同样,每一个realserver上既有RIP又有VIP,Director就挑选一个real server进行响应,但director和real server并不在同一个网络上,这时候就用到隧道了,Director进行转发的时候,必定要记得CIP和VIP不能动。code

    咱们转发是这样的,让它的CIP和VIP不动,在它上面再加一个IP首部,再加的IP首部源地址是DIP,目标地址的RIP的IP地址。收到报文的RIP,拆掉报文之后发现了里面还有一个封装,它就知道了,这就是隧道。server

    其实数据转发原理和DR是同样的,不过这个我我的认为主要是位于不一样位置(不一样机房);LB是经过隧道进行了信息传输,虽然增长了负载,但是由于地理位置不一样的优点,仍是能够参考的一种方案;

相关文章
相关标签/搜索