将活动 TCP 会话负载均衡到 AWS Aurora RDS

Load balance active TCP sessions to AWS Aurora RDS

我目前在将打开的 TCP 会话(由 RoR 应用程序创建)正确负载平衡到动态创建的 Aurora Postgresql 只读副本时遇到问题。

这个问题是当已经建立到一个只读副本的 TCP 连接时,会创建另一个只读副本。之后来自第一个副本的流量将不会平均分配给第二个副本,因为 TCP 连接已经与第一个副本建立。

所附图表表示当前的基础结构设置。请注意,在只读副本(服务器)和应用程序(客户端)之间有一个负载均衡器,由 Aurora 服务提供,它基于 DNS 循环。

我试过 pgbouncer, pgpool and multiple Ruby gems (makara, fresh_connection),但其中 none 能够负载平衡,也没有消除长期存在的 TCP 连接..

我看了很多文章,他们帮助调查和确认了这个问题;但是 none 他们提出了解决方案。

所以...如您所见,我已经尝试从应用程序和网络的角度解决这个问题,不幸的是没有成功。有人遇到同样的问题吗?

您可以随数据库实例扩展负载平衡器。

                +----+     +--------+
             -> | LB | --> | Server |
+--------+ /    +----+     +--------+
| Client |     
+--------+ \    +----+     +--------+
             -> | LB | --> | Server |
                +----+     +--------+

当客户端以循环方式连接到负载平衡器时,负载平衡器将完成其工作以限制每台服务器的数据库连接总数。具有多个负载平衡主机的 simple routing policy in DNS 应该足够了。

我终于弄明白了这一点,必须在应用程序级别应用修复程序才能停止保持长期有效的 TCP 连接。

特别是 Ruby 我必须设置 idle_timeout and reaping_frequency parameters. However here 你可以找到其他编程语言的参数。

希望它对以后的人有所帮助。干杯!