我们遇到了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)