On this page
配置副本集标记集
在本页面
可以使用tags配置一个或多个副本集成员:
{ "<tag1>": "<string1>", "<tag2>": "<string2>",... }
对于读取操作,您可以在read preferences中指定一个标签集,以帮助将读取操作定向到具有特定标签的成员。
在读取首选项中使用标签集
如果一个或多个副本集成员与tags关联,则可以在read preference中指定一个标记集来定位这些成员。标记集是一组文档,其中每个文档都包含标记和值对。Sequences 尝试这些规格,直到找到匹配项。一旦找到,该规范将用于查找所有符合条件的匹配成员。
Note
指定读取首选项模式primary时,不能指定标签集。
例如,副本集具有以下副本集配置(为简洁起见,某些字段已省略):
{
"_id" : "rs0",
"version" : 1,
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"members" : [
{ "_id" : 0, "host" : "mongodb0.example.net:27017", ..., "tags": { }, ... },
{ "_id" : 1, "host" : "mongodb1.example.net:27017", ..., "tags": { }, ... },
{ "_id" : 2, "host" : "mongodb2.example.net:27017", ..., "tags": { }, ... }
],
"settings" : {
...
}
}
- 为会员添加标签.
将mongo shell 连接到副本集,并使用rs.reconfig()将标记添加到成员:
conf = rs.conf();
conf.members[0].tags = { "dc": "east", "usage": "production" };
conf.members[1].tags = { "dc": "east", "usage": "reporting" };
conf.members[2].tags = { "dc": "west", "usage": "production" };
rs.reconfig(conf);
- 验证副本集配置.
运行rs.conf()以验证副本集配置(为简洁起见,某些字段已省略)。 rs.conf()返回的文档类似于以下内容:
{
"_id" : "rs0",
"version" : 2,
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"members" : [
{
"_id" : 0,
"host" : "mongodb0.example.net:27017",
...
"tags" : {
"dc": "east",
"usage": "production"
},
...
},
{
"_id" : 1,
"host" : "mongodb1.example.net:27017",
...
"tags" : {
"dc": "east",
"usage": "reporting"
},
...
},
{
"_id" : 2,
"host" : "mongodb2.example.net:27017",
...
"tags" : {
"dc": "west",
"usage": "production"
},
...
}
],
"settings" : {
...
}
}
- 在读取首选项中指定标签集.
要将读取操作定向到标记有特定标签的辅助副本,请在连接到副本集的mongo
shell 中,您可以使用readPref()方法来指定读取偏好模式和tag set。例如,
- 要将读取操作定向到标记有*
"dc": "east"
和"usage": "production"
的辅助节点,请包括以下标记集:
db.collection.find({}).readPref( "secondary", [ { "dc": "east", "usage": "production" } ] )
- 要将读取操作定向到标记为
"dc": "east"
的辅助节点,如果找不到,则定向为标记为"usage": "production"
的辅助节点,请包括以下标记集:
db.collection.find({}).readPref( "secondary", [ { "dc": "east"}, { "usage": "production" } ] )
See also
自定义多数据中心写入问题
如果一个或多个副本集成员与tags关联,则可以配置副本集的settings.getLastErrorModes设置来创建自定义写入关注点。
给定一个五个成员的副本集,其中两个数据中心的成员:
设施
VA
标记为dc_va
设施
CA
标记为dc_ca
{
"_id" : "rs0",
"version" : 1,
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"members" : [
{ "_id" : 0, "host" : "mongodb0.example.net:27017", ..., "tags": { }, ... },
{ "_id" : 1, "host" : "mongodb1.example.net:27017", ..., "tags": { }, ... },
{ "_id" : 2, "host" : "mongodb2.example.net:27017", ..., "tags": { }, ... }
{ "_id" : 3, "host" : "mongodb3.example.net:27017", ..., "tags": { }, ... }
{ "_id" : 4, "host" : "mongodb4.example.net:27017", ..., "tags": { }, ... }
],
"settings" : {
...
}
}
- 将标签添加到副本集成员.
将mongo shell 连接到副本集,并使用rs.reconfig()将标记添加到成员:
conf = rs.conf();
conf.members[0].tags = { "dc_va": "rack1"};
conf.members[1].tags = { "dc_va": "rack2"};
conf.members[2].tags = { "dc_ca": "rack1"};
conf.members[3].tags = { "dc_ca": "rack2"};
conf.members[4].tags = { "dc_va": "rack1"};
rs.reconfig(conf);
- 创建自定义写关注点.
在副本集配置中,在settings.getLastErrorModes设置中定义自定义写入关注点。例如,以下内容定义了自定义写入关注点MultipleDC
,该写入关注点MultipleDC
要求该写入传播到具有* 不同* dc_va
标签值的两个成员和一个具有任何dc_ca
标签值的成员。
conf = rs.conf();
conf.settings = { getLastErrorModes: { MultipleDC : { "dc_va": 2, "dc_ca": 1 } } };
rs.reconfig(conf);
Note
如果写入传播到具有相同"dc_va"
标签的两个成员,则不能满足MultipleDC
写入问题。例如,如果写入仅传播到members[0]
和members[4]
,则不能满足"dc_va": 2
,因为它们具有相同的标记值"rack1"
。
- 使用自定义写关注.
要使用自定义写关注点,请将写关注点名称传递给写关注点中的w Option:
db.collection.insert( { id: "xyz", status: "A" }, { writeConcern: { w: "MultipleDC" } } )