ApsaraDB for MongoDB シャードクラスタインスタンスは、各 mongos ノードの接続情報を提供します。 mongos ノードを通じて ApsaraDB for MongoDB にアクセスできます。 ただし、ロードバランシングと高可用性を実現するには、適切な方法を使用してシャードクラスタインスタンスに接続する必要があります。

背景

シャードクラスタアーキテクチャ

MongoDB のシャードクラスタは、高いスケーラビリティを促進するためにデータを複数のシャードに分散して格納します。 シャードクラスタを作成するとき、MongoDB はクラスタのメタデータを格納するための構成サーバーを導入し、アプリケーション用にクラスタへのエントリを提供するための 1 つ以上の mongos ノードを導入します。 mongos ノードは構成サーバーからルーティング情報を読み取り、バックエンドの対応するシャードにリクエストをルーティングします。

  • mongos ノードに接続すると、mongod プロセスとして機能することができます。
  • すべての Mongos ノードは等しいです。 シャードクラスタにアクセスするために 1 つ以上の mongos ノードに接続できます。
  • mongos ノードはステートレスであり、必要に応じてスケールアウトできます。 シャードクラスターのサービス能力は、シャードの総サービス能力と mongos ノードの総サービス能力の小さい方に左右されます。
  • シャードクラスタにアクセスするときは、複数の mongos ノード間でアプリケーションの負荷を均等に分担することをお勧めします。

Connection string URI

正しくシャードクラスタインスタンスに接続するには、MongoDB の URI 形式の Connection string を理解する必要があります。 あらゆる公式 drivers は、Connection string URI で MongoDB に接続することをサポートしています。

Connection string URI の例:

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][? options]]
  • mongodb://:このアドレスが Connection string URI であることを示すプレフィックス。
  • username:password@:認証が有効になっている場合のデータベースへのログインに使用されるユーザー名とパスワード。
  • hostX:portX:mongos ノードへの接続に使用されるアドレスのリスト。
  • /database:認証が有効になっている場合のユーザー名とパスワードに対応するデータベース。
  • ? options:追加の接続オプション。

Connection string URI を使用して、シャードクラスタインスタンスに接続します。

ApsaraDB for MongoDB では、Connection string URI を使用してシャードクラスタインスタンスに接続し、ロードバランシングと高可用性を実現できます。

  1. シャードクラスタインスタンスの Connection string URI を取得します。 詳細は、ApsaraDB for MongoDB インスタンスへの接続をご参照ください。Connection string URI
  2. 取得した Connection string URI を使用して、アプリケーションをインスタンスに接続します。 詳細は、MongoDB driver の接続をご参照ください。

    Java コードの例を次に示します。

    MongoClientURI connectionString = new MongoClientURI("mongodb://:****@s-xxxxxxxx.mongodb.rds.aliyuncs.com:3717,s-xxxxxxxx.mongodb.rds.aliyuncs.com:3717/admin"); // Replace **** with the password of the root user.
    MongoClient client = new MongoClient(connectionString);
    MongoDatabase database = client.getDatabase("mydb");
    MongoCollection<Document> collection = database.getCollection("mycoll");

    上記の方法でシャードクラスタインスタンスに接続すると、クライアントは自動的にリクエストを複数の mongos ノードに分散して負荷を分散させることができます。 その同時に、connection string URI を使用して 2 つ以上の mongos ノードに接続し、mongos ノードに障害がある場合、クライアントは自動的に障害のあるノードをスキップして他の機能している mongos ノードにリクエストを分散します。

多くの mongos ノードがある場合は、それらをアプリケーションごとにグループ化できます。 たとえば、アプリケーション A、アプリケーション B、および 4 つの mongos ノードがあります。 アプリケーション A の URI には mongos 1 と mongos 2 の接続アドレスのみを指定し、アプリケーション B の URI には mongos 3 と mongos 4 の接続アドレスのみを指定します。このようにして、mongos ノードを分離することによってアプリケーション間でのアクセス分離を実現できます。
アプリケーションは互いに分離された mongos ノードに接続されていますが、バックエンドでシャードを共有します。

一般的な接続オプション

  • 読み取りと書き込みの分離

    Connection string URI のoptionsreadPreference=secondaryPreferredを追加し、read preference をシャードのセカンダリノードに設定します。

    以下は、read preference を指定した connection string URI の例です。
    mongodb://root:xxxxxxxx@dds-xxxxxxxxxxxx:3717,xxxxxxxxxxxx:3717/admin? replicaSet=mgset-xxxxxx&readPreference=secondaryPreferred
  • 接続を制限する

    Connection string URI のoptionsmaxPoolSize=xx を追加することで、クライアントの接続プール内の最大接続数を xx に制限できます。

  • 返す前にデータがほとんどのノードに書き込まれるようにする方法

    Connection string URI のoptionsw=majority を追加することで、ApsaraDB for MongoDB は書き込みリクエストの主要ノードにデータを書き込んだ後、クライアントに確認応答を送信します。