Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

配置副本集标签集

在此页面上

  • 在读取偏好中使用标签集
  • 自定义多数据中心写关注

可以使用 tags 配置一个或多个副本集节点:

{ "<tag1>": "<string1>", "<tag2>": "<string2>",... }

对于读取操作,您可以在读取偏好中指定标签集,以帮助将读取操作定向到具有特定标签的节点。

对于写入操作,您可以使用标签创建自定义写关注

如果一个或多个副本集节点与 tags 相关联,则可以在读取偏好中指定标签集来定位这些节点。标签集是文档数组,其中每个文档都包含标签和值对。按顺序尝试规范,直到找到匹配项。一旦找到,就会使用该规范找到所有符合条件的匹配节点。

注意

在指定读取偏好模式 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" : {
...
}
}
  1. 向节点添加标签。

    mongosh连接到副本集,并使用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);
  2. 验证副本集配置。

    运行 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" : {
    ...
    }
    }
  3. 在读取偏好中指定标签集。

    要将读取操作定向到具有特定标签的从节点,在连接到副本集的 mongo shell 中,可以使用 readPref() 方法指定读取偏好模式标签集。例如,

    • 要将读取操作定向到具有 "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" } ] )

    提示

    另请参阅:

如果一个或多个副本集节点与 tags 相关联,则可以配置副本集的 settings.getLastErrorModes 设置,创建自定义写关注。

给定一个五节点副本集,其节点位于两个数据中心:

  1. 设施 VA 标记为 dc_va

  2. 设施 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" : {
...
}
}
  1. 向副本集节点添加标签。

    mongosh连接到副本集,并使用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);
  2. 创建自定义写关注。

    在副本集配置中,在 settings.getLastErrorModes 设置中定义自定义写关注。例如,以下内容定义自定义写关注 MultipleDC,它要求写入传播到两个具有不同 dc_va 标签值的节点,以及一个具有任何 dc_ca 标签值的节点。

    conf = rs.conf();
    conf.settings = { getLastErrorModes: { MultipleDC : { "dc_va": 2, "dc_ca": 1 } } };
    rs.reconfig(conf);

    注意

    如果写入传播到两个具有相同 "dc_va" 标签的节点,则无法满足 MultipleDC 写关注。例如,如果写入仅传播到 members[0]members[4],则不满足 "dc_va": 2,因为它们具有相同的标签值 "rack1"

  3. 使用自定义写关注。

    要使用自定义写关注,请将写关注名称传递给写关注中的 w 选项

    db.collection.insertOne(
    { id: "xyz", status: "A" },
    { writeConcern: { w: "MultipleDC" } }
    )
← 重新同步副本集成员