返回顶部

欢迎来到菜鸟大明儿哥的博客

我们一起交流学习,不断提升自我

MongoDB 主从复制搭建

主从架构

    mongodb支持传统的master-slave架构。master节点负责数据的读写,slave没有写入权限。没有自动故障转移功能,需要指定master和slave端,不推荐在生产中使用。

 

 

主从复制的优点:

  • 从服务器可以执行查询工作,降低主服务器访问压力

  • 在从服务器执行备份,避免备份期间锁定主服务器的数据

  • 当主服务器出现故障时,可以快速切换到从服务器,减少当机时间.

 

MongoDB支持在多个机器中通过异步复制到底故障转移和实现冗余,多台机器中同一时刻只有一台是用于写操作,这为mongoDB提供了数据一致性的保障.担当Primary角色的机器能把读操作分发给slave机器.




主从架构的配置

环境:CentOS6.5 MongoDB3.4

master配置文件

 

master.conf

dbpath=/data/mongo/master
logpath=/var/log/mongo/master/mongodb.log
port=27017
bind_ip=127.0.0.1
master=true 
fork=true  //后台运行mongodb服务
 

 

slave配置文件

dbpath=/data/mongo/slave
logpath=/var/log/mongo/slave/mongodb.log
port=27018
bind_ip=127.0.0.1
slave=true
fork=true //后台运行mongodb服务
source=127.0.0.1:27017 //配置主的ip和端口
 

 

分别启动master和slave

mongod --config master.conf 
mongod --config slave.conf
 

 

分别登录master和slave

mongo 127.0.0.1:27017
mongo 127.0.0.1:27018
 

 

master上执行show dbs

> show dbs
admin            0.000GB
local            0.005GB
 

 

slave上执行show dbs报错

 

> show dbs
2018-04-19T11:31:35.982+0800 E QUERY    [thread1] Error: listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not master and slaveOk=false",
        "code" : 13435,
        "codeName" : "NotMasterNoSlaveOk"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:782:19
shellHelper@src/mongo/shell/utils.js:672:15
@(shellhelp2):1:1
 

这个报错是因为默认情况下slave上没有读写权限,可以在slave上执行下面的命令解决

 

> rs.slaveOk() //2.6版本设置方法不一样
> show dbs
admin            0.000GB
local            0.000GB
 

 

 

测试:

在主库上创建数据库 masterslavetest 并创建一些测试数据

 

> use masterslave
switched to db masterslave
> for (i = 5000; i < 100000; i++) {
... db.users.insert({
... "i": i,
... "userName": "user" + i,
... 
... "age": Math.floor(Math.random() * 120),
... "created": new Date(),
... total: Math.floor(Math.random() * 100) * i
... })
... }
WriteResult({ "nInserted" : 1 })
 

 

 

在两个实例上分别执行 以下命令 可以看到在两个数据库上的数据保持一致,这时在主数据库上执行CRUD等操作时,从库数据依然与主库一致

db.users.find()
 



 



slave上同样执行上面的命令

 

 

测试在slave节点上面添加一条数据看看

> db.mycoll.insert({"i":9999,"username":"test","age":30})
WriteResult({ "writeError" : { "code" : 10107, "errmsg" : "not master" } })
 

可以看到slave节点没有写入权限。

 

关掉master上的mongodb进程看看

> show dbs
2018-04-19T11:58:43.464+0800 E QUERY    [thread1] Error: listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not master and slaveOk=false",
        "code" : 13435,
        "codeName" : "NotMasterNoSlaveOk"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:782:19
shellHelper@src/mongo/shell/utils.js:672:15
@(shellhelp2):1:1
> rs.slaveOk()
> 
> 
> show dbs
admin        0.000GB
local        0.000GB
masterslave  0.005GB
 

由上面测试可以知道,master节点如果挂了,从节点不能自动接管服务,变成master角色。需要手动修改配置文件,设置为master,重启服务才能进行读写。

posted @ 2020-03-23 16:35  菜鸟大明儿哥  阅读(332)  评论(0编辑  收藏  举报