配置 MongoDB 副本集标签集

可以为一个或多个副本集成员配置标签:

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

对于读操作,可以在读取偏好中指定标签集,帮助将读取请求定向到具有特定标签的成员。对于写操作,可以利用标签创建自定义写关注。

在读取偏好中使用标签集

如果副本集成员已经关联标签,可以在读取偏好中指定标签集来选择这些成员。标签集是一个文档数组,每个文档包含一个或多个标签和值组成的键值对。各项条件按顺序尝试,直到找到匹配;找到之后,就用该条件寻找所有符合资格的匹配成员。

注意:读取偏好模式为 primary 时,不能指定标签集。

例如,某个副本集具有以下配置。为简洁起见,省略了部分字段:

{
   "_id" : "rs0",
   "version" : 1,
   "protocolVersion" : Long(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() 查看副本集配置。它会返回类似以下的文档,其中省略了部分字段:

{
   "_id" : "rs0",
   "version" : 2,
   "protocolVersion" : Long(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" } ] )

另可参阅 Mongo.setReadPref()。

自定义跨数据中心写关注

如果副本集成员已经关联标签,可以通过副本集的 settings.getLastErrorModes 设置创建自定义写关注。

假设有一个五成员副本集,成员分布在两个数据中心:

  • VA 机房,使用 dc_va 标签。
  • CA 机房,使用 dc_ca 标签。
{
   "_id" : "rs0",
   "version" : 1,
   "protocolVersion" : Long(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", j: true } }
)

原文:Configure Replica Set Tag Sets。作者/维护方:MongoDB 文档维护者。本文为中文翻译,代码及命令保留原文。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容