1. 程式人生 > >MongoDB 主從架構和復制集架構

MongoDB 主從架構和復制集架構

MongoDB主從架構和復制集架構


主從架構

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還是沒有寫入權限



MongoDB 主從架構和復制集架構