-
Notifications
You must be signed in to change notification settings - Fork 1.7k
/
configure-replica-set-tag-sets.txt
244 lines (185 loc) · 7.62 KB
/
configure-replica-set-tag-sets.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
.. index:: replica set; tag sets
.. index:: read preference; tag sets
.. index:: tag sets; configuration
.. _replica-set-configuration-tag-sets:
==============================
Configure Replica Set Tag Sets
==============================
.. default-domain:: mongodb
.. contents:: On this page
:local:
:backlinks: none
:depth: 1
:class: singlecol
A replica set member or members can be configured with
:rsconf:`~members[n].tags`:
.. code-block:: javascript
:copyable: false
{ "<tag1>": "<string1>", "<tag2>": "<string2>",... }
For read operations, you can specify a tag set in the :ref:`read
preferences <replica-set-read-preference>` to help direct read
operations to members that have specific tag(s).
For write operations, you can use the tags to create a custom
:ref:`write concern <write-concern>`.
.. _configure-read-pref-tags:
Use Tag Sets in Read Preference
-------------------------------
If a replica set member or members are associated with
:rsconf:`~members[n].tags`, you can specify a tag set in the :doc:`read
preference </reference/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
:readmode:`primary`.
For example, a replica set has the following :ref:`replica set
configuration <replica-set-configuration-document>` (some of the fields
have been omitted for brevity):
.. code-block:: javascript
{
"_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 a :binary:`~bin.mongo` shell to the replica set and use
:method:`rs.reconfig()` to add tags to the members:
.. code-block:: javascript
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 :method:`rs.conf()` to verify the replica set configuration
(some of the fields have been omitted for brevity). The
:method:`rs.conf()` returns a document similar to the following:
.. code-block:: javascript
{
"_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 :binary:`~mongo` shell connected to the replica set,
you can use the :method:`~cursor.readPref()` method to specify the
:ref:`read preference mode <read-pref-modes-summary>` and the :ref:`tag
set <replica-set-read-preference-tag-sets>`. For example,
- To direct read operations to the secondary tagged with *both*
``"dc": "east"`` and ``"usage": "production"``, include the
following tag set:
.. code-block:: javascript
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:
.. code-block:: javascript
db.collection.find({}).readPref( "secondary", [ { "dc": "east"}, { "usage": "production" } ] )
.. seealso:: :method:`Mongo.setReadPref()`
.. _configure-custom-write-concern:
Custom Multi-Datacenter Write Concerns
--------------------------------------
If a replica set member or members are associated with
:rsconf:`~members[n].tags`, you can configure the replica set's
:rsconf:`settings.getLastErrorModes` setting to create a custom write
concern.
Given a five member replica set with members in two data centers:
1. a facility ``VA`` tagged ``dc_va``
2. a facility ``CA`` tagged ``dc_ca``
.. code-block:: javascript
{
"_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 a :binary:`~bin.mongo` shell to the replica set and use
:method:`rs.reconfig()` to add tags to the members:
.. code-block:: javascript
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 :rsconf:`settings.getLastErrorModes` setting. For example, the
following defines the custom write concern ``MultipleDC`` that
requires the write to propagate to two members with *different*
``dc_va`` tag values and one member with any ``dc_ca`` tag value.
.. code-block:: javascript
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 to ``members[0]`` and
``members[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 :ref:`wc-w` in the write concern:
.. code-block:: javascript
db.collection.insert( { id: "xyz", status: "A" }, { writeConcern: { w: "MultipleDC" } } )