Mongodb配置主从模式,进行数据的同步与备份

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

这里写图片描述

这里写图片描述

3.3. 配置slave

  • 从数据库(slave1: 172.16.7.107)只需要在启动mongodb时,指定角色为slave,以及数据源地址(master的mongodb地址),详细的命令如下:
mongod --dbpath=f:/data --slave --source=172.16.1.99:27017

这里写图片描述

  • 如果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.
  • 第一步:在slave机器上,键入如下命令 mongo 127.0.0.1:27017,进入MongoDB shell模式
mongo 127.0.0.1:27017

这里写图片描述

  • 第二步:默认情况下,键入如下命令 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" } : '''

这里写图片描述

  • 第三步:执行命令 rs.slaveOk(),发现就可以看到从数据库上所有的数据了。注意,一定要注意大小写!!!
rs.slaveOk()
show dbs

这里写图片描述

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
}

3.5.2. 思路

  • 如果想通过MongoBooster查看slave中的数据,就要首先把从数据库的属性改变,让它的身份不在是slave,让它以一个普通身份,或者master身份启动,就能通过MongoBooster查看数据了……
  • 为什么要通过MongoBooster查看数据……当然是为了确认数据的同步情况了,可视化多么直观啊…
# 以普通身份启动mongodb
mongod --dbpath=f:/data

# 以master身份启动mongodb
mongod --dbpath=f:/data --master

这里写图片描述

参考文章:

8天学通MongoDB——第五天 主从复制:https://www.cnblogs.com/huangxincheng/archive/2012/03/04/2379755.html
MongoDB学习九–MongoDB的主从复制:http://www.voidcn.com/article/p-hhrnlycg-bbu.html

相关文章
相关标签/搜索