流量负载均衡的分层

关于网络的负载均衡也是分层次的,曾经想过使用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所做的均衡对于网络层是不可见的!

原文链接: https://blog.csdn.net/dog250/article/details/5962184

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    流量负载均衡的分层

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/409592

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月26日 上午11:30
下一篇 2023年4月26日 上午11:30

相关推荐