Implement MongoDB replication in 3 simple steps
After we find out how replication works with MySQL lets look at mongoDB
Use the following steps to implement mongoDB Replication:
1) Create the data directories
2) Create the replication set and instances
3) Configure, primary, secundaries and an arbiter
Donwload MongoDB? Goto the Download site
Step 1) Create the data directories
Start by creating a data directory for each replica set member, one for the primary and one for the secundary. We add also an arbiter. The arbiter does not relpicate data, but choose a new primary in case there is an outage of the existing primary.
mkdir /data/node1 mkdir /data/node2 mkdir /data/arbiter
Step 2) Create the replication set and instances
Next, start each member as a separate mongod. Since you’ll be running each process on the same machine, it’s probably easiest to start each mongod in a separate terminal window:
mongod --replSet person --dbpath /data/node1 --port 40001 mongod --replSet person --dbpath /data/node2 --port 40002 mongod --replSet person --dbpath /data/arbiter --port 40003
Step 3) Configure, primary, secundaries and an arbiter
Logon on the primary node to proceed, you need to configure the replica set, because if you examine the mongod log output, the first thing you’ll notice are error messages saying that the configuration can’t be found.
mongo localhost:40001 MongoDB shell version: 2.2.0 connecting to: localhost:40001/test
> rs.initiate() { "info2" : "no configuration explicitly specified -- making one", "me" : "Computername.local:40001", "info" : "Config now saved locally. Should come online in about a minute.", "ok" : 1 }
Now connect again to the primary node, and add the secondary node including the arbiter node:
person:PRIMARY> rs.add(Computername:40002) { "ok" : 1 } person:PRIMARY> rs.add(Computername:40003, {arbiterOnly:true}) { "ok" : 1 }
Check if the configuration is ok, with rs.status():
person:PRIMARY> rs.status() { "set" : "person", "date" : ISODate("2012-10-28T19:50:52Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "Computername.local:40001", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 1266, "optime" : Timestamp(1351453811000, 1), "optimeDate" : ISODate("2012-10-28T19:50:11Z"), "self" : true }, { "_id" : 1, "name" : "Computername.local:40002", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 41, "optime" : Timestamp(1351453811000, 1), "optimeDate" : ISODate("2012-10-28T19:50:11Z"), "lastHeartbeat" : ISODate("2012-10-28T19:50:51Z"), "pingMs" : 0 } ], "ok" : 1 } { "_id" : 1, "name" : "Computername.local:40003", "health" : 1, "state" : 3, "stateStr" : "ARBITER", "uptime" : 14, "optime" : Timestamp(1351453811000, 1), "optimeDate" : ISODate("2012-10-28T19:50:11Z"), "lastHeartbeat" : ISODate("2012-10-28T19:50:51Z"), "pingMs" : 0 } ], "ok" : 1 }
And now its time to check if it works. We put a person in our primary database:
person:PRIMARY> use portraitGallery switched to db portraitGallery person:PRIMARY> db.person.save( { "name" : "Maikel", "group" : [ "Oracle", "ExaData", "Big Data"], } )
Logon on the secondary and check if the data is there, and don’t forget to enable reading with rs.slaveOk() or db.getMongo().setSlaveOk()
mongo localhost:40002 MongoDB shell version: 2.2.0 connecting to: localhost:40002/test person:SECONDARY> rs.slaveOk() person:SECONDARY> use portraitGallery switched to db portraitGallery person:SECONDARY> db.person.find() { "_id" : ObjectId("508d971dda0730903bcbb612"), "name" : "Maikel", "group" : [ "Oracle", "ExaData", "Big Data" ] }
Now we can test it with a filler script. Type in the primary something like:
person:PRIMARY> for(i=0; i<1000000; i++) { db.person.save({person: i}); }
And in the secondary check if the collection is filled:
person:SECONDARY> db.person.find() { "_id" : ObjectId("508f95e9e38917f43ae20db3"), "person" : 0 } { "_id" : ObjectId("508f95e9e38917f43ae20db4"), "person" : 1 } { "_id" : ObjectId("508f95e9e38917f43ae20db5"), "person" : 2 } { "_id" : ObjectId("508f95e9e38917f43ae20db6"), "person" : 3 } { "_id" : ObjectId("508f95e9e38917f43ae20db7"), "person" : 4 } { "_id" : ObjectId("508f95e9e38917f43ae20db8"), "person" : 5 } { "_id" : ObjectId("508f95e9e38917f43ae20db9"), "person" : 6 } { "_id" : ObjectId("508f95e9e38917f43ae20dba"), "person" : 7 } { "_id" : ObjectId("508f95e9e38917f43ae20dbb"), "person" : 8 } { "_id" : ObjectId("508f95e9e38917f43ae20dbc"), "person" : 9 } { "_id" : ObjectId("508f95e9e38917f43ae20dbd"), "person" : 10 } { "_id" : ObjectId("508f95e9e38917f43ae20dbe"), "person" : 11 } { "_id" : ObjectId("508f95e9e38917f43ae20dbf"), "person" : 12 } { "_id" : ObjectId("508f95e9e38917f43ae20dc0"), "person" : 13 } { "_id" : ObjectId("508f95e9e38917f43ae20dc1"), "person" : 14 } { "_id" : ObjectId("508f95e9e38917f43ae20dc2"), "person" : 15 } { "_id" : ObjectId("508f95e9e38917f43ae20dc3"), "person" : 16 } { "_id" : ObjectId("508f95e9e38917f43ae20dc4"), "person" : 17 } { "_id" : ObjectId("508f95e9e38917f43ae20dc5"), "person" : 18 } { "_id" : ObjectId("508f95e9e38917f43ae20dc6"), "person" : 19 } Type "it" for more person:SECONDARY> db.person.count() 194079 person:SECONDARY> db.person.count() 215657 person:SECONDARY> db.person.count() 228488 person:SECONDARY> db.person.count() 239528 person:SECONDARY>
Works, succes with mongoDB!!!
If you wan to do the mongoDB intro lab goto mongodb.info