

# Amazon Aurora 的高可用性
高可用性

 Amazon Aurora 体系架构涉及存储和计算的分离。Aurora 包括一些适用于数据库集群中数据的高可用性功能。即使集群中的部分或全部数据库实例变得不可用，数据也会保持安全。其他高可用性功能适用于数据库实例。这些功能有助于确保一个或多个数据库实例准备就绪，以处理来自应用程序的数据库请求。

**Topics**
+ [

## Aurora 数据的高可用性
](#Concepts.AuroraHighAvailability.Data)
+ [

## Aurora 数据库实例的高可用性
](#Concepts.AuroraHighAvailability.Instances)
+ [

## 使用 Aurora Global Database 跨 AWS 区域的高可用性
](#Concepts.AuroraHighAvailability.GlobalDB)
+ [

## Aurora 数据库集群的容错能力
](#Aurora.Managing.FaultTolerance)
+ [

## Amazon RDS 代理的高可用性
](#Concepts.AuroraHighAvailability.Proxy)

## Aurora 数据的高可用性


Aurora 跨一个 AWS 区域中的多个可用区将数据副本存储在数据库集群中。无论数据库集群中的数据库实例是否跨多个可用区，Aurora 都会存储这些副本。有关 Aurora 的更多信息，请参阅[管理 Amazon Aurora 数据库集群](CHAP_Aurora.md)。

在将数据写入到主数据库实例时，Aurora 将数据跨可用区同步复制到与集群卷关联的 6 个存储节点。这样做可以提供数据冗余，消除 I/O 冻结，以及在系统备份期间将延迟峰值降到最低。在计划内的系统维护期间，运行高性能的数据库实例可以提高可用性，并帮助保护数据库以防发生故障和可用区中断。有关可用区的更多信息，请参阅[ 区域及可用区](Concepts.RegionsAndAvailabilityZones.md)。

## Aurora 数据库实例的高可用性


在创建主（写入器）实例后，可以创建多达 15 个只读 Aurora 副本。Aurora 副本也称为读取器实例。Aurora 副本使用异步复制来支持高可用性，不会影响主实例的性能。

在日常操作期间，您可以通过使用读取器实例处理 `SELECT` 查询来减轻读取密集型应用程序的部分工作负载。当问题影响到主实例时，其中一个读取器实例将作为主实例进行接管。此机制称为*失效转移*。许多 Aurora 功能适用于失效转移机制。例如，Aurora 检测数据库问题并在必要时自动激活失效转移机制。Aurora 还具有可缩短失效转移完成时间的功能。这样做可以显著减少数据库在失效转移期间无法写入的时间。

Aurora 旨在实现尽快恢复，最快的恢复途径通常是重启或失效转移到同一个数据库实例。与失效转移相比，重启速度更快，开销也更少。

想要使用相同的连接字符串，即使在失效转移提升了新的主实例时也保持不变，请连接到集群端点。*集群端点* 始终表示集群中的当前主实例。有关集群端点的更多信息，请参阅 [Amazon Aurora 端点连接](Aurora.Overview.Endpoints.md)。

**提示**  
在每个 AWS 区域内，可用区（AZ）表示相互不同的位置，以便在发生中断时提供隔离。建议您将数据库集群中的主实例和读取器实例分配到多个可用区，以提高数据库集群的可用性。这样，影响整个可用区的问题不会导致您的集群中断。  
您可以通过在创建集群时进行简单选择来设置多可用区数据库集群。您可以使用 AWS 管理控制台、AWS CLI 或 Amazon RDS API。您还可以通过添加新的读取器数据库实例并指定不同的可用区，将现有 Aurora 数据库集群转换为多可用区数据库集群。

## 使用 Aurora Global Database 跨 AWS 区域的高可用性


为了跨多个 AWS 区域实现高可用性，您可以设置 Aurora Global Database。每个 Aurora Global Database 均跨越多个 AWS 区域，可在 AWS 区域中实现低延迟的全局读取以及从停机中进行灾难恢复。Aurora 异步将主 AWS 区域中的所有数据和更新复制到各个辅助区域。有关更多信息，请参阅 [使用 Amazon Aurora Global Database](aurora-global-database.md)。

## Aurora 数据库集群的容错能力
容错能力

Aurora 数据库集群设计为具有容错能力。集群卷跨一个 AWS 区域中的多个可用区 (AZ)，每个可用区均包含一个集群卷数据副本。该功能意味着您的数据库集群可容忍可用区的故障，而不发生任何数据丢失，只是会短暂中断服务。

如果数据库集群中的主实例失败，Aurora 将通过两种方式之一来自动失效转移到新的主实例：
+ 将现有的 Aurora 副本提升为新的主实例
+ 创建新的主实例

如果数据库集群具有一个或多个 Aurora 副本，则 Aurora 副本将在故障事件期间被提升为主实例。故障事件将导致短暂中断，其间的读取和写入操作将失败并引发异常。不过，服务通常会在 60 秒内（经常在 30 秒内）还原。要提高数据库集群的可用性，建议您在两个或更多的不同的可用区中创建至少一个或多个 Aurora 副本。

**提示**  
在 Aurora MySQL 中，您可以通过在集群中拥有多个读取器数据库实例来提高失效转移期间的可用性。在 Aurora MySQL 中，Aurora 只重启它失效转移到的写入器数据库实例和读取器实例。集群中的其他读取器实例在失效转移期间仍然可用，以通过与读取器端点建立连接来继续处理查询。  
还通过将 RDS 代理与 Aurora 数据库集群结合使用来提高失效转移期间的可用性。有关更多信息，请参阅 [Amazon RDS 代理的高可用性](#Concepts.AuroraHighAvailability.Proxy)。

您可以通过为每个副本分配一个优先级来自定义发生故障后将 Aurora 副本提升为主实例的顺序。优先级介于 0（最高优先级）和 15（最低优先级）之间。如果主实例失败，则 Amazon RDS 会将具有最高优先级的 Aurora 副本提升为新的主实例。您可以随时修改 Aurora 副本的优先级。修改优先级不会触发失效转移。

多个 Aurora 副本可共享同一个优先级，这会产生多个提升层。如果两个或更多 Aurora 副本共享同一个优先级，则 Amazon RDS 将提升最大的副本。如果两个或多个 Aurora 副本共享同一优先级和大小，则 Amazon RDS 将提升同一提升层中的任意副本。

**注意**  
确定失效转移的目标涉及多个因素。在失效转移尝试失败五次后，将不再考虑提升层。

如果数据库集群不包含任何 Aurora 副本，将在故障事件期间在同一可用区中重新创建主实例。故障事件将导致中断，其间的读取和写入操作将失败并引发异常。创建新的主实例时将还原服务，该操作所需的时间通常在 10 分钟内。将 Aurora 副本提升为主实例要比创建新的主实例快得多。

假设集群中的主实例由于影响整个可用区的中断而不可用。在这种情况下，使新主实例联机的方式取决于您的集群是否使用多可用区配置：
+ 如果您的预置或 Aurora Serverless v2 集群包含其他可用区中的任何读取器实例，则 Aurora 会使用失效转移机制将其中一个读取器实例提升为新主实例。
+ 如果您的预置或 Aurora Serverless v2 集群只包含一个数据库实例，或者主实例和所有读取器实例均位于同一可用区中，请确保在另一个可用区中手动创建一个或多个新数据库实例。
+ 如果您的集群使用 Aurora Serverless v1，则 Aurora 会在另一个可用区中自动创建新数据库实例。但是，此过程涉及更换主机，因此比失效转移花费的时间更长。

**注意**  
Amazon Aurora 还支持对外部 MySQL 数据库或 RDS MySQL 数据库实例的复制。有关更多信息，请参阅 [Aurora 与 MySQL 之间或 Aurora 与其他 Aurora 数据库集群之间的复制（二进制日志复制）](AuroraMySQL.Replication.MySQL.md)。

## Amazon RDS 代理的高可用性


使用 RDS 代理，您可以构建能够透明地承受数据库故障的应用程序，而无需编写复杂的故障处理代码。代理会自动将流量路由到新的数据库实例，同时保留应用程序连接。它还绕过域名系统（DNS）缓存，以将 Aurora 多可用区数据库的失效转移时间缩短多达 66%。有关更多信息，请参阅 [适用于 Aurora 的Amazon RDS 代理](rds-proxy.md)。