MongoDB 主从架构和复制集架构

主从架构

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


主从架构的配置

环境:CentOS6.5 MongoDB3.4

master配置文件

master.conf

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

slave配置文件

dbpath=/data/mongo/slavelogpath=/var/log/mongo/slave/mongodb.logport=27018bind_ip=127.0.0.1slave=truefork=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:27017mongo 127.0.0.1:27018

master上执行show dbs

> show dbsadmin            0.000GBlocal            0.005GB

slave上执行show dbs报错

> show dbs2018-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:13Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1shellHelper.show@src/mongo/shell/utils.js:782:19shellHelper@src/mongo/shell/utils.js:672:15@(shellhelp2):1:1

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

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


测试:

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

> use masterslaveswitched 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 dbs2018-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:13Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1shellHelper.show@src/mongo/shell/utils.js:782:19shellHelper@src/mongo/shell/utils.js:672:15@(shellhelp2):1:1> rs.slaveOk()> > > show dbsadmin        0.000GBlocal        0.000GBmasterslave  0.005GB

slave还是没有写入权限

相关文章