Linux下的几种负载均衡技术小结

前言

Linux系统的数据包处理能力相当强大,通过Netfilter框架或者策略路由系统,用户可以非常灵活的定义数据包的处理规则。因此在Linux下实现负载均衡自然也是非常简单。笔者在此总结了Linux下常用的几种负载均衡技术:
  1. bond

    bond是Linux内核自带的多网卡聚合功能。这个功能可以把多个网卡整合成一个虚拟网卡从而同时利用多块网卡传输数据。bond有多种不同的模式用以适应不同的情况。bond主要是从L2链路层考虑的,因此可以bond的网卡通常要连到同一个交换机上。

  2. iproute2(ip命令)中的多路由

    可以使用ip命令中的nexthop选项非常简单的实现负载均衡。nexthop可以为同一个目的地址指定多条路由,并可以指定每条路由的权重。之后系统会根据权重为数据选择某条路由。
    例如:ip route add default nexthop via $P1 dev $IF1 weight 1 nexthop via $P2 dev $IF2 weight 1
    这条命令定义默认路由有ip1:if1和ip2:if2两条路径,且这两条路径的权重相同。
    利用ip命令实现上边这样简单的负载均衡是非常方便的,但是ip命令毕竟是一个网络层命令,因此它是无法根据运输层(端口号)进行负载均衡的。

3、iptables+iproute2

提起iptables大多数人都只用过其中的filter表和nat表,而对于mangle表则很少有人使用。然后使用mangle表是可以非常方便地实现灵活负载均衡的。
iptables的mangle表用来修改数据包的一些标识,可以修改的标识有:dscp(区分服务类型)、ToS(服务类型)、mark(标记)。前两者是ip头的QoS相关标志位,主要用于ip层的qos实现,但是目前这两个标志位极少被用到,通常都会被忽略。而第三个(mark)则是由linux内核实现的对数据包的标记。因为是由linux内核实现的,因此这个标记只能在本机使用,并非数据包的一部分,出了本机这个标记就不存在了。
iptables实现负载均衡主要是通过修改mark标记来实现。iproute2可以针对数据包的不同mark定义专门的策略路由表,因此我们可以把去往不同接口的路由写入适用不同mark的策略路由表中,之后linux就可以根据数据包的mark来决定数据包要走的路由了。
例如: 
首先,为所有进入本机的目的端口号为25的tcp包打上“1”标记:
iptables -A PREROUTING  -t mangle -p tcp --dport 25 -j MARK --set-mark 1   
添加路由规则规定标记为1的数据包使用路由表200
ip rule add fwmark 1 table 200
在200路由表中添加路由
ip route add default via 192.168.1.1 dev ppp0 table 200
同理,为所有进入本机的目的端口号为80的tcp包打上“2”标记
iptables -A PREROUTING  -t mangle -p tcp --dport 80 -j MARK --set-mark 2
添加相关路由,方法同上:
ip rule add fwmark 2 table 200
ip route add default via 192.168.2.1 dev wlan0 table 200
这样子一来以后所有的端口号为25的包都会走192.168.1.1 dev ppp0路由,而所有端口号为80的数据包则会走192.168.2.1 dev wlan0路由,从而实现了针对端口号的负载均衡。同理,也可以利用iptables实现针对源(目的)地址、协议、接口的负载均衡,真的非常的方便。
  1. tc

    流量控制器TC(Traffic Control)用于Linux内核的流量控制,它利用队列规定建立处理数据包的队列,并定义队列中的数据包被发送的方式, 从而实现对流量的控制。TC命令通过建立筛选器(filter)、分类器(class)、队列(qdisc)这三个对象来实现对流量的控制。具体的讲就是,通过筛选器决定哪些数据包进入到哪些分类的队列中,之后再按照一定的规则将数据包从各个分类的队列中发送出去。尽管tc的主要功能在于流量控制,但是我们可以通过把一个队列建立在多个网卡上来实现流量的负载均衡。

例如:
在eth1上建立一个队列:
tc qdisc add dev eth1 root teql0
在eth2上建立同样的队列
tc qdisc add dev eth2 root teql0
启动设备teql0 
ip link set dev teql0 up
通过这三条命令,所有发往teql0的流量都会在eth1和eth2之间进行负载均衡发送。
应该说,tc是一个相当强大复杂的工具,但是tc的主要功能还是在于流量控制。
  1. LVS

    LVS(Linux virtual machine)是一套集成在Linux内核中的负载均衡服务。LVS通过部署负载均衡服务器在网络层截获并修改报文并依据一定规则分发给服务器集群中服务器来实现负载均衡。LVS主要用于web服务器的负载均衡,通过LVS,用户的请求可以被调度到服务器集群的多个服务器上去,并且用户认为自己始终在跟唯一一台服务器进行通信。LVS与前边几种负载均衡技术最大的差别在于,LVS有非常具体的应用场景,即web服务器集群。

你可能感兴趣的:(linux)