主从架构:
mongodb支持传统的master-slave架构。master节点负责数据的读写,slave没有写入权限。没有自动故障转移功能,需要指定master和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 [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上的mongo进程看看
> 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
slave还是没有写入权限
原文地址:http://blog.51cto.com/zengestudy/2105303