如何使用持久连接在AWS中处理PDO MySQL故障转移

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

我的问题

  1. 有谁知道是否基于连接字符串检索了PDO上的持久连接,还是使用IP或其他签名更可靠?证据表明它是主机名,但需要确认。

  2. 有谁知道在PDO中将持久连接标记为“无效”的方法,因此不再使用它吗?

  3. 或者,有什么我想念的吗?

旁注

我们已经有适当的代码来处理重试,并且告诉他们重试以获得新的非持久连接(有效)。在这一点上,我们可以“无效” PDO连接,因此脚本的下一次运行不会一遍又一遍地重复此循环。

故障转移可以随时发生,因此我们无法执行手动操作,例如重新启动php(因为我们这次必须这样做)。

没有持久的连接,性能会明显降低。

FastCGI,Centos 16,PHP 7.2,MySQLD 5.0.12-dev(在Centos上是正常的-请参阅https://superuser.com/questions/1433346/php-shows-outdated-mysqlnd-version


犯罪嫌疑人X
浏览 165回答 2
2回答
打开App,查看更多内容
随时随地看视频慕课网APP