Amazon DocumentDB フェイルオーバー - Amazon DocumentDB

英語の翻訳が提供されている場合で、内容が矛盾する場合には、英語版がオリジナルとして取り扱われます。翻訳は機械翻訳により提供されています。

Amazon DocumentDB フェイルオーバー

計画された特定のタイプのメンテナンスや、プライマリノードまたはアベイラビリティーゾーンの予期しない障害など、特定の場合に、Amazon DocumentDB (MongoDB 互換) は障害を検出してプライマリノードを置き換えます。フェイルオーバー中、書き込みのダウンタイムは最小限になります。これは、プライマリノードのロールが新しいプライマリノードを作成してプロビジョニングする代わりに、リードレプリカのいずれかにフェイルオーバーするためです。この障害検出とレプリカの昇格により、昇格が完了したらすぐに新しいプライマリへの書き込みを再開できます。

フェイルオーバーが機能するためには、クラスターに少なくとも 2 つのインスタンス (プライマリインスタンスおよび 1 つ以上のレプリカインスタンス) が必要です。

フェイルオーバーターゲットの制御

Amazon DocumentDB は、フェイルオーバーが発生した場合にプライマリに昇格されるレプリカインスタンスを制御するための手段として、フェイルオーバー階層を提供します。

フェイルオーバー階層

各レプリカインスタンスは、フェイルオーバー階層 (0 – 15) と関連付けられます。メンテナンスのためフェイルオーバーが発生するか、予期しないハードウェア障害が発生した場合、プライマリインスタンスは優先度の最も低い番号の階層を持つレプリカにフェイルオーバーします。優先度が同じ階層を持つ複数のレプリカがある場合、プライマリは、プライマリに最も近いサイズのその階層のレプリカにフェイルオーバーします。

選択したレプリカのグループのフェイルオーバー階層を 0 (最大の優先度) に設定することで、フェイルオーバーでそのグループ内のいずれかのレプリカを昇格することができます。フェイルオーバーが発生した場合に、優先度の低い階層 (高い番号) をこれらのレプリカに割り当てることで、特定のレプリカのプライマリへの昇格を実質的に防ぐことができます。これは、特定のレプリカがアプリケーションによって多く使用され、それらの 1 つへのフェイルオーバーによって重要なアプリケーションに悪影響を与える可能性がある状況で役立ちます。

インスタンスのフェイルオーバー階層は、インスタンスの作成時に設定するか、後でインスタンスを変更して設定できます。インスタンスを変更してインスタンスのフェイルオーバーを設定しても、フェイルオーバーはトリガーされません。詳細については、以下のトピックを参照してください。

手動でフェイルオーバーを開始するときは、プライマリに昇格するレプリカインスタンスを制御するための 2 つの方法として、先ほど説明したフェイルオーバー階層と --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 レプリカの 1 つ (読み取り専用インスタンス) が、プライマリインスタンス (クラスターライター) に昇格されます。

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" } }