

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon DocumentDB 失效转移
<a name="failover"></a>

在某些情况下，例如某些类型的计划维护，或出现不太可能出现的主节点或可用区故障时，Amazon DocumentDB（与 MongoDB 兼容）会检测故障并替换主节点。在故障转移期间，写入停机时间将最小化。因为主节点的角色故障转移到一个只读副本，而不是必须创建和设置新的主节点。此故障检测和副本提升可确保在提升完成后，您可以马上继续写入新的主节点。

要使失效转移起作用，您的集群必须至少具有两个实例——一个主实例和至少一个副本实例。

**注意**  
本主题仅适用于 Amazon DocumentDB 基于实例的原始集群。不适用于弹性集群或全局集群。

## 控制失效转移目标
<a name="failover-target_control"></a>

Amazon DocumentDB 提供失效转移层作为方法来控制在发生失效转移时，将哪个副本实例提升为主实例。

**故障转移层**  
每个副本实例都与一个失效转移层 (0—15) 关联。当因为维护或意外硬件故障而发生失效转移时，主实例将故障转移到具有最高优先级（最低编号层）的副本。如果多个副本具有相同的优先级层，则主实例将故障转移到大小与前主实例最接近的层的副本。

通过将一组选择副本的故障转移层设置为 `0`（最高优先级），可以确保故障转移将提升该组中的副本之一。您可以通过为特定副本分配低优先级层（编号高）来有效阻止这些副本在发生故障转移时被提升为主实例。当特定副本被应用程序大量使用并且故障转移到其中一个副本会对关键应用程序产生不利影响时，此方法很有用。

您可以在创建实例时或稍后通过修改实例来设置它的故障转移层。通过修改实例来设置实例故障转移不会触发故障转移。有关更多信息，请参阅以下主题：
+ [向集群添加 Amazon DocumentDB 实例](db-instance-add.md)
+ [修改 Amazon DocumentDB 实例](db-instance-modify.md)

手动启动故障转移时，可通过两种方法来控制将哪些副本实例提升为主实例：前面介绍的故障转移层和 `--target-db-instance-identifier` 参数。

**--`target-db-instance-identifier`**  
为了进行测试，您可以使用 `failover-db-cluster` 操作强制故障转移事件。您可以使用 `--target-db-instance-identifier` 参数指定将哪个副本实例提升为主实例。使用 `--target-db-instance-identifier` 参数取代故障转移优先级层。如果您不指定 `--target-db-instance-identifier` 参数，主故障转移将与故障转移优先级层保持一致。



## 失效转移过程中发生的事件
<a name="failover-what_happens"></a>

Amazon DocumentDB 将自动处理失效转移，以便应用程序尽快恢复数据库操作而无需管理干预。
+ 如果您在相同或不同的可用区中有 Amazon DocumentDB 副本实例，当进行故障转移时：Amazon DocumentDB 会翻转您的实例的规范名称记录（CNAME），以指向运行状态正常的副本；相应地，此副本会晋升为新的主实例。从开始到结束，故障转移通常会在 30 秒内完成。
+ 如果您没有 Amazon DocumentDB 副本实例（例如，单个实例集群）： Amazon DocumentDB 将尝试在与原始实例相同的可用区中创建新实例。原实例会尽量替换，但可能不会成功，例如出现全面影响该可用区的问题时。

您的应用程序应在连接丢失时重试数据库连接。

## 测试故障转移
<a name="failover-testing"></a>

集群的失效转移会将集群中的 Amazon DocumentDB 副本之一（只读实例）提升为主实例（集群写入器）。

当主实例发生故障时，Amazon DocumentDB 将自动故障转移到 Amazon DocumentDB 副本（如果存在）。当您要模拟主实例的故障以进行测试时，可以强制进行故障转移。集群中的每个实例都有自己的终端节点地址。因此，您需要在故障转移完成后清理并重新建立使用这些终端节点地址的任何现有连接。

要强制进行故障转移，请使用带以下参数的 `failover-db-cluster` 操作。
+ `--db-cluster-identifier` – 必填项。要进行故障转移的集群的名称。
+ `--target-db-instance-identifier`—可选。要提升为主实例的实例的名称。

**Example**  
以下操作将强制对 `sample-cluster` 集群进行故障转移。它不指定哪个实例要成为新的主实例，因此 Amazon DocumentDB 将根据失效转移层优先级来选择实例。  
对于 Linux、macOS 或 Unix：  

```
aws docdb failover-db-cluster \
   --db-cluster-identifier sample-cluster
```
对于 Windows：  

```
aws docdb failover-db-cluster ^
   --db-cluster-identifier sample-cluster
```
以下操作将强制 `sample-cluster` 集群进行故障转移，同时指定将 `sample-cluster-instance` 提升为主角色。（请注意输出中的 `"IsClusterWriter": true`。）  
对于 Linux、macOS 或 Unix：  

```
aws docdb failover-db-cluster \
   --db-cluster-identifier sample-cluster \
   --target-db-instance-identifier sample-cluster-instance
```
对于 Windows：  

```
aws docdb failover-db-cluster ^
   --db-cluster-identifier sample-cluster ^
   --target-db-instance-identifier sample-cluster-instance
```
此操作的输出将类似于下文（JSON 格式）。  

```
{
    "DBCluster": {
        "HostedZoneId": "Z2SUY0A1719RZT",
        "Port": 27017,
        "EngineVersion": "3.6.0",
        "PreferredMaintenanceWindow": "thu:04:05-thu:04:35",
        "BackupRetentionPeriod": 1,
        "ClusterCreateTime": "2018-06-28T18:53:29.455Z",
        "AssociatedRoles": [],
        "DBSubnetGroup": "default",
        "MasterUsername": "master-user",
        "Engine": "docdb",
        "ReadReplicaIdentifiers": [],
        "EarliestRestorableTime": "2018-08-21T00:04:10.546Z",
        "DBClusterIdentifier": "sample-cluster",
        "ReaderEndpoint": "sample-cluster.node.us-east-1.docdb.amazonaws.com",
        "DBClusterMembers": [
            {
                "DBInstanceIdentifier": "sample-cluster-instance",
                "DBClusterParameterGroupStatus": "in-sync",
                "PromotionTier": 1,
                "IsClusterWriter": true
            },
            {
                "DBInstanceIdentifier": "sample-cluster-instance-00",
                "DBClusterParameterGroupStatus": "in-sync",
                "PromotionTier": 1,
                "IsClusterWriter": false
            },
            {
                "DBInstanceIdentifier": "sample-cluster-instance-01",
                "DBClusterParameterGroupStatus": "in-sync",
                "PromotionTier": 1,
                "IsClusterWriter": false
            }
        ],
        "AvailabilityZones": [
            "us-east-1b",
            "us-east-1c",
            "us-east-1a"
        ],
        "DBClusterParameterGroup": "default.docdb3.6",
        "Endpoint": "sample-cluster.node.us-east-1.docdb.amazonaws.com",
        "IAMDatabaseAuthenticationEnabled": false,
        "AllocatedStorage": 1,
        "LatestRestorableTime": "2018-08-22T21:57:33.904Z",
        "PreferredBackupWindow": "00:00-00:30",
        "StorageEncrypted": false,
        "MultiAZ": true,
        "Status": "available",
        "DBClusterArn": "arn:aws:rds:us-east-1:123456789012:cluster:sample-cluster",
        "VpcSecurityGroups": [
            {
                "Status": "active",
                "VpcSecurityGroupId": "sg-12345678"
            }
        ],
        "DbClusterResourceId": "cluster-ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    }
}
```