欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-13 08:15:57
...

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