在 AWS 多可用区 RDS 中实现读写查询可用性

Achieving read and write query availability in AWS Multi-AZ RDS

我已经在开发环境中配置了没有只读副本的多可用区 RDS mysql 实例,我正在通过重启数据库实例来测试多可用区 RDS 故障转移。

以下是我的观察:在 RDS 故障转移期间,客户端应用程序不会丢失连接,但同时也无法访问数据库一旦故障转移完成,客户端将能够访问数据库。

更新 1: 以上观察是 wrong.What 我刚才观察到的是,在故障转移完成后,我遇到了以下错误,并导致连接终止。

    ERROR 2003 (HY000): Can't connect to MySQL server on 'rds-test.czswqpewzqas.---------.amazonaws.com' (110)

简而言之,我的查询在多可用区 mysql 实例重启期间失败。 有谁知道我在这里遗漏了什么。

更新 - 实现读取可用性: 现在我已经为多可用区 mysql 实例创建了一个只读副本,并且在出现上述错误时,重定向 "select queries" 到只读副本实例。

所以,使用读取副本我能够以正确的方式实现读取 availability.Is?想知道是否有任何其他方法可以做到这一点。

此外,如何在多可用区 RDS 中实现 写入可用性

您的观察是正确的。故障转移期间,TCP 连接丢失,故障转移到辅助数据库和在 DNS 中切换 IP 地址的时间。

取决于申请

a/ 尝试使用指数回退重新连接。几分钟内即可重新连接。

b/ 决定故障转移期间的行为方式。

读取事务 (SELECT) 可以移交给只读副本。现代 JDBC 和 ODBC 驱动程序能够自行处理只读副本,只需提供副本的 IP 地址/DNS 名称列表即可。驱动程序将自动应用负载平衡。无需更改代码。

写入事务处理起来更复杂,并且没有适用于所有应用程序的单一答案。正确答案将取决于您的应用程序和业务要求。

一些客户决定阻止所有写入操作,return 向最终用户发送一条错误消息,要求他们在几分钟后重试。

一些客户在 SQS 队列中对写入事务进行排队。他们开发了一个队列 reader 应用程序来在 master 数据库再次可用时刷新挂起的事务。 (根据工作负载,S3 或 DynamoDB 也可用于此目的)。当然,您的数据在故障转移期间和故障转移后的短时间内不会保持一致,即刷新所有待处理写入所需的时间。

请随时对现实世界场景中使用的其他策略发表评论。