linux负载均衡

来源:互联网 发布:信鸽推送demo php 编辑:程序博客网 时间:2024/04/27 17:36


1.载均衡可以分为基于流的和基于包的,基于流的实现更合理但是有的时候必须需要基于包的,只可惜,linux内核并没有很好的实现基于包的负载均衡。2.6早期的内核实现了一个multipath的机制,可以认为是一个负载均衡器,但是它却是基于fib的,可以认为是基于流的,因为每一个流的第一个包从cache中或者fib中查找到路由后项后就会cache起来

2.6.18内核,内核增加了一个预编译宏--CONFIG_IP_ROUTE_MULTIPATH_CACHED,看起来支持了cache路由的负载均衡,然后查一下代码:
static inline int multipath_select_route(const struct flowi*flp,
                struct rtable *rth,
                struct rtable **rp)

在2.6.25内核中它就不见了踪影


2.基于流的负载均衡实际上linux已经实现了,这就是multipath,也就是2.6.8内核中就已经存在的那种,一个流的源IP,目的IP都是一样的,因此该流使用一个路由cache项,而另一个流由于和第一个流的源不同,因此只能查找fib,得到对应同一个目的地址的另一个路由表项,但是如果同一台机器发起了到同一个目的地的多个流,linux仍然不会做负载均衡,linux会认为那是一个流,毕竟在IP层是认不到传输层协议和端口的。因此linux实现的基于流的负载均衡仅仅是一种粗粒度的基于主机的负载均衡,要想实现真的基于流的负载均衡,还要使用ip_conntrack模块,但是这样就涉及到了四层信息,比较耗时.最终的结论就是linux的负载均衡几乎没有实现.                (非NAT环境)可以把同一条TCP/IP连接中的IP包同时从两条上行连接中发出,左右开弓,不就可以了吗?实际上,我们在 PPP Multilink就是这么干的,不过现在没有服务器的支持,要靠自己。这是Internet,因此已经有人想到这一点并且编写了内核补丁供下载,请搜索equalize_2.4.18.patch。 需要特别提醒你的是,请确保该补丁的日期是 Fri Mar 22 2002,而不是有问题的 Thu Mar 21 2002版本。另外,根据我的经验,这个 patch 也可以用于 2.4.19 内核。




0 0