学习MongoDB(四)——Master/Slave模式

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数据库进行查询操作。 

猜你喜欢

转载自tonl.iteye.com/blog/1688662