我目前正在使用HAProxy为了负载平衡从客户端到我的Erlang应用程序服务器的TCP连接。 连接是持久的,这意味着我被限制在优化的服务器上大概64K的客户端(我目前正在m1.large EC2实例上运行HAProxy)。 我的应用程序服务器旨在根据TCP连接的数量进行水平缩放。 然而,我担心的是,由于它是1:1连接,因此我需要将相同数量的HAProxy服务器作为应用程序服务器。 现在有办法“代理”到应用服务器的tcp连接,所以一旦HAProxy发送客户端到我的Erlang服务器,它可以释放连接,准备服务另一个客户端? 是否有任何文件,现有的解决scheme,我可以读取,所以我只需要担心我的应用程序服务器上的64K限制,而不是在负载平衡服务器本身上?
是什么让你觉得你只限于64K的客户? 你应该可以提供更多的服务。 端口数不是限制因素,而是内存和CPU能力限制了您在任何给定时间可以打开的连接数量。 检查: http ://www.kegel.com/c10k.html这是过时的,只是把它认为是一个C100K或C1M的问题,而不是。 🙂
顺便说一下,haproxy网站有一个关于负载平衡和haproxy的架构的优秀文章: http ://haproxy.1wt.eu/download/1.2/doc/architecture.txt
关于连接限制,这是一个理论上的限制,通常你不会达到,因为在这之前你会用尽资源。
“TCP标准设置了唯一的连接标识符作为本地IP地址,本地TCP端口号,远程IP地址和远程TCP端口号的元组,在你的例子中,本地号码是固定的,大约有2 ^ 32个远程IP(版本4)地址和2 ^ 16个TCP端口号,或者大概总潜在的同时TCP连接数281,474,976,710,656(2 ^ 48或2.81 * 10 ^ 14,即281万亿)。
64k并发空闲连接是HAProxy和Erlang的花生。
首先要做的是启用HAProxy的统计页面 。 这是一个必须有监视和性能调整。
那么让我们进入限制。
每个元组client_IP:client_PORT:server_IP:server_PORT只能有一个连接client_IP:client_PORT:server_IP:server_PORT 。 它来自连接在内核中存储和检索的方式(即散列表)。 在Linux和Windows上也是如此。
我将不得不不同意这一点。 这根本不是理论上的限制。 任何人进行中等负载testing都可能达到一个非常实际的限制。
假设您目前的设置中有3台电脑:
[Test Computer] [HAProxy Computer] [Erlang Computer] (front) test_IP:????<------>haproxy_IP:80 (back) haproxy_IP:????<------>erlang_IP:80
所有的IP都是固定的,Web服务器端口是固定的。 这只留下一个端口作为可变参数,因此最大连接数量受到任何一台计算机上可用端口数量的限制。 这里的空间很小(参见临时端口范围)。 你必须得到更多的实例,Erlang实例和负载testing实例。
注意 :注意,用户来自大量的IP,而负载testing者(curl,Apache ab,JMeter)通常运行在一个带有单个IP的盒子上(JMeter和类似工具可以使用分布式从站进行扩展)。
注意 :HAProxy连接总是成对的(一个到客户端+一个到内部服务器)。 请记住,因为大多数系统限制必须是2 * N才能允许N个用户使用。
只有less数端口用于创build新的连接。 他们被称为ephemeral ports 。 Linux默认从32768到61000。
扩大范围。 首先检查服务器上是否有正在运行的服务正在使用它们。
sysctl net.ipv4.ip_local_port_range net.ipv4.ip_local_port_range = 20000 65000
这个调整只能给60%的端口。 只用一台服务器进行networking扩展是不够的。
请注意,一个端口在closures后不能重新使用一整分钟(请参阅TCP状态),这可能会使端口池非常小(例如,每个人10k端口?)。 有内核设置来改变closures时间,并允许重新使用closures端口。
只要他们活得足够长(至less在更新至less两分钟之前),你就不会需要这些持续连接的调整。 尽pipe如此,仍然需要意识到潜在的问题。
在HAProxy中configurationmaxconn设置。 这是任何时候允许打开的最大连接数量。
它可以在global , frontend或backend进行configuration。 统计信息页面显示每个和所有内容的活动设置。
ulimit是单个进程打开的文件的最大数量(套接字是linux上的文件)。 Linux的默认值介于1k和10k之间。
HAProxy根据maxconn参数自动configuration其进程ulimit。
您可能需要为Erlang进程手动调整ulimit。
我认为回答你的问题的最好方法是指出你不需要HAProxy和你的应用服务器之间的1:1映射。 HAProxy可以通过多种方法进行持久连接。 我会build议search文件的“持久性”了解更多: http : //haproxy.1wt.eu/download/1.4/doc/configuration.txt 。
例如,只有TCP连接,将平衡源添加到您的configuration应该为您提供持久性。
每个主机64k是一个确定的硬性限制,但处理它的应用程序服务器在此之前通常耗尽内存。 通常,Java应用服务器在32位vm用完堆之前以2000个并发连接运行。