【发布时间】:2019-09-23 17:13:08
【问题描述】:
我们遇到了 AWS Aurora 故障转移问题,正在寻找解决方法。
场景
AWS Aurora 设置了两个端点:
- 作者:
- 主机:stackName-dbcluster-ID.cluster-ID.us-west-2.rds.amazonaws.com
- 解析为 IP:10.1.0.X
- 读者:
- 主机:stackName-dbcluster-ID.cluster-ro-ID.us-west-2.rds.amazonaws.com
- 解析为 IP:10.1.0.Y
因此我们的 PDO MySQL 连接字符串是stackName-dbcluster-ID.cluster-ID.us-west-2.rds.amazonaws.com(用于写入)
故障转移后
在故障转移时,DNS 条目被翻转为指向如下:
- 读者:
- 主机:stackName-dbcluster-ID.cluster-ro-ID.us-west-2.rds.amazonaws.com
- 解析为 IP:10.1.0.X
- 作者:
- 主机:stackName-dbcluster-ID.cluster-ID.us-west-2.rds.amazonaws.com
- 解析为 IP:10.1.0.Y
关键的是,PDO 连接字符串(用于写入)保持相同的“stackName-dbcluster-ID.cluster-ID.us-west-2.rds.amazonaws.com”,但指向不同的 IP 地址。
发生了什么
我们遇到错误 1290“SQLSTATE[HY000]:一般错误:1290 MySQL 服务器正在使用 --read-only 选项运行,因此无法执行此语句”。
随着数据库引擎停止启动,我们的初始持久连接将“消失”并失效(我们立即在重新连接/重试代码中处理)。
但是,上述错误意味着新连接将与旧节点建立,但不会随着 DNS 更改的传播而进一步失效。它们持续了 10/15 分钟(远超过 DNS 的 TTL)。
我的问题
- 有谁知道 PDO 上的持久连接是根据连接字符串检索的,还是使用 IP 或其他签名更可靠?有证据表明它是主机名,但需要确认。
- 有谁知道在 PDO 中将持久连接标记为“无效”的方法,这样就不会再次使用了吗?
- 或者,我错过了什么?
旁注
我们已经准备好处理重试的代码,并告诉他们重试以获取新的非持久连接(有效)。正是在这一点上,我们可以“使”PDO 连接“无效”,这样下一次运行的脚本就不会一遍又一遍地重复这个循环。
故障转移随时可能发生,因此我们无法执行手动操作,例如重新启动 php(我们这次必须这样做)。
如果没有持久连接,性能会明显变慢。
FastCGI、Centos 16、PHP 7.2、MySQLD 5.0.12-dev(在 Centos 上是正常的 - 请参阅 https://superuser.com/questions/1433346/php-shows-outdated-mysqlnd-version)
【问题讨论】:
-
更新:一直在阅读有关php.net/manual/en/book.mysqlnd-ms.php 的信息 - 但是尚不清楚使用此插件是否可以解决相同的问题。它可能有助于故障转移,但不清楚 DNS 更改是否会导致现有连接失效。任何确认/指针表示赞赏。
-
不是一个实际的答案,但请注意,您实际上可以在故障转移时重新启动 php。或者做点别的。您可以订阅RDS events,这可以让您解决这个问题。远非理想,但也许有帮助。
-
@bgdnlp 感谢您的评论。如问题所述,我确实在我们的警报系统崩溃后重新启动了 PHP(我们每个安装大约有 500 个监控点),但我宁愿在错误发生之前自行修复所有内容,而不是因为我们有错误触发警报而需要被唤醒.无论如何,故障转移都会发出警报,但我们可以放松而不是担心......
标签: php mysql amazon-web-services pdo amazon-aurora