总结一下学到的 LVS 相关知识( DR 模式)

不喜欢看长的 Blog 文章,当然更不喜欢写,所以就分开写啦。另,因为 TUN 模式限制更多,实际很可能用不到,所以不一定会写。

所以这次要讲的是 DR 模式的负载均衡啦。 DR 模式,也就是 Direct Route ,其基本原理就是不对包做任何处理,直接转给所分配的真实服务;回包则由真实服务直接发给客户端而不走负载机。因为不像 NAT 模式那样有相似的架构可以参考,所以这次就上图来说明啦(注,该图偷自这里)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
                           ________
                          |        |
                          | client |
                          |________|
                          CIP=192.168.1.254
                              |
                   CIP->VIP | |
                            v |
                              |
                           ________
                          |        |
                          | router | advertises route to VIP
                          |________|
                              |
                __________    |
               |          |   |    VIP=192.168.1.110 (eth0:0, arps)
               | director |---+     DIP=192.168.1.1 (eth0)
               |__________|   |
                              |  ^
MAC_DIP->MAC_RIP1(CIP->VIP) | |  |  VIP->CIP
                            v |
                              |
             +----------------+------------------+
             |                |                  |
             |                |                  |
      RIP1=192.168.1.2  RIP2=192.168.1.3  RIP3=192.168.1.4 (eth0)
      VIP=192.168.1.110 VIP=192.168.1.110 VIP=192.168.1.110 (all lo:0, non-arping)
      _____________     _____________      _____________
     |             |   |             |    |             |
     |   CIP->VIP  |   |             |    |             |
     |   VIP->CIP  |   |             |    |             |
     | realserver  |   | realserver  |    | realserver  |
     |_____________|   |_____________|    |_____________|

首先,负载机(即图中的 director )需要将服务发布地址配置成网卡的从地址 VIP(我还不太清楚为什么不能直接配成第一地址),以便接收来自客户端的 IP 报文。然后,它会根据分配置策略选择一个真实服务器(即图中的 realserver ),并将这个 IP 报文直接转发过去,而这就需要真实服务器也有一个从地址配置成 VIP (一般都配到 lo 网口上)。可是,大家都是在一个网段的,如果没有什么措施的话,那一开始来自客户端的目的地址为 VIP 的 IP 报文就不知道要由谁来处理了。所以,在真实服务器上都要把 lo 这个网卡的 ARP 广播与响应功能给禁掉,让客户端不知道真实服务器也有 VIP 这个地址。而负载机则是通过真实服务器的真实地址(非 VIP )得知它的 MAC 地址,进而进行转发的。

而当真实服务器需要往回发报文的时候,因为与客户端之间并不像 NAT 那样不在同一网段,也没有被负载机隔来,所以回应报文就通过正常途径直接到了客户端的手(网口?)中。

这样一来,相比 NAT 模式而言,其额外的配置工作主要就是 VIP 从地址的配置以及 ARP 相关功能的禁用了。让我们一步一步来吧。首先是负载机的 VIP 配置(真实地址的配置就跟正常的一样,不写了):

1
2
$ sudo ifconfig eth0:0 192.168.1.110 broadcast 192.168.1.110 netmask 255.255.255.255
$ sudo route add -host 192.168.1.110 eth0:0

然后是真实服务器的 VIP 配置:

1
2
$ sudo ifconfig lo:0 192.168.1.110 broadcast 192.168.1.110 netmask 255.255.255.255
$ sudo route add -host 192.168.1.110 eth0:0

与负载机唯一不同的就是要把地址配到 lo 上。接下来是禁掉这个网卡的 ARP 相关的功能(这里就用不了 sudo 了,必须直接用 root 用户,不知道为嘛):

1
2
3
4
# 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

当然更好的办法是修改 /etc/sysctl.conf 文件,然后执行 sysctl -p 命令来使修改生效。这样做的好处是配置被保存下来了,下次开机还有效,而且也可以用 sudo 来做。

地址配完了,最后就是 ipvsadm 本身的配置了:

1
2
3
4
$ sudo ipvsadm -A -t 192.168.1.110:22 -s rr
$ sudo ipvsadm -a -t 192.168.1.110:22 -r 192.168.1.2:22 -g
$ sudo ipvsadm -a -t 192.168.1.110:22 -r 192.168.1.3:22 -g
...

嗯,跟 NAT 模式唯一的不同就是 -g 选项,表示 DR 模式。因为是默认选项,所以不写 -g 也可以。

TCP 服务的话这样就可以了,可是 UDP 服务却还有一些问题需要解决。正如上面所说,服务端发给客户端的回包是不经过负载的,这样的话,如果这个服务程序没有绑定到特定网卡的话,这个回包的源地址默认就是服务器本身的真实地址(如 192.168.1.2 )了,而这样的回包一般是不会被客户端所接受的,因为客户端当初可是往 VIP 这个地址发的请求包。而最通用的解决方法就是将该服务显式绑定到 VIP 这个地址上,强迫其回包的源地址为 VIP ,而这正是客户端所希望看到的。

由上可知,DR 模式相对 NAT 模式而言,对真实服务器来说就是侵入式的配置方式,增加了不少配置工作和限制,而其性能方面的优势据说在现在也大大降低了。因此一般应用的话,直接用 NAT 模式就可以了。

 
comments powered by Disqus