如何使用 Azure Cosmos DB 的 API for MongoDB 在多个区域中分配读取操作

适用对象: MongoDB

本文介绍如何通过 Azure Cosmos DB 的 API for MongoDB 使用 MongoDB 读取首选项设置在多个区域中分配读取操作。

先决条件

如果没有 Azure 订阅,请在开始前创建一个试用版订阅

对于本教程,可以使用 Azure Cosmos DB 模拟器,其连接字符串为:

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

请参阅此快速入门一文,获取有关使用 Azure 门户通过多区域分布设置 Azure Cosmos DB 帐户,然后连接到该帐户的说明。

克隆示例应用程序

打开 git 终端窗口(例如 git bash)并使用 cd 切换到工作目录。

运行以下命令克隆示例存储库。 根据所需的平台,使用以下示例存储库之一:

  1. .NET 示例应用程序
  2. NodeJS 示例应用程序
  3. Mongoose 示例应用程序
  4. Java 示例应用程序
  5. SpringBoot 示例应用程序
git clone <sample repo url>

运行应用程序

根据所用的平台,安装所需的包并启动应用程序。 若要安装依赖项,请遵循示例应用程序存储库中包含的自述文件。 例如,在 NodeJS 示例应用程序中,使用以下命令安装所需的包并启动应用程序。

cd mean
npm install
node index.js

应用程序会尝试连接到 MongoDB 源,但连接会失败,因为连接字符串无效。 遵循自述文件中的步骤更新连接字符串 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 中,primary 映射到 WRITE 区域,secondary 映射到 READ 区域。

根据常见的方案,我们建议使用以下设置:

  1. 如果需要“高可用性和低延迟读取”,可以使用“NEAREST”读取首选项模式。 此设置会将读取操作定向到最靠近的可用区域。 请注意,如果最靠近的区域是 WRITE 区域,则这些操作会定向到该区域。
  2. 如果要求“读取操作高度可用且分散到不同的地区” (延迟不是约束条件),则使用“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 API for MongoDB 中,region 标记已默认包含为 isMaster 响应的一部分:

"tags": {
         "region": "China North"
      }

因此,MongoClient 可以结合区域名称使用 region 标记将读取操作定向到特定的区域。 对于 Azure Cosmos DB 帐户,可以 Azure 门户中左侧的“设置”->“全局副本数据”下面找到区域名称。 此设置可用于实现读取隔离 - 可让客户端应用程序将读取操作定向到特定的区域。 此设置非常适合用于在后台运行的,并且不属于生产关键型服务的非生产/分析型方案。

示例应用程序中的以下代码片段演示如何在 NodeJS 中使用标记配置读取首选项:

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

请参阅其他平台(例如 .NETJava)的相应示例应用程序存储库。

本文介绍了如何通过 Azure Cosmos DB 的 API for MongoDB 使用读取首选项在多个区域中分配读取操作。

清理资源

如果不打算继续使用此应用,请删除本文在 Azure 门户中创建的所有资源,步骤如下:

  1. 在 Azure 门户的左侧菜单中,单击“资源组”,然后单击已创建资源的名称。
  2. 在资源组页上单击“删除” ,在文本框中键入要删除的资源的名称,并单击“删除” 。

后续步骤