博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网络层IP路由的负载均衡实现思路
阅读量:6291 次
发布时间:2019-06-22

本文共 890 字,大约阅读时间需要 2 分钟。

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

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

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

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

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

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

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

 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1271179

转载地址:http://kfjta.baihongyu.com/

你可能感兴趣的文章
windows下安装redis
查看>>
CentOS7 yum 安装git
查看>>
启动日志中频繁出现以下信息
查看>>
httpd – 对Apache的DFOREGROUND感到困惑
查看>>
分布式锁的一点理解
查看>>
idea的maven项目,install下载重复下载本地库中已有的jar包,而且下载后jar包都是lastupdated问题...
查看>>
2019测试指南-web应用程序安全测试(二)指纹Web服务器
查看>>
树莓派3链接wifi
查看>>
js面向对象编程
查看>>
Ruby中类 模块 单例方法 总结
查看>>
jQuery的validate插件
查看>>
5-4 8 管道符 作业控制 shell变量 环境变量配置
查看>>
Enumberable
查看>>
开发者论坛一周精粹(第五十四期) 求购备案服务号1枚!
查看>>
validate表单验证及自定义方法
查看>>
javascript 中出现missing ) after argument list的错误
查看>>
使用Swagger2构建强大的RESTful API文档(2)(二十三)
查看>>
Docker容器启动报WARNING: IPv4 forwarding is disabled. Networking will not work
查看>>
(转)第三方支付参与者
查看>>
程序员修炼之道读后感2
查看>>