对 Amazon RDS 的多可用区数据库实例执行失效转移
如果由于基础设施缺陷而导致多可用区数据库实例发生计划内或计划外中断,Amazon RDS 会自动切换到另一个可用区中的备用副本。
完成故障转移所用的时间取决于在主数据库实例变为不可用时的数据库活动和其他条件。故障转移时间通常为 60–120 秒。不过,事务较多或时间较长的恢复过程可能延长故障转移时间。完成故障转移后,RDS 控制台还需要一段时间才能反映新的可用区。
注意
在重启多可用区数据库实例时,可以手动强制执行失效转移。有关更多信息,请参阅 重启中的数据库实例。
Amazon RDS 会自动处理故障转移,因此,您可以尽快恢复数据库操作而无需管理干预。如果出现下表中描述的任一情况,主数据库实例会自动切换到备用副本:您可以在事件日志中查看这些故障转移原因。
故障转移原因 | 描述 |
---|---|
RDS 数据库实例所在的操作系统正在脱机操作中安装补丁。 |
在操作系统补丁或安全更新的维护时段内触发了故障切换。 有关更多信息,请参阅“维护数据库实例”。 |
RDS 多可用区实例的主要主机运行状况不佳。 |
多可用区数据库实例部署检测到受损的主数据库实例并进行故障转移。 |
由于网络连接断开,无法访问 RDS 多可用区实例的主机。 |
RDS 监控检测到主数据库实例的网络可达性故障并触发了故障转移。 |
客户修改了 RDS 实例。 |
RDS 数据库实例修改触发了故障转移。 有关更多信息,请参阅“修改 Amazon RDS 数据库实例”。 |
RDS 多可用区主实例正忙且无响应。 |
主数据库实例没有响应。建议您执行以下操作:
有关这些建议的更多信息,请参阅 Amazon RDS 的监控工具 和 Amazon RDS 的最佳实践。 |
RDS 多可用区实例的主要主机所在的存储卷出现故障。 |
多可用区数据库实例部署在主数据库实例上检测到存储问题并进行故障转移。 |
用户请求数据库实例的故障转移。 |
您重新启动了数据库实例,并选择了通过故障转移重启。 有关更多信息,请参阅 重启中的数据库实例。 |
要确定多可用区数据库实例是否发生故障转移,您可以执行以下操作:
将数据库事件订阅设置为在故障转移启动时向您发送电子邮件或 SMS 通知。有关事件的更多信息,请参阅 使用 Amazon RDS 事件通知。
使用 RDS 控制台或 API 操作查看数据库事件。
使用 RDS 控制台和 API 操作查看多可用区数据库实例部署的当前状态。
有关如何响应故障转移、缩短恢复时间以及 Amazon RDS 的其他最佳实践的信息,请参阅 Amazon RDS 的最佳实践。
设置 DNS 名称查找的 JVM TTL
故障转移机制自动更改数据库实例的域名系统 (DNS) 记录,使其指向备用数据库实例。因此,您需要重新建立与数据库实例之间的所有现有连接。在 Java 虚拟机 (JVM) 环境中,由于 Java DNS 缓存机制的工作原理,您可能需要重新配置 JVM 设置。
JVM 缓存 DNS 名称查找。当 JVM 将主机名解析为 IP 地址时,它会在指定时间段内 (称为存活时间 (TTL)) 缓存 IP 地址。
由于 AWS 资源使用偶尔变更的 DNS 名称条目,因此建议您为 JVM 配置的 TTL 值不超过 60 秒。这样做可确保在资源的 IP 地址发生更改时,您的应用程序可以通过重新查询 DNS 来接收和使用资源的新 IP 地址。
对于一些 Java 配置,将设置 JVM 默认 TTL,以便在重新启动 JVM 之前绝不刷新 DNS 条目。因此,如果 AWS 资源的 IP 地址在应用程序仍在运行时发生更改,则在您手动重新启动 JVM 并刷新缓存的 IP 信息之前,将无法使用该资源。在此情况下,设置 JVM 的 TTL,以便定期刷新其缓存的 IP 信息是极为重要的。
您可以通过检索 networkaddress.cache.ttl
String ttl = java.security.Security.getProperty("networkaddress.cache.ttl");
注意
默认 TTL 是变化的,具体取决于 JVM 的版本以及是否安装安全管理器。许多 JVM 提供的默认 TTL 小于 60 秒。如果您使用此类 JVM 并且未使用安全管理器,则您可以忽略本主题的剩余内容。有关 Oracle 中安全管理器的更多信息,请参阅 Oracle 文档中的安全管理器
要修改 JVM 的 TTL,请设置 networkaddress.cache.ttl
属性值。根据您的需求,使用下列方法之一:
-
要为使用 JVM 的所有应用程序全局设置属性值,请在
networkaddress.cache.ttl
文件中设置$JAVA_HOME/jre/lib/security/java.security
。networkaddress.cache.ttl=60
-
要仅在本地为应用程序设置属性,请在建立任何网络连接之前,在应用程序的初始化代码中设置
networkaddress.cache.ttl
。java.security.Security.setProperty("networkaddress.cache.ttl" , "60");