我在开发环境中配置了没有只读副本的多可用区RDS mysql实例,我正在通过重新启动数据库实例来测试多可用区RDS故障转移。
以下是我的观察:在RDS故障转移期间,客户端应用程序不会丢失连接,但同时它也无法访问数据库并且一旦故障转移完成后,客户端将能够访问数据库。
更新1:以上观察结果是错误的。我刚刚观察到的是,在故障转移完成后,我遇到错误并导致连接终止。
ERROR 2003 (HY000): Can't connect to MySQL server on 'rds-test.czswqpewzqas.---------.amazonaws.com' (110)
因此,简而言之,在重新启动多可用区mysql实例期间,我的查询失败了。 有没有人知道,我在这里缺少什么。
更新 - 实现读取可用性现在,我已经为多可用区mysql实例创建了一个只读副本,并且在获得上述错误时,将“选择查询”重定向到只读副本实例。
所以,使用Read副本我能够实现读取可用性。这是正确的方法吗?想知道是否有其他方法可以做到。
另外,我如何在多可用区RDS中实现写入可用性?
答案 0 :(得分:1)
您的观察结果是正确的。故障转移期间,TCP连接丢失,故障转移到辅助数据库以及切换DNS中的IP地址。
取决于
的应用程序a /尝试使用指数退避重新连接。几分钟内就可以重新连接。
b /决定故障转移期间的行为方式。
读取事务(SELECT)可以切换到只读副本。现代JDBC和ODBC驱动程序能够自己处理只读副本,只需提供副本的IP地址/ DNS名称列表。驱动程序将自动应用负载平衡。无需更改代码。
写入事务处理起来比较复杂,并且没有针对所有应用程序的单一答案。正确的答案取决于您的应用程序和业务要求。
有些客户决定阻止所有写入操作,向最终用户返回错误消息,要求他们在几分钟后重试。
有些客户在SQS队列中排队写入事务。当master数据库再次可用时,他们开发了一个队列读取器应用程序来清除挂起的事(取决于工作负载,S3或DynamoDB也可用于此)。当然,在故障转移期间以及故障转移后的短时间内,您的数据将不一致,即刷新所有挂起写入所需的时间。
请随意评论实际场景中使用的其他策略。