配置副本集标签集
可以使用 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" : { ... } }
向节点添加标签。
将
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); 验证副本集配置。
运行
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()
方法指定读取偏好模式和标签集。例如,要将读取操作定向到具有
"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
设置,创建自定义写关注。
给定一个五节点副本集,其节点位于两个数据中心:
设施
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" : { ... } }
向副本集节点添加标签。
将
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); 创建自定义写关注。
在副本集配置中,在
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"
。使用自定义写关注。
要使用自定义写关注,请将写关注名称传递给写关注中的
w
选项:db.collection.insertOne( { id: "xyz", status: "A" }, { writeConcern: { w: "MultipleDC" } } )