您的位置:首页 > 理论基础 > 计算机网络

网络层IP路由的负载均衡实现思路

2010-11-03 20:36 344 查看
equalize补丁可以解决路由的负载均衡问题,然而其实现的代价却是禁用了均衡路由的缓存,每次都要查询路由表,查询路由表的开销抵消了一部分负载均衡带来的性能提升。因此最好的方法就是既实现了路由的负载均衡,又实现了路由缓存,实现思路如下:

为每一系列需要在其间做负载均衡的路由准备一个均衡链表T,添加路由的时候链接在一起,内核进行下列动作:

1.数据到来,如果缓存中没有找到路由则在路由表中查找路由

2.如果在缓存中找到了路由,但是该路由需要均衡,则按照均衡策略选择一条路由

2.1.最简单的方式就是轮转策略,在链表中依次使用各个路由

然而这样做会导致一个问题,那就是缓存中到底缓存均衡路由的哪一条呢?事实上,由于它们是双向链表(list_head)彼此链接在一起的,随便存一条就可以了,在缓存中查找的时候,只要发现一条就带有均衡标志的,那么就紧接着遍历链表上的所有路由,只要链表中有一条命中,就说明缓存命中,然后再根据均衡策略进行最终路由的选择。

以上的方法实现地比较简单,不是很和谐,并且如何将所有需要均衡的路由链接在一起也是个问题,如果是基于linux修改的话,就要大量修改源代码。事实上,可以通过netfilter来实现,首先自定义一个链,然后实现一个target,这条自定义的链上添加所有的需要做负载均衡的路由,target中实现均衡策略最终选择出一条路由,可以使用缓存,如果均衡路由很少的话也可以不使用缓存,反正怎么实现都行,只要按照netfilter的接口来即可,这就实现了一种层次化的设计,但是还是需要修改源代码,我们将这个hook挂载在prerouting上,然后添加一个标志,如果netfilter找到了均衡路由,那么就设置这个标志,然后在路由模块中一旦查找到这个标记就不再按照常规的方式查找路由了(注意,不能用norouting标志)。需要注意的是,这种方式暂时还不能用于本地输出的包,因为output这个hook点是在路由之后进行的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: