AWS 是否在主数据库和只读副本数据库之间进行负载平衡连接

问题描述 投票:0回答:4

我为 RDS 实例创建了只读副本,AWS 是否自动处理负载平衡,或者需要在代码中进行其他配置或实现?如果有的话有参考吗?

编辑以获得更多说明 当我创建只读副本时,它将如何工作并处理请求? 我问是因为它给了我一个端点,所以必须有一种实现才能正常工作,对吧? (与主 RDS 一起)

amazon-web-services amazon-rds database-replication
4个回答
5
投票

不幸的是,Aurora 集群的负载均衡非常有限。首先,它在建立连接时平衡连接,并且在任何情况下都不会重新平衡它们,除非连接被断开并重新打开(但这也有限制,请参见下文)。

其次,当 Aurora 确实分配连接时,它不会考虑已与每个只读副本建立的连接数量。

第三,它使用 TTL 为 1 秒的 DNS 切换过程来实现。由于上述所有原因,不幸的是,当某些副本收到比其他副本多得多的连接时,这是很常见的情况。更不用说缺乏用于关闭等的干燥实例的机制。

由于上述所有限制和高度不平衡的负载,我们为 MySQL 和 PostgreSQL 开发了

fairlink
JDBC 驱动程序(或者更确切地说是封装驱动程序)。您可以在这里找到它:https://github.com/DiceTechnology/dice-fairlink


2
投票

Amazon 通过特定的负载平衡端点为 RDS Aurora 数据库集群提供连接 负载平衡。对于任何其他 RDS 数据库配置,您必须自己处理连接。

编辑以获得更多说明当我创建只读副本时它是怎样的 去上班并处理请求吗?我问是因为它给了我一个 端点,所以必须有一种实现它的工作 正确吗? (与主 RDS 一起)

此时您只有 2 个数据库服务器,并且每个服务器都有一个可以连接到的单独端点 URL。亚马逊正在为您保持这些服务器之间的数据同步,仅此而已。这里没有发生负载平衡。您似乎假设这里发生的事情比实际情况要多。如果您使用 Aurora 以外的 RDS 数据库引擎,则必须自行实现负载均衡。


1
投票

AWS 自动处理 RDS 故障转移,而不是复制时的负载平衡。您可以使用以下方法配置只读副本之间的负载平衡的工作方式:


0
投票

Andrey 上面的答案是最正确的 - “负载平衡”只是 DNS 随机选择集群中的服务器。如果您将 RO 集群端点与连接池结合使用(大多数人都是这样),这会导致连接在大多数情况下非常不平衡。

我最近向 AWS 支持中心开了一张票,并被推荐使用这个“智能司机”解决方案。我认为原来的帖子正在寻找一种保持连接负载平衡的方法。

Aurora INFORMATION_SCHEMA中有一张表:

SELECT rhs.SERVER_ID FROM INFORMATION_SCHEMA.REPLICA_HOST_STATUS rhs WHERE rhs.SESSION_ID <> 'MASTER_SESSION_ID';

这将为您提供只读集群中服务器的实时快照。我们正在使用 MySqlConnector 驱动程序,它将获取连接字符串中的端点列表并平衡这些端点之间的连接。如果您的驱动程序没有此功能,您可以为每个连接随机选择一个。您需要根据实例 ID 构造端点或手动映射它们,并在连接字符串中使用它们而不是 ro 集群端点(您仍然使用写入器节点的主集群端点)。

您需要继续监控REPLICA_HOST_STATUS表。如果读取器组由于故障转移或任何其他原因而发生变化,我们会清除连接池,以便任何新命令从当前读取器组获取连接。

我已经尝试过这个,它确实导致连接数量平衡。它不会平衡实际负载,但在我们的例子中,Web 连接数跟随负载变化。您可以使用同一个表中的 IOS 或 CPU 列来添加真正的性能负载平衡。

我意识到这是 OP 问题提出 5 年后的事了,但这似乎是我能找到的最相关、最新的帖子,直到 AWS 向我指出它之后我才能够轻松找到这个解决方案。我还发现了这些类似的问题,较旧且不那么简洁: Amazon Aurora 数据库集群无法正确自动平衡AWS Aurora - 读取副本和写入器实例之间的负载平衡读取操作

© www.soinside.com 2019 - 2024. All rights reserved.