Mongodb配置主从模式,进行数据的同步与备份
1. 背景
- 做数据库的人都知道要对数据做备份,避免数据库单点部署,以防止数据遭到毁灭性破坏。
- mongodb提供的Master/slave主从模式,刚好能支持这种双机热备份,还有读写分离,集群部署等。
2. 环境。
- 系统:win7
- MongoDB 3.4.6
3. 配置主从模式
3.1. 模型图
- 目标:就是将Master中的数据,备份到两个slave中。
3.2. 配置Master
- 主数据库的配置非常简单,只需要按照如下命令,在主机 172.16.1.99 上启动mongodb,然后等待slave们的连接…
mongod --dbpath=f:/data --master
- 1
3.3. 配置slave
- 从数据库(slave1: 172.16.7.107)只需要在启动mongodb时,指定角色为slave,以及数据源地址(master的mongodb地址),详细的命令如下:
mongod --dbpath=f:/data --slave --source=172.16.1.99:27017
- 1
- 如果slave连接上了master,数据就会开始自动备份,如下:
-
出现了 sycing和sleep 说明已经从主数据库复制完成了。
-
后面如果有数据写入到master中,slave也会间隔一定的时间进行相应的同步:
3.4. 读取slave数据库
- 在默认情况下,mongodb是不支持从属数据库(slave)的数据读取操作的,这是为了实现读写分离。
- 但是没关系,在驱动中给我们提供了一个叫做“slaveOkay”来让我们可以显示的读取从属数据库,来减轻主数据库的性能压力。需要在从数据库机器的shell模式中执行rs.slaveOk(),官方解释如下:
Provides a shorthand for the following operation:
db.getMongo().setSlaveOk()
This allows the current connection to allow read operations to run on secondary members. See the readPref() method for more fine-grained control over read preference in the mongo shell.
- 1
- 2
- 3
- 4
- 第一步:在slave机器上,键入如下命令 mongo 127.0.0.1:27017,进入MongoDB shell模式
mongo 127.0.0.1:27017
- 1
- 第二步:默认情况下,键入如下命令 show dbs,发现无法查看数据。提示如下error:
show dbs
'''
2018-01-04T15:32:36.389+0800 E QUERY [thread1] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk"
} :
'''
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 第三步:执行命令 rs.slaveOk(),发现就可以看到从数据库上所有的数据了。注意,一定要注意大小写!!!
rs.slaveOk()
show dbs
- 1
- 2
3.5. 关于Mongodb可视化工具MongoBooster
3.5.1. 问题点
-
上面,我们通过 rs.slaveOk() 设置,就可以看到从数据库中的数据了。但是从MongoBooster中,依然无法查看这个数据(暂时不知道如何设置…….欢迎指导)
-
测试时可以连通的。
-
但是连接时,还是会提示如下错误:listDatabases failed:not master and slaveOk=false “code” : 13435
{
"message" : "listDatabases failed:not master and slaveOk=false",
"stack" : "Error: listDatabases failed:not master and slaveOk=false" +
"at _getErrorWithCode (evalmachine.<anonymous>:1359:13)" +
"at Mongo.getDBs (evalmachine.<anonymous>:989:15)" +
"at Mongo.getDBNames (evalmachine.<anonymous>:1042:17)" +
"at evalmachine.<anonymous>:1:15" +
"at ContextifyScript.Script.runInContext (vm.js:37:29)" +
"at Object.exports.runInContext (vm.js:69:17)" +
"at C:\\Users\\Administrator\\AppData\\Local\\mongobooster\\app-3.5.7\\resources\\app.asar\\backend\\mongoHandler.js:549:23" +
"at tryBlock (C:\\Users\\Administrator\\AppData\\Local\\mongobooster\\app-3.5.7\\resources\\app.asar\\node_modules\\asyncawait\\src\\async\\fiberManager.js:39:33)" +
"at runInFiber (C:\\Users\\Administrator\\AppData\\Local\\mongobooster\\app-3.5.7\\resources\\app.asar\\node_modules\\asyncawait\\src\\async\\fiberManager.js:26:9)",
"code" : 13435
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
3.5.2. 思路
- 如果想通过MongoBooster查看slave中的数据,就要首先把从数据库的属性改变,让它的身份不在是slave,让它以一个普通身份,或者master身份启动,就能通过MongoBooster查看数据了……
- 为什么要通过MongoBooster查看数据……当然是为了确认数据的同步情况了,可视化多么直观啊…
# 以普通身份启动mongodb
mongod --dbpath=f:/data
# 以master身份启动mongodb
mongod --dbpath=f:/data --master
- 1
- 2
- 3
- 4
- 5
参考文章:
8天学通MongoDB——第五天 主从复制:https://www.cnblogs.com/huangxincheng/archive/2012/03/04/2379755.html
MongoDB学习九–MongoDB的主从复制:http://blog.csdn.net/done58/article/details/48032471
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zwq912318834/article/details/78971029