Amazon DocumentDB (with MongoDB compatibility) が Global Clusters に対応しました

Amazon DocumentDB (with MondoDB compatibility) で、Global Clusters の機能がサポートされましたので試してみます
2021.06.08

こんにちは、菊池です。

先週、Amazon DocumentDB (with MondoDB compatibility) で、Global Clusters の機能がサポートされました。

Global Clusters を使用することで、マルチリージョンでの参照や、災害対策が可能になります。

Amazon DocumentDB (with MongoDB compatibility) Global Clusters

Global Clusters では、1つのプライマリリージョンと、最大5つの読み取り専用セカンダリリージョンで構成できます。セカンダリリージョンへの自動レプリケーションは、通常1秒未満のレイテンシで可能で、以下のような特徴を持ちます。

  • リージョン全体の停止からの復旧が可能
  • リージョンごとに最大16のリードレプリカをサポート
  • Amazon DocumentDB v4.0でサポート
  • サポートされるインスタンスクラスは db.r5(t3およびr4は未サポート)
  • Global Clustersに所属するプライマリ/セカンダリクラスタは停止不可
  • プライマリリージョンのインスタンスが再起動すると、セカンダリリージョンのレプリカインスタンスも再起動する

詳細は公式ドキュメントを合わせて確認ください。

Global Clusters の作成

それでは、Global Clustersを作成していきます。あらかじめ、東京リージョン(ap-northeast-1)にDocumentDBのクラスタを作成しておきました。

クラスタを選択し、[アクション] から [リージョンの追加] を選びます。

追加するリージョンと、クラスタの設定画面に遷移します。

選択可能なリージョンは、DocumentDBが提供されているリージョンです。

今回はソウル(ap-northeast-2)に、2インスタンスのクラスタを作成します。他のパラメータはデフォルトを選択しました。

作成中のステータスとなります。通常のクラスタ作成と同じくらいの時間がかかりました。

全てのインスタンスが利用可能になりました。

セカンダリクラスタへ接続してみます。注意点は、接続先にクラスタのReader Endpointを使用することです。Reader Endopointへ接続すれば、通常のSecondaryノードとして利用することが可能になります。

$ mongo --ssl --host docdb-2021-06-07-23-33-25.cluster-ro-xxxxxxxxxxxx.ap-northeast-2.docdb.amazonaws.com:27017 --sslCAFile rds-combined-ca-bundle.pem --username test --password
  :
rs0:SECONDARY>

一方で、セカンダリクラスタのCluster Endpointは利用できません。コンソール上、エンドポイントは記載されていますが、接続を試みても HostNotFound となります。どうやら、セカンダリクラスタのCluster Endpointは名前解決ができないようです。

$ mongo --ssl --host docdb-2021-06-07-23-33-25.cluster-xxxxxxxxxxxx.ap-northeast-2.docdb.amazonaws.com:27017 --sslCAFile rds-combined-ca-bundle.pem --username test --password
  :
Error: couldn't connect to server docdb-2021-06-07-23-33-25.cluster-xxxxxxxxxxxx.ap-northeast-2.docdb.amazonaws.com:27017, connection attempt failed: HostNotFound: Could not find address for docdb-2021-06-07-23-33-25.cluster-xxxxxxxxxxxx.ap-northeast-2.docdb.amazonaws.com:27017: SocketException: Host not found (authoritative) :
connect@src/mongo/shell/mongo.js:374:17
@(connect):2:6
exception: connect failed

セカンダリクラスタの昇格

続いて、セカンダリクラスターの昇格を試してみます。

DocumentDBのGlobal Clustersでは、クラスタ間でフェイルオーバーさせてプライマリーを引き継ぐというよりは、セカンダリクラスタをGlobal Clustersから切り離して独立させることで、プライマリに昇格させる動作になります。

  1. プライマリへの更新ワークロードを停止させる
  2. 昇格させるセカンダリクラスタを決定する
  3. 昇格対象のセカンダリクラスタを、Global Clustersから削除する
  4. 昇格対象のセカンダリクラスタがスタンドアロンのクラスタとして昇格
  5. 更新先のエンドポイントを、昇格したクラスタのエンドポイントに変更する

という流れが必要になります。ユースケースとしては、DRサイトへの切替などが考えられます。一方で注意すべき点として、以下が挙げられます。

  • クラスタを切り離してプライマリに昇格させるため、元のプライマリクラスタが残っているとスプリットブレインの状態となる
  • 元のリージョンにフェイルバックするには、新しいプライマリからGlobal Clustersを再作成し、元のリージョンにフォイルオーバーさせる

特に、1つ目のスプリットブレインについては、更新先クラスタを確実に切替しなければデータの不整合も発生するため要注意です。

それでは、ソウルリージョンのセカンダリクラスタの昇格を試してみます。昇格対象のクラスタを選択し、[アクション]から[グローバルから削除] を選びます。

確認画面が出ますので、昇格に進みます。

セカンダリクラスタが Promoting の状態になります。

しばらくすると、セカンダリクラスタの切り離しが完了し、スタンドアロンのクラスタとして利用可能になしました。

この状態になると、Global Clustersのセカンダリ状態では利用できなかった、Cluster Endpointへの接続も可能になり、プライマリとして接続できます。

$ mongo --ssl --host docdb-2021-06-07-23-33-25.cluster-xxxxxxxxxxxx.ap-northeast-2.docdb.amazonaws.com:27017 --sslCAFile rds-combined-ca-bundle.pem --username test --password
  :
rs0:PRIMARY>

まとめ

Amazon DocumentDBでサポートされた Global Clustersを紹介しました。この機能を使うことで、簡単にマルチリージョンでのリードレプリカの展開や、DRサイトの構築が可能です。

一方、同じストレージシステムを持つAuroraの Global Databaseとは異なる仕様・挙動がありますのでご注意ください。