流量负载均衡的分层

关于网络的负载均衡也是分层次的,曾经想过使用linux的bonding功能来做OpenVPN的tun网卡的负载均衡,在主机上启动多个OpenVPN实例从而得到多个tun网卡,然后将多个tun网卡bond到一个bonding上,可后来一想就不合适了,因为bonding所做的是链路层的负载均衡,所有的bonding中的网卡使用同一个IP地址,这就和OpenVPN的使用不符合了,知道了这件事后,我决定修改bonding的源代码,在数据包发送到真实tun网卡之前重新设置ip地址或者重新做snat,结果还真的成功了!欣喜中...突然觉得这么做不妥,为何非要在链路层做IP层的负载均衡呢?想想原因也是很简单的,我需要的仅仅是一个基于路由的负载均衡,就是每个包过来(注意不是每个连接)在选择路由的时候在两个或者多个路由之间做均衡,每条路由的出口设备是不同的tun虚拟网卡,这就解决了OpenVPN单进程效率低的问题,但是因为linux不打equalize补丁的内核的路由是缓存的,所以几乎做不到同一个流的每个数据包的负载均衡,然而只要打上equalize patch就可以了,何必非要修改bonding驱动呢?另外OpenVPN一个应用程序,效率低下是它本身造成的,和内核有关系吗?怎么说也不能触动链路层用于多网卡绑定的驱动代码啊!
     是的,是这样的,负载均衡是分层次的,IP层的负载均衡的目标是对于同一个基于五元素的策略,在不同的路由之间做均衡选择,每个数据包都能在均衡路由之间选择到不同的路由是最好的选择了(对于轮转策略来讲),而网卡的负载均衡则目标是对于一个既定的路由结果,在不同的网卡上发送数据从而实现负载均衡,一个路由结果本质上最重要的就是确定了一个出口设备,如果这个出口设备是一个bonding,那么接下来这个虚拟的bonding网卡将负责在不同的真实网卡之间做均衡。
     因此,如果想做到基于包的路由均衡,那么最好的办法就是打上equalize补丁,如果觉得这个补丁不合适,那么就自己实现一个类似的补丁,反正linux对于源码的修改是很灵活的,即使你改不得源码,你也可以利用netfilter在POSTROUTING这个点上挂载一个自己的钩子,从而实现一个基于路由的负载均衡,对于bonding之类的负载均衡,只有在你确定所有参与均衡的网卡上所流逝的包可以使用一个IP地址的时候再使用,本质上说,bonding所做的均衡对于网络层是不可见的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值