路由应用-使用路由实现负载流量均衡

来源:互联网 发布:身份证借别人开淘宝 编辑:程序博客网 时间:2024/05/18 17:01

1.问题

要实现负载流量均衡,有很多方法,在Linux上LVS是一种不错的选择,然则配置却相对复杂,其实现原理很奇怪,在Netfilter的INPUT链上实现了一个HOOK,然后处理后再将数据包OUTPUT出去。我们知道Netfilter的HOOK方式虽然功能强大,几乎无所不能(你甚至可以在里面注册一个USB设备检测程序),然而过多的条件判断和处理逻辑在网络多并发大负载的情况下会严重影响性能,因此对于性能要求高的需求,还是对Netfilter的方案敬而远之吧,比如,在部署IPSec时,虽然FreeSWAN几乎完全兼容了IPSec标准,然而由于它是Netfilter实现的,性能上会大打折扣。
      我们希望用原生的协议栈特性来实现负载均衡。我首选路由,因为路由的灵活性最高,它完全是用户自己配置的,而不像协议解析时是标准规定的。正如《使用策略路由实现访问控制》里面的方案一样,本文使用路由来实现本应该由第三方协议栈过滤驱动实现的负载均衡模块

2.原理

所谓高可用性负载均衡本质的一个解释就是将本应该由一个服务处理的请求分担给多个服务器,其实现的要点首先就是将请求数据包分离,然后导向不同的服务器,这种方式是最平滑的,我们知道,路由是专门将数据包分离到不同的路径的。

2.1.分离到不同的目的地址

实现请求数据包的分离的根本就是将目的地址分离,比如本来是一个目的地址addr,现在需要将其分离为addr1,addr2,addr3,...addrn。我们知道,做到这点,最好的办法就是做DNAT。Linux的NDAT是用Netfilter做的,然而它的实现却和filter不同,DNAT基于IP_CONNTRACK,而CONNTRACK状态的维护是hash表做的,实现很高效,再者,CONNTRACK是基于状态的,只有对每个流的第一个数据包才会经过所有的规则,后续的包只须匹配到流,然后直接取target结果,而匹配到流是hash完成的,十分高效。
     本文讨论是一种方案,并不限于Linux,Cisco系统,H3C系统的DNAT实现可能都比Linux更高效,这样再配合其高效的路由系统,负载均衡就更完美了。

2.2.配置分离后地址的路由

比如一个地址addr被DNAT随机分离成了addr1,addr2,那么我们就可以配置到达addr1和addr2的路由,使之到达不同的服务器。这条原理十分简单。

2.3.链路层复用

上述的addr1,addr2,...addrn,并不一定要通过不同的网卡出去,我们知道链路层是可以被不同IP网段的流量所复用的,也就是说,一个用交换机互联(hub亦可)的以太网上可以配置多个IP网段,交换机对arp通信是完全通透的,因此即使负责负载均衡的机器中只有两个网卡,那么也可以使用另一块网卡来作为总的出口,然后将addr1,addr2...addrn等n台服务器部署在一个以太网中。
2.4.使用30位子网掩码省去路由的配置
上述的方案需要手动配置到达addr1,addr2,addrn的路由,当然你也可以在链路层复用的情况下手动配置一条默认路由。然而有没有办法不用配置路由呢?答案是肯定的,我们考虑一个30为掩码的网段,其中共有4个IP地址,除去全0的网络地址和全1的广播地址,剩下两个主机地址,可以将这两个主机地址中其中的一个配置在负载均衡器上,另一个配置在真实的服务器上,也就是DNAT的目的地址的那个。当然这种方案虽然不用配置路由,然而却需要用30位(如果不怕浪费IP地址,你也可以用更短掩码的IP地址)的配置ip地址,并且在dnat的时候需要一个不连续IP地址的ip-pool。

3.配置

3.1.直接路由方式配置(拥有不同的以太网)

配置dnat:
iptables -t nat -A PREROUTING -d 1.2.3.1 -p tcp --dport 1234 -j DNAT --to 2.3.4.1-2.3.4.3
配置路由:
route add -host 2.3.4.1 dev eth1
route add -host 2.3.4.2 dev eth2
route add -host 2.3.4.3 dev eth3

3.2.链路层复用配置

很简单,略

3.3.使用30位掩码(非链路层复用)

如果使用链路层复用的话,和本节的配置是一样的,故不再单列讨论
配置dnat:
将目的地址分离为一个pool中的地址,该pool中的地址暂定为:1.2.3.2和1.2.3.5
配置IP地址
ip addr add dev eth1 1.2.3.1/30
ip addr add dev eth2 1.2.3.5/30

4.问题

这种使用路由的方式实现负载均衡很直接,又很高效,然而对于审计的支持却不是很好,也没有什么地方可以很好的记录日志,因为本来dnat模块或者路由模块就是一个综合的模块,而不是一个专门用于负载均衡的模块,这样的话,出了问题也不好排查,相比之下,LVS就好得多。


原创粉丝点击