Amazon DocumentDB故障转移
在某些情况下,例如某些类型的计划维护,或出现不太可能出现的主节点或可用区故障时,Amazon DocumentDB(与 MongoDB 兼容) 将检测故障并替换主节点。在故障转移期间,写入停机时间将最小化。因为主节点的角色故障转移到一个只读副本,而不是必须创建和设置新的主节点。此故障检测和副本提升可确保在提升完成后,您可以马上继续写入新的主节点。
要使故障转移起作用,您的集群必须至少具有两个实例 — 一个主实例和至少一个副本实例。
控制故障转移目标
Amazon DocumentDB 提供故障转移层作为方法来控制在发生故障转移时,将哪个副本实例提升为主实例。
故障转移层
每个副本实例都与一个故障转移层 (0–15) 关联。当因为维护或意外硬件故障而发生故障转移时,主实例将故障转移到具有最低优先级层的副本。如果多个副本具有相同的优先级层,则主实例将故障转移到大小与主实例最接近的层的副本。
通过将一组选择副本的故障转移层设置为 0
(最高优先级),可以确保故障转移将提升该组中的副本之一。您可以通过为特定副本分配低优先级层(编号高)来有效阻止这些副本在发生故障转移时被提升为主实例。当特定副本被应用程序大量使用并且故障转移到其中一个副本会对关键应用程序产生不利影响时,此方法很有用。
您可以在创建实例时或稍后通过修改实例来设置它的故障转移层。通过修改实例来设置实例故障转移不会触发故障转移。有关更多信息,请参阅以下主题:
手动启动故障转移时,可通过两种方法来控制将哪些副本实例提升为主实例:前面介绍的故障转移层和 --target-db-instance-identifier
参数。
--target-db-instance-identifier
为了进行测试,您可以使用 failover-db-cluster
操作强制故障转移事件。您可以使用 --target-db-instance-identifier
参数指定将哪个副本实例提升为主实例。使用 --target-db-instance-identifier
参数取代故障转移优先级层。如果您不指定 --target-db-instance-identifier
参数,主故障转移将与故障转移优先级层保持一致。
故障转移过程中发生的事件
Amazon DocumentDB将自动处理故障转移,以便应用程序尽快恢复数据库操作而无需管理干预。
如果您在相同或不同的可用区中有 Amazon DocumentDB 副本实例,当进行故障转移时:Amazon DocumentDB 会翻转您的实例的别名记录 (CNAME),以指向运行状态正常的副本;相应地,此副本会晋升为新的主实例。从开始到结束,故障转移通常会在 30 秒内完成。
如果您没有 Amazon DocumentDB 副本实例(例如,单个实例集群):Amazon DocumentDB 将尝试在与原始实例相同的可用区中创建新实例。原实例会尽量替换,但可能不会成功,例如出现全面影响该可用区的问题时。
您的应用程序应在连接丢失时重试数据库连接。
测试故障转移
集群的故障转移会将集群中的 Amazon DocumentDB 副本之一(只读实例)提升为主实例(集群写入器)。
当主实例发生故障时,Amazon DocumentDB 将自动故障转移到 Amazon DocumentDB 副本(如果存在)。当您要模拟主实例的故障以进行测试时,可以强制进行故障转移。集群中的每个实例都有自己的终端节点地址。因此,您需要在故障转移完成后清理并重新建立使用这些终端节点地址的任何现有连接。
要强制进行故障转移,请使用带以下参数的 failover-db-cluster
操作。
--db-cluster-identifier
— 必需。要进行故障转移的集群的名称。--target-db-instance-identifier
— 可选。要提升为主实例的实例的名称。
以下操作将强制对 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"
}
}