jrgf 发表于 2018-10-24 12:59:10

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
mongo --config master.conf  
mongo --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    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({
  
... &quot;i&quot;: i,
  
... &quot;userName&quot;: &quot;user&quot; + i,
  
...
  
... &quot;age&quot;: Math.floor(Math.random() * 120),
  
... &quot;created&quot;: new Date(),
  
... total: Math.floor(Math.random() * 100) * i
  
... })
  
... }
  
WriteResult({ &quot;nInserted&quot; : 1 })
  在两个实例上分别执行 以下命令 可以看到在两个数据库上的数据保持一致,这时在主数据库上执行CRUD等操作时,从库数据依然与主库一致
db.users.find()
  slave上同样执行上面的命令

  测试在slave节点上面添加一条数据看看
> db.mycoll.insert({&quot;i&quot;:9999,&quot;username&quot;:&quot;test&quot;,&quot;age&quot;:30})  
WriteResult({ &quot;writeError&quot; : { &quot;code&quot; : 10107, &quot;errmsg&quot; : &quot;not master&quot; } })
  可以看到slave节点没有写入权限。
  关掉master上的mongodb进程看看
> show dbs  
2018-04-19T11:58:43.464+0800 E QUERY    Error: listDatabases failed:{
  
      &quot;ok&quot; : 0,
  
      &quot;errmsg&quot; : &quot;not master and slaveOk=false&quot;,
  
      &quot;code&quot; : 13435,
  
      &quot;codeName&quot; : &quot;NotMasterNoSlaveOk&quot;
  
} :
  
_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
  
masterslave0.005GB
  由上面测试可以知道,master节点如果挂了,从节点不能自动接管服务,变成master角色。需要手动修改配置文件,设置为master,重启服务才能进行读写。


页: [1]
查看完整版本: MongoDB 主从架构