当我尝试连接自己的 Amazon Aurora 写入器端点时,为什么我的连接被重定向到读取器实例?

1 分钟阅读
0

我在应用程序服务器中使用 Amazon Aurora 集群端点/写入器端点,但我的应用程序却连接到读取器实例。

简短描述

当您尝试连接到 Aurora 集群端点或写入器端点时,您的应用程序可能会改为连接到读取器实例。当端点及其映射的 IP 地址缓存在客户端应用程序端时,就会发生这种情况。

Aurora 集群端点始终指向 Aurora 写入器实例。发生失效转移时,Aurora 集群端点指向新的写入器实例。如果您使用的是集群端点,则在失效转移期间,您的读/写连接会自动重定向到 Aurora 副本。此副本实例已升级为主实例。

因此,在失效转移期间,您的 Aurora 实例的基础 IP 地址可能会发生变化,缓存值可能不再可用。

尝试使用 DNS 名称连接到数据库的客户端必须通过查询 DNS 服务器,将该 DNS 名称解析为 IP 地址。然后,客户端缓存响应。根据协议,DNS 响应会指定生存时间 (TTL),该时间决定了客户端应缓存记录多长时间。Aurora DNS 区域使用五秒钟的短 TTL。但是,许多系统使用不同的设置来实现客户端缓存,这可能会延长 TTL。

如果在 DNS 记录更改尚未传播的情况下客户端尝试连接到集群,则该客户端会收到一个旧地址。这会导致客户端连接到先前的主实例,该主实例现在是读取器实例。

因此,长时间缓存 DNS 数据可能会导致连接失败。

失效转移启动后,客户端不再从数据库获得 TCP 流量。相反,要由客户端决定是否超时。在任何失效转移时都会对原始主数据库进行硬隔离,这意味着客户端在计划内和计划外失效转移期间会看到类似的行为。

解决方案

检查您是连接到写入器实例还是 Aurora 副本。

要确定您的客户端是连接到写入器实例还是 Aurora 副本,请使用 @@innodb_read_only 变量:

mysql> select @@innodb_read_only;

该变量值为 0 表示您已连接到写入器实例。

运行此查询以确定您连接到哪台服务器,以及该服务器是写入器还是读取器:

mysql> select concat("You are connected to '",server_id,"', which is a ",if(SESSION_ID='MASTER_SESSION_ID',"Writer","Reader")) as CONNECTION_STATUS from information_schema.replica_host_status where SERVER_ID in (select @@aurora_server_id);
+-----------------------------------------------------------------+
| CONNECTION_STATUS                                               |
+-----------------------------------------------------------------+
| You are connected to 'aurora-test-instance1', which is a Writer |
+-----------------------------------------------------------------+
1 row in set (0.08 sec)

对集群中的多个读取器实例进行故障排除

Aurora 读取器端点是 DNS CNAME 条目。如果一个集群有多个读取器实例,在解析读取器端点时,就会得到一个以循环方式选择的实例 IP。这是因为读取器端点包含所有 Aurora 副本,并且它为新连接提供基于 DNS 的循环负载均衡。

确保在不缓存 DNS 的情况下继续解析端点,以便在每次解析中获得不同的实例 IP。如果您仅解析一次端点并将连接保留在池中,则对该连接的每个查询都会转到同一个实例。如果您缓存 DNS,则每次解析端点时都会收到相同的实例 IP。

遵循最佳实践

  • 确保您的网络和客户端配置不会进一步增加 DNS 缓存 TTL。如果您使用任何形式的连接池或其他复用,则可能需要刷新或缩短任何缓存的 DNS 信息的生存时间。如果您的客户端应用程序正在缓存数据库实例的 DNS 数据,则将 TTL 值设置为小于 30 秒。
  • 使用 Amazon Relational Database Service (Amazon RDS) 代理管理连接。有关更多信息,请参阅使用 Amazon RDS 代理
  • 查看使用智能驱动程序的最佳实践。
  • 使用基于 TCP 的负载均衡器,例如 Elastic Load Balancing 或 HA/Proxy。

相关信息

Aurora 端点的类型

DNS 缓存

为什么我会在 Amazon Aurora 数据库集群发生故障转移后收到只读错误?

AWS 官方
AWS 官方已更新 1 年前