对 Amazon RDS 的多可用区数据库集群执行失效转移
如果多可用区数据库集群中的写入器数据库实例发生计划内或计划外的中断,Amazon RDS 会自动故障转移到另一个可用区中的读取器数据库实例。这可最大限度地减少中断,从而确保高可用性。失效转移可能发生在硬件故障、网络问题或手动请求期间。该主题概述了故障自动检测、失效转移期间的事件序列及其对读取和写入操作的影响。它还提供了监控失效转移和尽可能减少失效转移时间的最佳实践。
完成故障转移所用的时间取决于在写入器数据库实例变为不可用时的数据库活动和其他条件。故障转移时间通常低于 35 秒。当两个读取器数据库实例都应用了来自失败写入器的未完成事务后,故障转移即完成。完成故障转移后,RDS 控制台还需要一段时间才能反映新的可用区。
自动故障转移
Amazon RDS 会自动处理故障转移,因此,您可以尽快恢复数据库操作而无需管理干预。要进行故障转移,写入器数据库实例将自动切换到读取器数据库实例。
手动对多可用区数据库集群执行故障转移
如果您手动对多可用区数据库集群执行失效转移,RDS 将首先终止主数据库实例。然后,内部监控系统检测到主数据库实例运行状况不佳,并提升可读副本数据库实例。故障转移时间通常低于 35 秒。
您可以使用 AWS Management Console、AWS CLI 或 RDS API 手动对多可用区数据库集群执行故障转移。
要手动对多可用区数据库集群执行故障转移
登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 -
在导航窗格中,选择 Databases(数据库)。
-
选择要进行故障转移的多可用区数据库集群。
-
对于 Actions(操作),请选择 Failover(故障转移)。
此时将会显示失效转移数据库集群页面。
-
请选择 Failover(故障转移)以确认手动进行故障转移。
要手动对多可用区数据库集群执行故障转移,请使用 AWS CLI 命令 failover-db-cluster。
aws rds failover-db-cluster --db-cluster-identifier
mymultiazdbcluster
要手动对多可用区数据库集群执行故障转移,请调用 Amazon RDS API FailoverDBCluster 然后指定 DBClusterIdentifier
。
确定多可用区数据库集群是否已完成故障转移
要确定多可用区数据库集群是否发生故障转移,您可以执行以下操作:
将数据库事件订阅设置为在故障转移启动时向您发送电子邮件或 SMS 通知。有关事件的更多信息,请参阅 使用 Amazon RDS 事件通知。
使用 Amazon RDS 控制台或 API 操作查看数据库事件。
使用 Amazon RDS 控制台、AWS CLI 以及 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 信息是极为重要的。
注意
默认 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");