After successfully installing and testing mongoDB it’s very easy to create a replication environment.
$ mkdir -p data/{master,slave} $ mongod --dbpath=`pwd`/data/master --master --port 28011 > master.log 2>&1 & # Always check your log file $ cat master.log $ mongod --dbpath=`pwd`/data/slave --slave --source localhost:28011 --port 28022 > slave.log 2>&1 & $ cat slave.log
The options are relatively descriptive and straightforward.
- –dbpath – The directory for data (we set because we are running master/slave on same server)
- –port – Likewise we are running multiple instances on same machine
- –master – I’m the master
- –slave – I’m a slave
- –source – For slaves, tell them were the source (i.e. master is)
What I found under the covers was a difference from the single instance version. There is a series of ‘local’ files for the namespace, where in the single instance version there were ‘test’ files.
$ ls -ltR data total 0 drwxr-xr-x 6 rbradfor staff 204 Jun 10 10:24 slave drwxr-xr-x 5 rbradfor staff 170 Jun 10 10:22 master data/slave: total 163848 drwxr-xr-x 2 rbradfor staff 68 Jun 10 10:24 _tmp -rw------- 1 rbradfor staff 67108864 Jun 10 10:24 local.0 -rw------- 1 rbradfor staff 16777216 Jun 10 10:24 local.ns -rwxr-xr-x 1 rbradfor staff 6 Jun 10 10:24 mongod.lock data/slave/_tmp: data/master: total 163848 -rw------- 1 rbradfor staff 67108864 Jun 10 10:22 local.0 -rw------- 1 rbradfor staff 16777216 Jun 10 10:22 local.ns -rwxr-xr-x 1 rbradfor staff 6 Jun 10 10:22 mongod.lock
A quick replication test.
$ mongo --port 28011 MongoDB shell version: 1.4.3 url: test connecting to: 127.0.0.1:28011/test type "help" for help > db.foo.save({s:"Hello world"}); > db.foo.find(); { "_id" : ObjectId("4c10f7904a30c35548b0af06"), "s" : "Hello world" } > exit bye $ mongo --port 28022 MongoDB shell version: 1.4.3 url: test connecting to: 127.0.0.1:28022/test type "help" for help > db.foo.find(); { "_id" : ObjectId("4c10f7904a30c35548b0af06"), "s" : "Hello world" } > exit
A look now at the underlying data shows a ‘test’ namespace which confirms the lazy instantiation approach. The ‘local’ namespace files are obviously a reflection of the –master/–slave operation.
$ ls -ltR data total 0 drwxr-xr-x 9 rbradfor staff 306 Jun 10 10:32 slave drwxr-xr-x 8 rbradfor staff 272 Jun 10 10:32 master data/slave: total 589832 -rw------- 1 rbradfor staff 134217728 Jun 10 10:33 test.1 drwxr-xr-x 2 rbradfor staff 68 Jun 10 10:32 _tmp -rw------- 1 rbradfor staff 67108864 Jun 10 10:32 test.0 -rw------- 1 rbradfor staff 16777216 Jun 10 10:32 test.ns -rw------- 1 rbradfor staff 67108864 Jun 10 10:24 local.0 -rw------- 1 rbradfor staff 16777216 Jun 10 10:24 local.ns -rwxr-xr-x 1 rbradfor staff 6 Jun 10 10:24 mongod.lock data/master: total 327688 drwxr-xr-x 2 rbradfor staff 68 Jun 10 10:32 _tmp -rw------- 1 rbradfor staff 67108864 Jun 10 10:32 test.0 -rw------- 1 rbradfor staff 16777216 Jun 10 10:32 test.ns -rw------- 1 rbradfor staff 67108864 Jun 10 10:22 local.0 -rw------- 1 rbradfor staff 16777216 Jun 10 10:22 local.ns -rwxr-xr-x 1 rbradfor staff 6 Jun 10 10:22 mongod.lock
By default there appears to be no read-only default state for a slave. I was able to add new data to the slave.
$ mongo --port 28022 MongoDB shell version: 1.4.3 url: test connecting to: 127.0.0.1:28022/test type "help" for help > db.foo.save({s:"Hello New York"}); > db.foo.find(); { "_id" : ObjectId("4c10f7904a30c35548b0af06"), "s" : "Hello world" } { "_id" : ObjectId("4c10f864d8e80f1a1ad305cf"), "s" : "Hello New York" } >
A closer look at this ‘local’ namespace and a check via the docs gives us details of the slave configuration.
$ mongo --port 28022 MongoDB shell version: 1.4.3 url: test connecting to: 127.0.0.1:28022/test type "help" for help > show dbs; admin local test > use local; switched to db local > show collections; oplog.$main pair.sync sources system.indexes > db.sources.find(); { "_id" : ObjectId("4c10f5b633308f7c3d7afc45"), "host" : "localhost:28011", "source" : "main", "syncedTo" : { "t" : 1276180895000, "i" : 1 }, "localLogTs" : { "t" : 1276180898000, "i" : 1 } }
You can also with the mongo client connect directly to a collection via the command line.
$ mongo localhost:28022/local MongoDB shell version: 1.4.3 url: localhost:28022/local connecting to: localhost:28022/local type "help" for help > db.sources.find(); { "_id" : ObjectId("4c10f5b633308f7c3d7afc45"), "host" : "localhost:28011", "source" : "main", "syncedTo" : { "t" : 1276180775000, "i" : 1 }, "localLogTs" : { "t" : 1276180778000, "i" : 1 } } > exit bye
The shell gives 3 convenience commands for showing replication state.
On the Slave
$ mongo --port 28022 > db.getReplicationInfo(); { "logSizeMB" : 50, "timeDiff" : 1444, "timeDiffHours" : 0.4, "tFirst" : "Thu Jun 10 2010 10:24:54 GMT-0400 (EDT)", "tLast" : "Thu Jun 10 2010 10:48:58 GMT-0400 (EDT)", "now" : "Thu Jun 10 2010 10:48:59 GMT-0400 (EDT)" } > db.printReplicationInfo(); configured oplog size: 50MB log length start to end: 1444secs (0.4hrs) oplog first event time: Thu Jun 10 2010 10:24:54 GMT-0400 (EDT) oplog last event time: Thu Jun 10 2010 10:48:58 GMT-0400 (EDT) now: Thu Jun 10 2010 10:49:07 GMT-0400 (EDT) > db.printSlaveReplicationInfo(); source: localhost:28011 syncedTo: Thu Jun 10 2010 10:49:25 GMT-0400 (EDT) = 1secs ago (0hrs)
On the master, the same commands are applicable, output basically the same.
$ mongo --port 28011 > db.getReplicationInfo(); { "logSizeMB" : 50, "timeDiff" : 1714, "timeDiffHours" : 0.48, "tFirst" : "Thu Jun 10 2010 10:22:01 GMT-0400 (EDT)", "tLast" : "Thu Jun 10 2010 10:50:35 GMT-0400 (EDT)", "now" : "Thu Jun 10 2010 10:50:40 GMT-0400 (EDT)" } > db.printReplicationInfo(); configured oplog size: 50MB log length start to end: 1714secs (0.48hrs) oplog first event time: Thu Jun 10 2010 10:22:01 GMT-0400 (EDT) oplog last event time: Thu Jun 10 2010 10:50:35 GMT-0400 (EDT) now: Thu Jun 10 2010 10:50:45 GMT-0400 (EDT) > db.printSlaveReplicationInfo(); local.sources is empty; is this db a --slave? >
From these commands there seems no obvious way to easily identify if an instance is a master or not.
References
DBA operations from shell
Replication
Master/Slave Replication