Master和Slave数据库做到数据同步,在Master节点上能进行任何数据操作,而Slave节点只能读取从Master节点同步的数据,不能进行数据插入等操作。
官方的配置说明:http://www.mongodb.org/display/DOCS/Master+Slave
测试环境:两台机器,192.168.1.193和192.168.1.192,两太电脑都是Mac系统。192.168.1.193上的MongoDB作为Master,192.168.1.192作为Slave。
Master机器上启动数据库:
mongod --dbpath=/mongodata/masterdb --master --oplogSize 64 --port 5566
--master:以master模式启动数据库。
--oplogSize:指定master上用于存放更改的数据量,如果不指定,在32位机上最少为50M,在64位机上最少为 1G,最大为磁盘空间的5%。
Slave机器上启动数据库:
mongod --slave --source 192.168.1.193:5566 --dbpath=/mongodata/slavedb --port 5567 --slavedelay 10 --only test --autoresync
--slave:以从服务器方式启动
--autoresync:自动重新sync,因为该操作会copy 主服务器上的所有document,比较耗时,在10分钟内最多只会进行一次。
--source:主服务器地址
--only:仅限于同步指定数据库(下面示例为test库)
--slavedelay:同步延时,复制检测的间隔
登陆Master数据库:
mongo 192.168.1.193:5566 > use test > db.col.save({a:'another',b:'yst'}) > db.col.find() { "_id" : ObjectId("5066b52ecd2a0101aca559f8"), "a" : "another", "b" : "yst" }
登陆Slave数据库:
mongo 192.168.1.192:5567 > use test > db.col.save({a:'bu',b:'yst2'}) not master > db.col.find() { "_id" : ObjectId("5066b52ecd2a0101aca559f8"), "a" : "another", "b" : "yst" }
在Slave只能进行数据读取,save时会提示not master 。可以看到,在Master上save的数据,在slave中可以查询到了。
再来看看用安全认证模式启动Master和Slave的情况:
启动数据库时添加--auth参数就可以了。Master机器:
mongod --dbpath=/mongodata/masterdb --master --oplogSize 64 --port 5566 --auth
Slave机器:
mongod --slave --source 192.168.1.193:5566 --dbpath=/mongodata/slavedb --port 5567 --slavedelay 10 --only test --autoresync --auth
怎么添加用户呢,官方文档里面已经说的很清除了,向Master和Slave的local数据库中都添加一样的用户
Master机器:
mongo 192.168.1.193:5566/admin -u masteradmin -p masterpwd > use local > db.addUser("repl","123456")
Slave机器:
mongo 192.168.1.192:5567/admin -u slaveadmin -p slavepwd > use local > db.addUser("repl","123456")
好了,Master和Slave添加完用户之后,都已授权的安全模式启动数据库,"repl“这个用户登陆Master就像amdin用户一样,能进行各种操作了。"repl”登陆Slave同样不能进行任何更改数据的操作,只能读取。
登陆Master:
mongo 192.168.1.193:5566/local -u repl -p 123456 > use test switched to db test > db.foo.find() { "_id" : ObjectId("5066b52ecd2a0101aca559f8"), "a" : "another", "b" : "yst" } > db.foo.save({a:'you',b:'va2'}) > use newdb switched to db newdb > db.food.save({y:'kk'}) > db.food.remove() > db.food.find()
"repl”和admin用户差不多,不仅对test数据库操作,还能操作其他不是和Slave共享的数据库。
登陆Slave:
mongo 192.168.1.192:5567/local -u repl -p 123456 > use test switched to db test > db.foo.find() { "_id" : ObjectId("5066b52ecd2a0101aca559f8"), "a" : "another", "b" : "yst" } { "_id" : ObjectId("5066ce3c297ef262708bdf4d"), "a" : "you", "b" : "va2" } > db.foo.save({a:'houhou',b:'us'}) not master
repl登陆Slave只能对test数据库进行查询操作。