Azure Cosmos DB の MongoDB 用 API を使用して読み取りをグローバルに配布する方法について説明します

適用対象: MongoDB

この記事では、Azure Cosmos DB の MongoDB 用 API を使用して MongoDB 読み取り設定で読み取り操作をグローバルに配布する方法について示します。

前提条件

Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。

または、Azure サブスクリプションを使わず、課金も契約もなしで Azure Cosmos DB を無料で試すことができます。 または、次の接続文字列で、このチュートリアルの Azure Cosmos DB Emulator を使うことができます。

mongodb://localhost:C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==@localhost:10255/admin?ssl=true

Azure Portal を使用して Azure Cosmos DB アカウントをグローバル配布で設定し、それに接続する手順については、このクイック スタートの記事を参照してください。

サンプル アプリケーションの複製

git ターミナル ウィンドウ (git bash など) を開き、cd を実行して作業ディレクトリに移動します。

次のコマンドを実行して、サンプル リポジトリを複製します。 使用するプラットフォームに基づいて、次のいずれかのサンプル リポジトリを使用します。

  1. .NET サンプル アプリケーション
  2. NodeJS サンプル アプリケーション
  3. Mongoose サンプル アプリケーション
  4. Java サンプル アプリケーション
  5. SpringBoot サンプル アプリケーション
git clone <sample repo url>

アプリケーションの実行

使用するプラットフォームに基づいて、必要なパッケージをインストールし、アプリケーションを起動します。 依存関係をインストールするには、サンプル アプリケーション リポジトリに含まれている README に従います。 たとえば、NodeJS サンプル アプリケーションでは、次のコマンドを使用して必要なパッケージをインストールし、アプリケーションを起動します。

cd mean
npm install
node index.js

アプリケーションは MongoDB ソースに接続しようとしますが、接続文字列が無効であるために失敗します。 README の手順に従って、接続文字列 url を更新します。 また、readFromRegion を Azure Cosmos DB アカウントの読み取りリージョンに更新します。 次の手順は、NodeJS サンプルのものです。

* Next, substitute the `url`, `readFromRegion` in App.Config with your Azure Cosmos DB account's values. 

この手順を行うと、サンプル アプリケーションが実行され、次の出力が生成されます。

connected!
readDefaultfunc query completed!
readFromNearestfunc query completed!
readFromRegionfunc query completed!
readDefaultfunc query completed!
readFromNearestfunc query completed!
readFromRegionfunc query completed!
readDefaultfunc query completed!
readFromSecondaryfunc query completed!

読み取り設定モードを使用した読み取り

MongoDB プロトコルには、クライアントが使用できる以下の読み取り設定モードがあります。

  1. PRIMARY
  2. PRIMARY_PREFERRED
  3. SECONDARY
  4. SECONDARY_PREFERRED
  5. NEAREST

これらの読み取り設定モードの個々の動作の詳細については、MongoDB 読み取り設定の動作に関するドキュメントを参照してください。 Azure Cosmos DB では、プライマリは WRITE リージョンにマップされ、セカンダリは READ リージョンにマップされます。

一般的なシナリオに基づいて、次の設定を使用することをお勧めします。

  1. 高可用性と待ち時間の短い読み取りが必要な場合は、NEAREST 読み取り設定モードを使用します。 この設定では、読み取り操作で、最も近い使用可能リージョンが利用されます。 最も近いリージョンが WRITE リージョンである場合、これらの操作はそのリージョンを対象にすることに注意してください。
  2. 高可用性と読み取りの geo ディストリビューションが必要な (待ち時間が制約でない) 場合は、PRIMARY PREFERRED または SECONDARY PREFERRED 読み取り設定モードを使用します。 この設定では、読み取り操作がそれぞれ、使用可能な WRITE または READ リージョンに転送されます。 そのリージョンを使用できない場合は、読み取り設定の動作に従って、要求は次の使用可能なリージョンに転送されます。

サンプル アプリケーションの次のスニペットは、NodeJS で NEAREST 読み取り設定を構成する方法を示しています。

  var query = {};
  var readcoll = client.db('regionDB').collection('regionTest', {readPreference: ReadPreference.NEAREST});
  readcoll.find(query).toArray(function(err, data) {
    assert.equal(null, err);
    console.log("readFromNearestfunc query completed!");
  });

同様に、次のスニペットは、NodeJS で SECONDARY_PREFERRED 読み取り設定を構成する方法を示しています。

  var query = {};
  var readcoll = client.db('regionDB').collection('regionTest', {readPreference: ReadPreference.SECONDARY_PREFERRED});
  readcoll.find(query).toArray(function(err, data) {
    assert.equal(null, err);
    console.log("readFromSecondaryPreferredfunc query completed!");
  });

この読み取り設定はまた、接続文字列の URI オプションのパラメーターとして readPreference を渡すことによっても設定できます。

const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');

// Connection URL
const url = 'mongodb://localhost:27017?ssl=true&replicaSet=globaldb&readPreference=nearest';

// Database Name
const dbName = 'myproject';

// Use connect method to connect to the Server
MongoClient.connect(url, function(err, client) {
  console.log("Connected correctly to server");

  const db = client.db(dbName);

  client.close();
});

他のプラットフォームについては、.NETJava など、対応するサンプル アプリケーションのリポジトリを参照してください。

タグを使用した読み取り

MongoDB プロトコルでは、読み取り設定モードの他に、タグを使用して読み取り操作を指示することもできます。 Azure Cosmos DB の MongoDB 用 API では、region タグは既定で isMaster 応答の一部として含まれています。

"tags": {
         "region": "West US"
      }

そのため、MongoClient は region タグとリージョン名を使用して、読み取り操作を特定のリージョンに送ることができます。 Azure Cosmos DB アカウントの場合は、Azure Portal の左側の [設定] > [データをグローバルにレプリケート] にリージョン名が表示されます。 この設定は、読み取りの分離を実現する場合に便利です。たとえば、クライアント アプリケーションに読み取り操作を特定のリージョンだけで行うようにさせる場合などです。 この設定は、実稼働ではない、分析的な種類のシナリオに適しています。バックグラウンドで実行され、運用上のクリティカルなサービスは含まれません。

サンプル アプリケーションの次のスニペットは、NodeJS でタグを使用して読み取り設定を構成する方法を示しています。

 var query = {};
  var readcoll = client.db('regionDB').collection('regionTest',{readPreference: new ReadPreference(ReadPreference.SECONDARY_PREFERRED, {"region": "West US"})});
  readcoll.find(query).toArray(function(err, data) {
    assert.equal(null, err);
    console.log("readFromRegionfunc query completed!");
  });

他のプラットフォームについては、.NETJava など、対応するサンプル アプリケーションのリポジトリを参照してください。

この記事では、Azure Cosmos DB の MongoDB 用 API で読み取り設定を使用して、読み取り操作をグローバルに配布する方法について説明しました。

リソースをクリーンアップする

このアプリの使用を続けない場合は、以下の手順に従い、この記事で作成したすべてのリソースを Azure Portal で削除してください。

  1. Azure Portal の左側のメニューで、 [リソース グループ] をクリックしてから、作成したリソースの名前をクリックします。
  2. リソース グループのページで [削除] をクリックし、削除するリソースの名前をテキスト ボックスに入力してから [削除] をクリックします。

次のステップ