锁定老帖子 主题:大家来谈谈关于负载均衡的设计
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-08
我找了,网上都推荐ipvs+nginx来完成基于url的负载均衡。 自己总结了一下:大概是一下的模式: 一台做做 IPVS的机器(或者加一台备份机器)=====》多台装有nginx的机器(做反向代理)==》N台web服务器 听网上说:IPVS只做ip层的解析,效率应该不成问题。而对于nginx,需要做应用层协议的解析(找到相应的URL,hostname等),效率要低些,听说一般的机器能承受2-3W个链接。下面是就web服务器,这里暂时不讨论。 我没看过nginx的源码,但是大概了解了下,估计就是一种数据转发,这种基于应用层的数据转发,效率都会有问题,应为一个有内容的链接都要经过两次的内核空间与用户空间的切换。这样一来效率就有所下降了。 我在想,能不能把nginx的这层的数据转发也做到内核空间里面去。 例如:当一台机器接受到从IPVS 转发过来的包的时候,通过SKB直接读取到应用层的数据,在根据这些内容做相应的转发,这在netfilter里面应该可以实现吧? 对于上面的内容我想做一些效率的优化: 1.只对某种端口的链接进行处理(例如HTTP等),这样可以大大减少过滤的包。 2.做一个hash表,记录连接的5元组等信息,这条连接在hash 表里面保存一段的时间。例如一个链接来了,马上对这个链接进行hash查找,如果在hash表里面,直接转发到相应的机器,以免过多的过滤而影响效率。 对于这一条,一般的http请求在三次握手后的两个包就会包含url等信息(除了https).所以我们需要过滤的包并不是很多。 这样一样来,就可以不用nginx 了,我感觉这样的效率应该要高于实现与用户空间的nginx. 大家来看看我这样设计有没有价值,我没搞过(只做过ipvs),只是随便想想的。希望大家来一起讨论下这个实现的一些问题。或者说市面上有没有相关的开源产品。 各路神仙都过来讨论讨论啊。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-08-09
不要什么都放到内核空间,无法保证的代码健壮性只会导致死机。
|
|
返回顶楼 | |
发表时间:2009-08-09
Magicloud 写道 不要什么都放到内核空间,无法保证的代码健壮性只会导致死机。
这个我知道,但是我觉的这样的设计能大幅提升效率,只是一个思路而已。 后来去网上查了下 tcp splicing 已经实现了内核的代理,其实只要在内核做下负载均衡算法就可以了,代价不是很高。 后来又发现,l7sw貌似已经实现了我的想法。 具体代码还没看,准备马上去看下。 感觉有搞头。 |
|
返回顶楼 | |
发表时间:2009-08-09
而且这样搞,貌似可以顺带做些防DDOS的一些策略。
|
|
返回顶楼 | |
发表时间:2009-08-10
从研发的乐趣来看,没什么搞头。基本上属于体力活。
|
|
返回顶楼 | |
发表时间:2009-08-10
andrew913 写道 Magicloud 写道 不要什么都放到内核空间,无法保证的代码健壮性只会导致死机。
这个我知道,但是我觉的这样的设计能大幅提升效率,只是一个思路而已。 后来去网上查了下 tcp splicing 已经实现了内核的代理,其实只要在内核做下负载均衡算法就可以了,代价不是很高。 后来又发现,l7sw貌似已经实现了我的想法。 具体代码还没看,准备马上去看下。 感觉有搞头。 使用内核空间无非就是为了提高效率,但反过来,提高效率却有其它许多种做法…… 一方面我们要相信我们有能力做出稳定的内核模块; 另一方面一定要考虑,如果这个模块死了,怎么办?按你的思路,负载均衡只有这一台机器,死了服务就挂了…… 现在流行分布式,据我所知也确实有分布式的负载均衡方案,既降低硬件成本,又不用使用内核空间。 |
|
返回顶楼 | |
发表时间:2009-08-10
另一方面一定要考虑,如果这个模块死了,怎么办?按你的思路,负载均衡只有这一台机器,死了服务就挂了……
========= 做 ipvs 这里是要有一台做备份的。 而后面做七层解析解析的机器,挂了是没事的,做ip转发的机器是有监控功能。 如果内核代码健壮的话,挂的几率应该是小于用户空间的daemon进程的。 ps: 不能因为怕 kernel panic而否决内核实现的。 |
|
返回顶楼 | |
发表时间:2009-08-10
最后修改:2009-08-10
andrew913 写道 另一方面一定要考虑,如果这个模块死了,怎么办?按你的思路,负载均衡只有这一台机器,死了服务就挂了……
========= 做 ipvs 这里是要有一台做备份的。 而后面做七层解析解析的机器,挂了是没事的,做ip转发的机器是有监控功能。 如果内核代码健壮的话,挂的几率应该是小于用户空间的daemon进程的。 ps: 不能因为怕 kernel panic而否决内核实现的。 也就是你需要两层机器来做,一个ip转发,一个应用转发……如此的话,我相信把应用转发做到内核不会有很高提升。 不要“应该”,理论上足够健壮的代码无论在哪都无所谓。不会因为运行在用户空间就更容易挂。 内核模块挂了可能要重启系统,而用户daemon挂了,重启daemon远远快得多。 而整个应用转发功能放到内核,你能保证每一行代码都没错么? 另外必然是要做并发的,内核模块并发代价远大于用户层并发。 不是因为怕崩溃而否定内核实现,但你要明白现在很多内核应用都被移出到用户空间,(甚至可以说是一个趋势,无论Linux、Windows),是有原因的。 这个问题,其实技术实现是次要的,均衡全局得失才是项目的重点。而均衡得失需要有全面的事实支持。因此问一句,你有内核开发经验么? 对你的需求,我认为用一个模块直接把网卡接收数据传递到用户空间,在用户空间做分析处理,已经是项目最好的实现了。 |
|
返回顶楼 | |
发表时间:2009-08-10
我想效率的突破点是:在用户空间做转发的话,你任意一个请求来了,都需要把这些内容从内核搬出来,然后处理完了以后再搬到内核空间,再发出去。但是如果在内核做转发的话,根本不需要,其实过滤的包也不是很多,只需要过滤下三次握手后面的两个包就可以了(读下url就行了),感觉和LVS有点类似。
如果我的公司现在要用负载均衡,我直接选一种成熟的技术就OK了,没必要折腾那么都哦,搞内核代码是要掉头发的,时刻都要看到panic信息。 不过我是准备搞点毕业设计的材料(有个比赛需要负载均衡的东西,新一点东西总能引起注意),所以就想了下一些可能可行的想法。 内核搞过一段时间,基本都是netfilter的东西吧,还做过一个和网卡驱动相关的程序。 |
|
返回顶楼 | |
发表时间:2009-08-10
基于URL有好多实现,比如Haproxy就可以,我搞了个基于Http Method的负载均衡配置,你看看是不是你要的:
http://charlescui.iteye.com/admin/blogs/442550 |
|
返回顶楼 | |