Configure Replica Set Tag Sets
A replica set member or members can be configured with tags
:
{ "<tag1>": "<string1>", "<tag2>": "<string2>",... }
For read operations, you can specify a tag set in the read preferences to help direct read operations to members that have specific tag(s).
For write operations, you can use the tags to create a custom write concern.
Use Tag Sets in Read Preference
If a replica set member or members are associated with tags
, you can specify a tag set in the read preference to target those members. A tag set is an array of documents, where each document contains the tag and value pair(s). The specifications are tried in order until a match is found. Once found, that specification is used to find all eligible matching members.
Note
You cannot specify a tag set when specifying read preference mode primary
.
For example, a replica set has the following replica set configuration (some of the fields have been omitted for brevity):
{ "_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" : { ... } }
-
Add tags to the members.
Connect
mongosh
to the replica set and users.reconfig()
to add tags to the members: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);
-
Verify the replica set configuration.
Run
rs.conf()
to verify the replica set configuration (some of the fields have been omitted for brevity). Thers.conf()
returns a document similar to the following:{ "_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" : { ... } }
-
Specify tag sets in the read preference.
To direct read operations to the secondaries tagged with a particular tag(s), in the
mongo
shell connected to the replica set, you can use thereadPref()
method to specify the read preference mode and the tag set. For example,-
To direct read operations to the secondary tagged with both
"dc": "east"
and"usage": "production"
, include the following tag set:db.collection.find({}).readPref( "secondary", [ { "dc": "east", "usage": "production" } ] )
-
To direct a read operation to the secondaries tagged with
"dc": "east"
, and if not found, to secondaries tagged with"usage": "production"
, include the following tag set:db.collection.find({}).readPref( "secondary", [ { "dc": "east"}, { "usage": "production" } ] )
Tip
See also:
-
Custom Multi-Datacenter Write Concerns
If a replica set member or members are associated with tags
, you can configure the replica set's settings.getLastErrorModes
setting to create a custom write concern.
Given a five member replica set with members in two data centers:
-
a facility
VA
taggeddc_va
-
a facility
CA
taggeddc_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" : { ... } }
-
Add tags to the replica set members.
Connect
mongosh
to the replica set and users.reconfig()
to add tags to the members: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);
-
Create a custom write concern.
In the replica set configuration, define a custom write concern in the
settings.getLastErrorModes
setting. For example, the following defines the custom write concernMultipleDC
that requires the write to propagate to two members with differentdc_va
tag values and one member with anydc_ca
tag value.conf = rs.conf(); conf.settings = { getLastErrorModes: { MultipleDC : { "dc_va": 2, "dc_ca": 1 } } }; rs.reconfig(conf);
Note
The
MultipleDC
write concern is not satisfied if the write propagates to two members with the same"dc_va"
tag. For example, if the write has only propagated tomembers[0]
andmembers[4]
,"dc_va": 2
is not satisfied since they have the same tag value"rack1"
. -
Use the custom write concern.
To use the custom write concern, pass in the write concern name to the
w
Option in the write concern:db.collection.insertOne( { id: "xyz", status: "A" }, { writeConcern: { w: "MultipleDC" } } )