论坛首页 综合技术论坛

大家来谈谈关于负载均衡的设计

浏览 19987 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-08-08  
最近要搞一个负载均衡,看了下ipvs ( lvs ) 的介绍:但是非常遗憾,ipvs只是做了IP层的负载均衡,无法做到基于URL的负载。

我找了,网上都推荐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),只是随便想想的。希望大家来一起讨论下这个实现的一些问题。或者说市面上有没有相关的开源产品。

各路神仙都过来讨论讨论啊。
   发表时间:2009-08-09  
不要什么都放到内核空间,无法保证的代码健壮性只会导致死机。
0 请登录后投票
   发表时间:2009-08-09  
Magicloud 写道
不要什么都放到内核空间,无法保证的代码健壮性只会导致死机。


这个我知道,但是我觉的这样的设计能大幅提升效率,只是一个思路而已。

后来去网上查了下

tcp splicing 已经实现了内核的代理,其实只要在内核做下负载均衡算法就可以了,代价不是很高。

后来又发现,l7sw貌似已经实现了我的想法。

具体代码还没看,准备马上去看下。

感觉有搞头。
0 请登录后投票
   发表时间:2009-08-09  
而且这样搞,貌似可以顺带做些防DDOS的一些策略。
0 请登录后投票
   发表时间:2009-08-10  
从研发的乐趣来看,没什么搞头。基本上属于体力活。
0 请登录后投票
   发表时间:2009-08-10  
andrew913 写道
Magicloud 写道
不要什么都放到内核空间,无法保证的代码健壮性只会导致死机。


这个我知道,但是我觉的这样的设计能大幅提升效率,只是一个思路而已。

后来去网上查了下

tcp splicing 已经实现了内核的代理,其实只要在内核做下负载均衡算法就可以了,代价不是很高。

后来又发现,l7sw貌似已经实现了我的想法。

具体代码还没看,准备马上去看下。

感觉有搞头。

使用内核空间无非就是为了提高效率,但反过来,提高效率却有其它许多种做法……
一方面我们要相信我们有能力做出稳定的内核模块;
另一方面一定要考虑,如果这个模块死了,怎么办?按你的思路,负载均衡只有这一台机器,死了服务就挂了……

现在流行分布式,据我所知也确实有分布式的负载均衡方案,既降低硬件成本,又不用使用内核空间。
0 请登录后投票
   发表时间:2009-08-10  
另一方面一定要考虑,如果这个模块死了,怎么办?按你的思路,负载均衡只有这一台机器,死了服务就挂了……

=========
做 ipvs 这里是要有一台做备份的。
而后面做七层解析解析的机器,挂了是没事的,做ip转发的机器是有监控功能。

如果内核代码健壮的话,挂的几率应该是小于用户空间的daemon进程的。

ps: 不能因为怕 kernel panic而否决内核实现的。
0 请登录后投票
   发表时间:2009-08-10   最后修改:2009-08-10
andrew913 写道
另一方面一定要考虑,如果这个模块死了,怎么办?按你的思路,负载均衡只有这一台机器,死了服务就挂了……

=========
做 ipvs 这里是要有一台做备份的。
而后面做七层解析解析的机器,挂了是没事的,做ip转发的机器是有监控功能。

如果内核代码健壮的话,挂的几率应该是小于用户空间的daemon进程的。

ps: 不能因为怕 kernel panic而否决内核实现的。

也就是你需要两层机器来做,一个ip转发,一个应用转发……如此的话,我相信把应用转发做到内核不会有很高提升。

不要“应该”,理论上足够健壮的代码无论在哪都无所谓。不会因为运行在用户空间就更容易挂。
内核模块挂了可能要重启系统,而用户daemon挂了,重启daemon远远快得多。
而整个应用转发功能放到内核,你能保证每一行代码都没错么?
另外必然是要做并发的,内核模块并发代价远大于用户层并发。

不是因为怕崩溃而否定内核实现,但你要明白现在很多内核应用都被移出到用户空间,(甚至可以说是一个趋势,无论Linux、Windows),是有原因的。

这个问题,其实技术实现是次要的,均衡全局得失才是项目的重点。而均衡得失需要有全面的事实支持。因此问一句,你有内核开发经验么?

对你的需求,我认为用一个模块直接把网卡接收数据传递到用户空间,在用户空间做分析处理,已经是项目最好的实现了。
2 请登录后投票
   发表时间:2009-08-10  
我想效率的突破点是:在用户空间做转发的话,你任意一个请求来了,都需要把这些内容从内核搬出来,然后处理完了以后再搬到内核空间,再发出去。但是如果在内核做转发的话,根本不需要,其实过滤的包也不是很多,只需要过滤下三次握手后面的两个包就可以了(读下url就行了),感觉和LVS有点类似。

如果我的公司现在要用负载均衡,我直接选一种成熟的技术就OK了,没必要折腾那么都哦,搞内核代码是要掉头发的,时刻都要看到panic信息。

不过我是准备搞点毕业设计的材料(有个比赛需要负载均衡的东西,新一点东西总能引起注意),所以就想了下一些可能可行的想法。

内核搞过一段时间,基本都是netfilter的东西吧,还做过一个和网卡驱动相关的程序。
0 请登录后投票
   发表时间:2009-08-10  
基于URL有好多实现,比如Haproxy就可以,我搞了个基于Http Method的负载均衡配置,你看看是不是你要的:

http://charlescui.iteye.com/admin/blogs/442550
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics