MongoDB Data Durability
It doesn't seem you can lose data even when you might otherwise expect to ;)
I setup a small replica set using
mongod --fork --logpath a.log --smallfiles --oplogSize 50 --port 27001 --dbpath data/z1 --replSet z
mongod --fork --logpath b.log --smallfiles --oplogSize 50 --port 27002 --dbpath data/z2 --replSet z
mongod --fork --logpath c.log --smallfiles --oplogSize 50 --port 27003 --dbpath data/z3 --replSet z
And initalized it:
> rs.initiate(
{ _id:'z',
members:[
{ _id:1, host:'localhost:27001' },
{ _id:2, host:'localhost:27002' },
{ _id:3, host:'localhost:27003' }
]
}
);
Then I killed all three processes:
kill -9 25542 25496 25483
Next I brought one of them back up
mongod --fork --logpath c.log --smallfiles --oplogSize 50 --port 27003 --dbpath data/z3
and inserted a doc
> db.foo.insert({a:1})
Then I killed that process
kill -9 25885
and brought the replica set back online using
mongod --fork --logpath a.log --smallfiles --oplogSize 50 --port 27001 --dbpath data/z1 --replSet z
mongod --fork --logpath b.log --smallfiles --oplogSize 50 --port 27002 --dbpath data/z2 --replSet z
mongod --fork --logpath c.log --smallfiles --oplogSize 50 --port 27003 --dbpath data/z3 --replSet z
and my data is still there:
> mongo --port 27003
MongoDB shell version: 2.4.6
connecting to: 127.0.0.1:27003/test
z:SECONDARY> db.setSlaveOk()
z:SECONDARY> db.foo.find()
{ "_id" : ObjectId("52eb09f9df67edd1c6d33e71"), "a" : 1 }
z:SECONDARY>
In addition, if I insert data into the primary it seems to be perfectly happy to live right there alongside my existing data on the secondary:
> mongo --port 27001
MongoDB shell version: 2.4.6
connecting to: 127.0.0.1:27001/test
z:PRIMARY> db.foo.insert({b:2})
z:PRIMARY> db.foo.find()
{ "_id" : ObjectId("52eb0cefdf3e83d897ae68ec"), "b" : 2 }
z:PRIMARY>
> mongo --port 27003
MongoDB shell version: 2.4.6
connecting to: 127.0.0.1:27003/test
z:SECONDARY> db.setSlaveOk()
z:SECONDARY> db.foo.find()
{ "_id" : ObjectId("52eb09f9df67edd1c6d33e71"), "a" : 1 }
{ "_id" : ObjectId("52eb0cefdf3e83d897ae68ec"), "b" : 2 }