不喜欢看长的 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
34
35
________
| |
| 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 模式就可以了。
Share!Please enable JavaScript to view the comments powered by Disqus. comments powered by