如何使用 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
切换到工作目录。
运行以下命令克隆示例存储库。 根据所需的平台,使用以下示例存储库之一:
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 协议提供以下读取首选项模式供客户端使用:
- PRIMARY
- PRIMARY_PREFERRED
- SECONDARY
- SECONDARY_PREFERRED
- NEAREST
请参阅详细的 MongoDB 读取首选项行为文档,详细了解其中每种读取首选项模式的行为。 在 Azure Cosmos DB 中,primary 映射到 WRITE 区域,secondary 映射到 READ 区域。
根据常见的方案,我们建议使用以下设置:
- 如果需要“高可用性和低延迟读取”,可以使用“NEAREST”读取首选项模式。 此设置会将读取操作定向到最靠近的可用区域。 请注意,如果最靠近的区域是 WRITE 区域,则这些操作会定向到该区域。
- 如果要求“读取操作高度可用且分散到不同的地区” (延迟不是约束条件),则使用“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();
});
请参阅其他平台(例如 .NET 和 Java)的相应示例应用程序存储库。
使用标记读取
除了读取首选项模式以外,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!");
});
请参阅其他平台(例如 .NET 和 Java)的相应示例应用程序存储库。
本文介绍了如何通过 Azure Cosmos DB 的 API for MongoDB 使用读取首选项在多个区域中分配读取操作。
清理资源
如果不打算继续使用此应用,请删除本文在 Azure 门户中创建的所有资源,步骤如下:
- 在 Azure 门户的左侧菜单中,单击“资源组”,然后单击已创建资源的名称。
- 在资源组页上单击“删除” ,在文本框中键入要删除的资源的名称,并单击“删除” 。