Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
为什么我在 Aurora MySQL 兼容版数据库集群失效转移后收到只读错误?
2 分钟阅读
0
我想知道为什么我在 Amazon Aurora MySQL 兼容版数据库集群发生失效转移时会收到只读错误。
简短描述
当 Aurora MySQL 兼容版数据库集群发生多可用区失效转移时,集群端点会自动更新。旧写入器会重启并设置为只读模式,然后 Aurora 会将现有副本升级为写入器。端点会反映此变化,并指向新的写入器和读取器角色。
当您使用读取器角色通过现有节点执行以下操作之一时,可能会收到一条只读错误消息:
数据定义语言 (DDL) 操作
数据操作语言 (DML) 操作
数据控制语言 (DCL) 操作
解决方法
确定该角色是否为只读
要检查该角色是否为只读,请使用 innodb_read_only 变量。
输出示例:
mysql> show variables where variable_name='innodb_read_only';+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| innodb_read_only | ON |
+------------------+-------+
1 row in set (0.01 sec)
使用集群写入器端点
数据库实例在 Aurora MySQL 集群中的角色可能会发生变化。最佳做法是使用集群写入器端点以确保始终指向最新的写入器。如果您使用数据库实例端点或直接 IP 地址,则可能无法感知失效转移的发生。当重新连接到同一台主机时,您会收到只读错误,且无法执行 DDL 或 DML 更改。
不要过度缓存 DNS
如果您未使用智能驱动程序,则失效转移事件发生后,您将依赖于 DNS 记录的更新和传播。Aurora MySQL DNS 区域使用 5 秒的短生存时间 (TTL)。您的网络和客户端配置不得增加此 TTL。DNS 缓存发生在架构的多个层,例如操作系统 (OS)、网络层或应用程序容器。如果存在超过 5 秒的意外 DNS 缓存,则失效转移后,您可能会重新连接到旧写入器。
Java 虚拟机 (JVM) 可能会过度缓存 DNS。当 JVM 将主机名解析为 IP 地址时,会将这些 IP 地址缓存指定的一段时间。在某些配置中,JVM 默认 TTL 仅在 JVM 重启时才刷新 DNS 条目,这可能导致失效转移后出现只读错误。要解决此问题,请手动设置较小的 TTL,以便 DNS 条目定期刷新。
使用 AWS Advanced JDBC 驱动程序
Aurora MySQL 数据库集群端点会自动传播 DNS 记录更新。当数据库上发生事件时,您可能会遇到 DNS 记录更新延迟。发生这种情况时,应用程序会处理该事件。