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

Rob*_*bie 11 php mysql pdo amazon-web-services amazon-aurora

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

Ric*_*mes 2

必须终止并重新启动持久连接。

让我想起了 2 分钟的 TTL,花了 20 分钟才被识别。我不知道亚马逊是否做得更好,或者即使他们在 DNS 方面有发言权。

5.0.12?? 那是2005年发布的!也许是一个错字。无论如何,我认为版本在这个问题中并不重要。

DNS 可能不是故障转移的最佳方式;那里有几个代理服务器。我希望它们会在几秒钟内翻转。然而,他们需要知道谁是谁,而不是依赖 DNS。

您可以修改代码以在发生该错误时断开连接+重新连接吗?(这可能没有帮助。)