我正在尝试对 nodejs 服务器发送的事件后端进行负载平衡,我需要知道是否有办法将新连接分发到连接最少的客户端的实例。我遇到的问题是,当扩大规模时,路由会继续向已经饱和的实例发送新连接,并且由于连接寿命很长,这根本行不通。
对于水平扩展长寿命连接,我有哪些选择?
我正在尝试对 nodejs 服务器发送的事件后端进行负载平衡,我需要知道是否有办法将新连接分发到连接最少的客户端的实例。我遇到的问题是,当扩大规模时,路由会继续向已经饱和的实例发送新连接,并且由于连接寿命很长,这根本行不通。
对于水平扩展长寿命连接,我有哪些选择?
看起来您想要一个可以提供“粘性会话”并使用“最少连接”而不是“循环”策略的负载均衡器。不幸的是,NGINX 不能提供这个。
HAProxy(高可用性代理)允许这样做:
backend bk_myapp
cookie MyAPP insert indirect nocache
balance leastconn
server srv1 10.0.0.1:80 check cookie srv1
server srv2 10.0.0.2:80 check cookie srv2
如果您需要 ELB 功能并想手动滚动它,请查看本指南。
您可能还想确保经典的 AWS ELB“粘性会话”配置或较新的ALB“粘性会话”选项不能满足您的需求。ELB 通常会以最少的“负载”将连接发送到上游服务器,并且在与粘性会话结合时可能就足够了。
由于您使用的是 AWS,因此我建议您将Elastic Beanstalk用于您的 Node.js 应用程序部署。官方文档提供了很好的例子,比如这个。请注意,Beanstalk 会自动为您创建一个弹性负载均衡器,这正是您要寻找的。
默认情况下,当您使用 Elastic Beanstalk 控制台或 EB CLI 启用负载平衡时,Elastic Beanstalk 会为您的环境创建一个 Application Load Balancer。它将负载均衡器配置为侦听端口 80 上的 HTTP 流量,并将此流量转发到同一端口上的实例。
[...]
注意:您的环境必须位于具有至少两个可用区中的子网的 VPC 中才能创建应用程序负载均衡器。所有新的 AWS 账户都包含满足此要求的默认 VPC。如果您的环境位于仅在一个可用区中具有子网的 VPC 中,则默认为 Classic Load Balancer。如果您没有任何子网,则无法启用负载平衡。
请注意,正确的运行状况检查路径的配置是正确平衡请求的关键,正如您在问题中提到的那样。
在负载均衡的环境中,Elastic Load Balancing 每 10 秒向环境中的每个实例发送一个请求,以确认实例是否健康。默认情况下,负载均衡器配置为在端口 80 上打开 TCP 连接。如果实例确认连接,则认为它是健康的。
您可以选择通过在应用程序中指定现有资源来覆盖此设置。如果您指定路径,例如 /health,则健康检查 URL 设置为 HTTP:80/health。运行状况检查 URL 应设置为始终由您的应用程序提供的路径。如果将其设置为由应用程序前面的 Web 服务器提供或缓存的静态页面,则运行状况检查不会显示应用程序服务器或 Web 容器的问题。
编辑:如果您正在寻找粘性会话,正如我在评论中所述,请按照本指南中提供的步骤操作:
使用控制台启用粘性会话
在https://console.aws.amazon.com/ec2/打开 Amazon EC2 控制台。
在导航窗格的负载平衡下,选择目标组。
选择目标群体。
在描述选项卡上,选择编辑属性。
在编辑属性页面上,执行以下操作:
一个。选择启用负载均衡器生成的 cookie 粘性。
湾。对于粘性持续时间,指定一个介于 1 秒和 7 天之间的值。
C。选择保存。