配置副本集标签集
副本集成员或成员可以配置为标签
:
{ "<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" } } )