对于给定的情况,您对软件负载平衡器或负载分配器有什么build议?

我configuration了一个8核的服务器,并计划部署一个networking服务。 为了扩展请求负载,我想运行我的服务的8个实例。 这里没什么可怕的。 我无法访问硬件负载平衡器。 我应该提到,我目前已经分配了5个公共IP地址(但我可以获得更多)。

因此,我想听听您对构build软件负载平衡解决scheme的build议。

明显的select是:

  • 使用HAProxy; 要么
  • 前叉我的应用程序(如Facebook的龙卷风和独angular兽都做);
  • 在这里插入你的想法

我的目标是:

  • 扩展服务实例之间的请求负载; 和
  • 允许我的服务的滚动重新启动(代码升级)。

我应该提到,这不是一个基于HTTP的服务,所以NGiNX之类的。

我不喜欢HAProxy因为它的记忆要求; 它似乎需要每个客户端连接的读取和写入缓冲区。 因此,我会在内核级别,HAProxy和我的应用程序中使用缓冲区。 这太傻了! 也许我在这方面错过了一些东西?

谢谢!

不pipe是什么解决scheme,如果你安装一个进程转发stream数据,它将需要每个连接缓冲区。 这是因为你不能总是发送你收到的所有东西,所以你必须保持多余的缓冲区。 也就是说,内存使用量将取决于并发连接的数量。 一个大型网站在150000个并发连接(4 GB RAM)下运行haproxy时默认设置是愉快的。 如果您需要更多,版本1.4让您调整缓冲区大小而不重新编译。 但是请记住,每个插槽的内核缓冲区永远不会低于每个方向和每个插槽4kB,因此每个连接至less需要16kB。 这意味着使haproxy每个缓冲区less于8kB的运行是没有意义的,因为它已经比内核消耗less了。

此外,如果您的服务是纯TCP,并且代理没有附加值,请查看基于networking的解决scheme(如LVS)。 由于它处理数据包并不需要维护缓冲区,所以套接字缓冲区在数据包满时会丢弃数据包,并且可以与服务一起安装在同一台机器上。

编辑 :Javier,preforked进程依靠操作系统来做负载平衡不要那么好。 操作系统在连接时唤醒每一个进程,只有其中一个获得它,所有其他人再次进入hibernate状态。 多步骤模式下的Haproxy在4个过程中performance出最佳性能。 在8个进程中,执行已经开始下降。 Apache使用了一个很好的技巧来对付这个问题,它在accept()方法上做了一些工作,所以只有一个进程正在等待accept。 但是,杀死操作系统的负载平衡function并停止在1000到2000个进程之间进行扩展。 它应该使用几个锁的数组,以便几个进程唤醒,但它不这样做。

没有任何关于你的服务的细节,这很难说; 但一般来说我会倾向于预先。 这是一个尝试和真正的服务器战略(而不是像一些人阅读龙卷风/独angular兽fansites后认为的新奇技巧)。

除此之外,一些提示:

  • 每个预先制定的stream程都可以使用现代的非select策略(主要是libevent)来处理大量的客户。

  • 内核和进程之间的1:1关系提供最佳性能是非常罕见的; 对负载做一些dynamic的适应性通常要好得多。