<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=Replication_in_MongoDB</id>
	<title>Replication in MongoDB - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=Replication_in_MongoDB"/>
	<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Replication_in_MongoDB&amp;action=history"/>
	<updated>2026-06-02T21:24:15Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://training-course-material.com/index.php?title=Replication_in_MongoDB&amp;diff=29106&amp;oldid=prev</id>
		<title>Kbaran at 18:01, 7 February 2016</title>
		<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Replication_in_MongoDB&amp;diff=29106&amp;oldid=prev"/>
		<updated>2016-02-07T18:01:08Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:MongoDB]]&lt;br /&gt;
&lt;br /&gt;
== Replication ==&lt;br /&gt;
* what will happen when standalone server crashes?&lt;br /&gt;
* replication is a way of keeping identical server copies&lt;br /&gt;
* recommended for all production deployments&lt;br /&gt;
* replication is a set of one primary server and many secondaries&lt;br /&gt;
* replication in MongoDB is asynchronous&lt;br /&gt;
* primary server handles client requests&lt;br /&gt;
* when primary crashes secondaries will elect new primary&lt;br /&gt;
* primary (master), secondary (slave)&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Setup ===&lt;br /&gt;
* this is the way to start 3 servers on ports 31000, 31001, 31002&lt;br /&gt;
** or on ports 20000, 20001, 20002 starting from MongoDB 3.2&lt;br /&gt;
* databases are stored in default directory (/data/db)&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$ mongo --nodb&lt;br /&gt;
&amp;gt; replicaSet = new ReplSetTest({&amp;quot;nodes&amp;quot; : 3})&lt;br /&gt;
&amp;gt; replicaSet.startSet()&lt;br /&gt;
&amp;gt; replicaSet.initiate()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$ mongo --nodb&lt;br /&gt;
&amp;gt; conn0 = new Mongo(&amp;quot;localhost:31000&amp;quot;)&lt;br /&gt;
&amp;gt; db0 = conn0.getDB(&amp;quot;test&amp;quot;)&lt;br /&gt;
&amp;gt; db0.isMaster()&lt;br /&gt;
&amp;gt; for (i=0; i&amp;lt;100; i++) { db0.repl.insert({&amp;quot;x&amp;quot; : i}) }&lt;br /&gt;
&amp;gt; db0.repl.count()&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; conn1 = new Mongo(&amp;quot;localhost:31001&amp;quot;)&lt;br /&gt;
&amp;gt; db1 = conn1.getDB(&amp;quot;test&amp;quot;)&lt;br /&gt;
&amp;gt; db1.repl.count()&lt;br /&gt;
&amp;gt; db1.setSlaveOk()&lt;br /&gt;
&amp;gt; db1.repl.count()&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; db0.adminCommand({&amp;quot;shutdown&amp;quot; : 1})&lt;br /&gt;
&amp;gt; db1.isMaster()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Production-Like Setup===&lt;br /&gt;
* this example show how to start replica with 3 members&lt;br /&gt;
* it is on the same server but easily can be changed to multiple machines&lt;br /&gt;
* only one server (localhost:27100) may contain data&lt;br /&gt;
* replica set name can be any utf-8 string (np_rep in this example)&lt;br /&gt;
* use &amp;#039;&amp;#039;&amp;#039;--replSet np_rep&amp;#039;&amp;#039;&amp;#039; when starting mongod&lt;br /&gt;
* each member of the replica set must be able to connect with all members&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ mongod --port 27100 --replSet np_rep --dbpath /data/np_rep/rep0 --logpath /data/np_rep/rep0.log --fork --bind_ip 127.0.0.1 --rest --httpinterface --logappend&lt;br /&gt;
$ mongod --port 27101 --replSet np_rep --dbpath /data/np_rep/rep1 --logpath /data/np_rep/rep1.log --fork ...&lt;br /&gt;
$ mongod --port 27102 --replSet np_rep --dbpath /data/np_rep/rep2 --logpath /data/np_rep/rep2.log --fork ...&lt;br /&gt;
$&lt;br /&gt;
$ mongod --shutdown --dbpath /data/np_rep/rep0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Mongo Shell is the only way to configure replica set&lt;br /&gt;
* prepare configuration document (np_rep_config)&lt;br /&gt;
** _id key is your replica set name&lt;br /&gt;
** members is a list of all servers in replica set&lt;br /&gt;
* send configuration to server with data&lt;br /&gt;
* this server will change configuration of other members&lt;br /&gt;
* servers will elect primary and start handling clients requests&lt;br /&gt;
* localhost as a server name can be used only for testing&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; np_rep_config = { &lt;br /&gt;
...   &amp;quot;_id&amp;quot; : &amp;quot;np_rep&amp;quot;,&lt;br /&gt;
...   &amp;quot;members&amp;quot; : [&lt;br /&gt;
...     {&amp;quot;_id&amp;quot; : 0, &amp;quot;host&amp;quot; : &amp;quot;localhost:27100&amp;quot;},&lt;br /&gt;
...     {&amp;quot;_id&amp;quot; : 1, &amp;quot;host&amp;quot; : &amp;quot;localhost:27101&amp;quot;},&lt;br /&gt;
...     {&amp;quot;_id&amp;quot; : 2, &amp;quot;host&amp;quot; : &amp;quot;localhost:27102&amp;quot;}&lt;br /&gt;
...   ]&lt;br /&gt;
... }&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; rs.initiate(np_rep_config)&lt;br /&gt;
&amp;gt; db = (new Mongo(&amp;quot;localhost:27102&amp;quot;)).getDB(&amp;quot;test&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== rs Helper ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;rs&amp;#039;&amp;#039;&amp;#039; is a global variable containing replication helper functions&lt;br /&gt;
* rs.help() - list of all functions&lt;br /&gt;
* rs.initiate(np_rep_config) is a wrapper to adminCommand&lt;br /&gt;
** db.adminCommand({&amp;quot;replSetInitiate&amp;quot; : np_rep_config})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; rs.help()&lt;br /&gt;
&amp;gt; rs.add(&amp;quot;localhost:27103&amp;quot;)&lt;br /&gt;
&amp;gt; rs.remove(&amp;quot;localhost:27103&amp;quot;)&lt;br /&gt;
&amp;gt; rs.config()&lt;br /&gt;
&amp;gt; np_rep_config = rs.config()&lt;br /&gt;
&amp;gt; edit np_rep_config &lt;br /&gt;
&amp;gt; rs.reconfig(np_rep_config)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== All About Majorities ===&lt;br /&gt;
* how to design replica set?&lt;br /&gt;
* majority = more than half of all members in the set&lt;br /&gt;
* majority is based on configuration not on the current status of replica&lt;br /&gt;
** i.e. 5 members replica, 3 members are down&lt;br /&gt;
** two remaining members can not reach majority&lt;br /&gt;
** if one of two was primary it would step down&lt;br /&gt;
** all two members will be secondaries&lt;br /&gt;
* why two of five can not reach majority?&lt;br /&gt;
* examples: 3+2 members, 2+2+1 members, only 2 members&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== How Election Works ===&lt;br /&gt;
* election starts when secondary can not reach primary&lt;br /&gt;
* it will contact all other members and request that it be primary&lt;br /&gt;
* others do several checks:&lt;br /&gt;
** can they reach primary?&lt;br /&gt;
** is candidate up to date with replication?&lt;br /&gt;
** is there any member with higher priority?&lt;br /&gt;
* election ends when candidate receives &amp;quot;yes&amp;quot; from a majority&lt;br /&gt;
* members can send veto (10000 votes)&lt;br /&gt;
* heartbeat is sent every 2 seconds with 10 seconds time-out to all members&lt;br /&gt;
** based on this, the primary knows if it can reach a majority&lt;br /&gt;
** when election results in a tie all members will wait 30 seconds&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Member Configuration ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;arbiter&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** normal mongod process started with --replSet option and empty data directory&lt;br /&gt;
** &amp;gt; rs.addArb(&amp;quot;server:port&amp;quot;)&lt;br /&gt;
** &amp;gt; rs.add({&amp;quot;_id&amp;quot; : 7, &amp;quot;host&amp;quot; : &amp;quot;server:port&amp;quot;, &amp;quot;arbiterOnly&amp;quot; : true})&lt;br /&gt;
** use at most one arbiter, don&amp;#039;t add arbiters &amp;quot;just in case&amp;quot;&lt;br /&gt;
** arbiter once added can&amp;#039;t be changed to normal mongod, and vice versa&lt;br /&gt;
** use normal data member instead of an arbiter whenever possible&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;priority&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** priority range is from 0 to 100 (default 1)&lt;br /&gt;
** it means how badly this member wants to become primary&lt;br /&gt;
** member with priority 0 can never become primary (passive members)&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;hidden&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** hidden members don&amp;#039;t handle client requests&lt;br /&gt;
** hidden members are not preferred as replication sources&lt;br /&gt;
** useful for backup or less powerful machines&lt;br /&gt;
** use hidden : true with priority : 0&lt;br /&gt;
** rs.isMaster(), rs.status(), rs.config()&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;slave delay&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** delayed secondary will purposely lag by the specified number of second&lt;br /&gt;
** use slaveDelay : seconds with priority : 0&lt;br /&gt;
** ... and hidden : true if your clients reads from secondaries&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;building indexes&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** useful for backup servers&lt;br /&gt;
** prevents from building any indexes&lt;br /&gt;
** use buildIndexes : false with priority : 0&lt;br /&gt;
** non-index-building member can&amp;#039;t be changed to normal easily&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sync Process ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;oplog&amp;#039;&amp;#039;&amp;#039; contains all operations that primary performs&lt;br /&gt;
* capped collection in local database on each member&lt;br /&gt;
* any member can be used as a source for replication&lt;br /&gt;
* steps: read data from primary -&amp;gt; apply operation to data -&amp;gt; write to local oplog&lt;br /&gt;
* re applying the same oplog operation is safe and handled properly (the same result)&lt;br /&gt;
* oplog is fixed in size not in time&lt;br /&gt;
** usually one operation on data results in one operation in oplog&lt;br /&gt;
** exception: one operation that affects multiple documents is stored in oplog as many operations on single document&lt;br /&gt;
* secondary may go stale when: secondary had downtime, has too many writes than it can handle, to busy handling reads&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Initial Sync Process ===&lt;br /&gt;
# initial checks (choose a source, drop existing databases)&lt;br /&gt;
# cloning data from source (longest operation)&lt;br /&gt;
# first oplog application&lt;br /&gt;
# second oplog application&lt;br /&gt;
# index building (long operation)&lt;br /&gt;
# third oplog application&lt;br /&gt;
# switching to normal syncing and normal operations&lt;br /&gt;
* restoring from backup is often faster&lt;br /&gt;
* cloning may ruin source&amp;#039;s working set&lt;br /&gt;
* initial sync may fail if oplog is too short&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== States of Replica Set Members ===&lt;br /&gt;
# Primary&lt;br /&gt;
# Secondary&lt;br /&gt;
# Startup (when you start a member for the first time)&lt;br /&gt;
# Startup2 (initial sync, short state on normal members: starts replication and election process)&lt;br /&gt;
# Recovering (failure state, member is operating correctly but not available for reads, occurs in many situations)&lt;br /&gt;
# Arbiter&lt;br /&gt;
# Down (when member was up and then becomes unreachable)&lt;br /&gt;
# Unknown (when member has never been able to reach another member)&lt;br /&gt;
# Removed (after removing from replica set, when added back it will return into &amp;quot;normal&amp;quot; state)&lt;br /&gt;
# Rollback (when rolling back data)&lt;br /&gt;
# Fatal (find a reason in log, grep &amp;quot;replSet FATAL&amp;quot;, restore from backup or resync)&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rollbacks ===&lt;br /&gt;
# what is rollback and when it will be performed&lt;br /&gt;
# synchronization must be done manually&lt;br /&gt;
#* collectionName.bson file in a rollback directory in data directory&lt;br /&gt;
#* mongorestore above file into temporary collection and perform manual merge&lt;br /&gt;
# rollback will fail if there is more than 300MB of data or about 30 minutes of operations to rollback&lt;br /&gt;
# how to prevent rollbacks&lt;br /&gt;
#* do not change number of votes of replica set members&lt;br /&gt;
#* keep secondaries up to date&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Connection to Replica Set and Replication Guarantees ===&lt;br /&gt;
* connection strings: mongodb://user_name:password@host1:27017,host2:27018,host3:27019/?replicaSet=replicaName&amp;amp;connectTimeoutMS=10000&amp;amp;authMechanism=SCRAM-SHA-1&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.runCommand({getLastError: 1, w: &amp;quot;majority&amp;quot;})&lt;br /&gt;
&amp;gt; db.testColl.insert({a: 1}, {writeConcern: {w: &amp;quot;majority&amp;quot;}})&lt;br /&gt;
&amp;gt; db.testColl.insert({a: 1}, {writeConcern: {w: &amp;quot;majority&amp;quot;, wtimeout: 5000}})&lt;br /&gt;
&amp;gt; db.testColl.insert({a: 1}, {writeConcern: {w: 3, wtimeout: 5000}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; config = rs.conf()&lt;br /&gt;
&amp;gt; config.settings = {}&lt;br /&gt;
&amp;gt; config.settings.getLastErrorDefaults = {w: &amp;quot;majority&amp;quot;, wtimeout: 5000}&lt;br /&gt;
&amp;gt; rs.reconfig(config)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; config = rs.config()&lt;br /&gt;
&amp;gt; config.members[0].tags = {&amp;quot;dc&amp;quot;: &amp;quot;PL&amp;quot;}&lt;br /&gt;
&amp;gt; config.members[1].tags = {&amp;quot;dc&amp;quot;: &amp;quot;UK&amp;quot;}&lt;br /&gt;
&amp;gt; config.settings = config.settings || {}&lt;br /&gt;
&amp;gt; config.settings.getLastErrorModes = [{&amp;quot;allDataCenters&amp;quot; : {&amp;quot;dc&amp;quot;: 2}}]&lt;br /&gt;
&amp;gt; rs.reconfig(config)&lt;br /&gt;
&amp;gt; db.testColl.insert({a: 1}, {writeConcern: {w: &amp;quot;allDataCenters&amp;quot;, wtimeout: 5000}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Read Preference ===&lt;br /&gt;
* read preference describes how MongoDB clients route read operations to the members of a replica set&lt;br /&gt;
* read preference modes:&lt;br /&gt;
** primary - default mode&lt;br /&gt;
** primaryPreferred&lt;br /&gt;
** secondary&lt;br /&gt;
** secondaryPreferred&lt;br /&gt;
** nearest&lt;br /&gt;
* tag sets&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Administration of Replica Set ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run as Standalone ===&lt;br /&gt;
* many operation can not be done on secondaries&lt;br /&gt;
*# stop the secondary&lt;br /&gt;
*# run mongod without --replSet, on different port, with the same --dbpath&lt;br /&gt;
 $ mongod --port 27999 --dbpath /var/lib/mongodb&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Large Replica Sets ===&lt;br /&gt;
* replica sets are limited to 50 members (12 before version 3.0) and only 7 voting members&lt;br /&gt;
* this is limited to reduce network traffic generated by heartbeat&lt;br /&gt;
* use Master-Slave configuration when more than 50 secondaries is needed&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; rs.add({&amp;quot;_id&amp;quot; : 51, &amp;quot;host&amp;quot; : &amp;quot;server-8:27017&amp;quot;, &amp;quot;votes&amp;quot; : 0})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Forcing Reconfiguration ===&lt;br /&gt;
* useful when you majority is lost permanantly&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;force&amp;#039;&amp;#039;&amp;#039; allows you to send the configuration to secondary (not only to primary)&lt;br /&gt;
* configuration needs to be prepared correctly&lt;br /&gt;
* force will change version dramatically&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; var config = rs.config()&lt;br /&gt;
&amp;gt; edit config&lt;br /&gt;
&amp;gt; rs.reconfig(config, {&amp;quot;force&amp;quot; : true})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Changing Member Status Manually ===&lt;br /&gt;
* there is no way to force member to become primary&lt;br /&gt;
* demote primary to a secondary (by default 60 seconds)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; rs.stepDown()&lt;br /&gt;
&amp;gt; rs.stepDown(600)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Preventing Elections ===&lt;br /&gt;
* in can be also used on demoted primary to unfreeze it&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; rs.freeze(600)&lt;br /&gt;
&amp;gt; rs.freeze(0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Maintenance Mode ===&lt;br /&gt;
* server will go into &amp;#039;&amp;#039;&amp;#039;recovery&amp;#039;&amp;#039;&amp;#039; state&lt;br /&gt;
* useful if server is performing long operations or is far behind in replication&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.adminCommand({&amp;quot;replSetMaintenanceMode&amp;quot; : true})&lt;br /&gt;
&amp;gt; db.adminCommand({&amp;quot;replSetMaintenanceMode&amp;quot; : false})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Monitoring Replication ===&lt;br /&gt;
* status of the replica set (from the current server perspective)&lt;br /&gt;
* db.adminCommand(&amp;quot;replSetGetStatus&amp;quot;) or rs.status()&lt;br /&gt;
* important fields: self, stateStr, uptime [s], optimeDate (last oplog operation), pingMs, errmsg&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; rs.status()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Replication Source ===&lt;br /&gt;
* rs.status() can be used to create the replication graph&lt;br /&gt;
* replication source is determined by ping (smallest)&lt;br /&gt;
* it can cause chains creation in replication&lt;br /&gt;
* replication loops: s1 from s2, s2 from s3, s3 from s1&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.adminCommand({&amp;quot;replSetSyncFrom&amp;quot; : server:27017})&lt;br /&gt;
&amp;gt; var config = rs.config()&lt;br /&gt;
&amp;gt; config.settings = config.settings || {}&lt;br /&gt;
&amp;gt; config.settings.chainingAllowed = false&lt;br /&gt;
&amp;gt; rs.reconfig(config)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resizing the Oplog ===&lt;br /&gt;
* long oplog gives you time for maintenance&lt;br /&gt;
* oplog on primary should be at least few days or even weeks long&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.printReplicationInfo()&lt;br /&gt;
&amp;gt; db.printSlaveReplicationInfo()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;procedure to resize the oplog&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* demote primary into secondary&lt;br /&gt;
* shut down and restart as standalone&lt;br /&gt;
* copy the last insert from the oplog into temporary collection&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; use local&lt;br /&gt;
&amp;gt; var cursor = db.oplog.rs.find({&amp;quot;op&amp;quot; : &amp;quot;i&amp;quot;})&lt;br /&gt;
&amp;gt; var lastInsert = cursor.sort({&amp;quot;$natural&amp;quot; : -1}).limit(1).next()&lt;br /&gt;
&amp;gt; db.tmpLastOp.save(lastInsert)&lt;br /&gt;
&amp;gt; db.tmpLastOp.findOne()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* drop current oplog&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.oplog.rs.drop()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* create new oplog with different size&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.createCollection(&amp;quot;oplog.rs&amp;quot;, {&amp;quot;capped&amp;quot; : true, &amp;quot;size&amp;quot; : 10000000})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* move last operation from temporary collection into new oplog&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; var lastInsert = db.tmpLastOp.findOne()&lt;br /&gt;
&amp;gt; db.oplog.rs.insert(lastInsert)&lt;br /&gt;
&amp;gt; db.oplog.rs.findOne()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* shut down standalone server and restart as replica set member&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Other operations ===&lt;br /&gt;
* restoring data from delayed secondary&lt;br /&gt;
* building indexes&lt;br /&gt;
* replication on cheap machines: priority:0, hidden:true, buildIndexes:false, votes:0&lt;br /&gt;
* master - slave configuration and mimicking this behaviour when using replica set&lt;br /&gt;
* calculating lag: local.slaves, local.me, local.slaves.drop()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kbaran</name></author>
	</entry>
</feed>