关于网络的负载均衡也是分层次的,曾经想过使用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所做的均衡对于网络层是不可见的!
openwrt 负载均衡 IPV6
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
OpenWrt 软路由 IPV6设置
本例用的是 esir 大神的固件。
网络 DNS d3 IP