雜集:淺談關於Mongodb數據庫主從複製

Linux下Mongodb數據庫主從複製配置

Mongodb的三種集群搭建的方式:

Master-Slaver:主從[目前被副本集取代]。

Replica Set:副本集。

Sharding:切片。

Mongodb單實例缺點:

適合簡易開發時使用,生產使用不行,因為單節點掛掉整個數據業務全掛。

主從複製:

MongoDB常用的複製方式,也是一個簡單的數據庫同步備份的集群技術,這種方式很靈活。可用於備份,故障恢復等等。

最基本的設置方式是建立一個主節點和一個/多個從節點,當主節點掛掉了後從節點可以接替主機繼續服務。

主從複製缺點[見文章結尾]

原理:

主從結構中,主節點的操作記錄oplog[operation log]。

oplog存儲在一個系統數據庫local的集合oplog.$main中,這個集合的每個文檔都代表主節點上執行的一個操作。

從服務器會定期從主服務器中獲取oplog記錄,然後在本機上執行。

對於存儲oplog的集合,MongoDB採用的是固定集合,隨著操作過多,新的操作會覆蓋舊的操作。

準備:

192.168.102.111 master

192.168.102.112 slave

關於mongodb的安裝詳見:

第四篇:linux系統中mongodb的配置

提示:

建議兩臺機器都關閉防火牆

1、 修改master配置文件

192.168.102.111 master

vi ~/mongodb3.0/etc/mongodb.conf

port=27017

bind_ip=192.168.102.111

dbpath=/home/odysee/mongodb3.0/data/db/

logpath=/home/odysee/mongodb3.0/logs/mongodb.log

logappend=true

journal=true

fork=true

#主服務器

master=true

#同步複製的日誌大小設置,單位MB

oplogSize=2048

雜集:淺談關於Mongodb數據庫主從複製

2、修改slave配置文件

192.168.102.112 slave

vi ~/mongodb3.0/etc/mongodb.conf

port=27017

bind_ip=192.168.102.112

dbpath=/home/odysee/mongodb3.0/data/db/

logpath=/home/odysee/mongodb3.0/logs/mongodb.log

logappend=true

journal=true

fork=true

#主數據庫端口

source=192.168.102.111:27017

#從服務器

slave=true

#設置從庫同步主庫的延遲時間,秒

slavedelay=10

#主從庫數據不一致時,自動同步

autoresync=true

雜集:淺談關於Mongodb數據庫主從複製

3、開啟master的mongod服務

bin/mongod --config ~/mongodb3.0/etc/mongodb.conf

雜集:淺談關於Mongodb數據庫主從複製

開啟mongo客戶端

bin/mongo 192.168.102.111

雜集:淺談關於Mongodb數據庫主從複製

4、 開啟slave的mongod服務

bin/mongod --config ~/mongodb3.0/etc/mongodb.conf

雜集:淺談關於Mongodb數據庫主從複製

開啟mongo客戶端

bin/mongo 192.168.102.112

雜集:淺談關於Mongodb數據庫主從複製

5、 測試數據同步

在master中新建demo庫插入測試數據

> use demo;

switched to db demo

> db.demo.insert({"name":"odysee1"})

WriteResult({ "nInserted" : 1 })

> db.demo.insert({"name":"odysee2"})

WriteResult({ "nInserted" : 1 })

> db.demo.insert({"name":"odysee3"})

WriteResult({ "nInserted" : 1 })

> db.demo.find()

{ "_id" : ObjectId("5c37b2780ecf620bd11f14c8"), "name" : "odysee1" }

{ "_id" : ObjectId("5c37b27b0ecf620bd11f14c9"), "name" : "odysee2" }

{ "_id" : ObjectId("5c37b27e0ecf620bd11f14ca"), "name" : "odysee3" }

雜集:淺談關於Mongodb數據庫主從複製

在slave中查看

Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not mast

er" }

解釋:

slave[默認是不可讀]是不允許讀寫的,可以通過在連接時指定或者在主庫指定slaveOk,由slave來分擔讀的壓力。

解決方案:

在slave節點數據庫中執行rs.slaveOk()命令即可

雜集:淺談關於Mongodb數據庫主從複製

執行rs.slaveOk()

> rs.slaveOk()

> show dbs

demo 0.078GB

local 0.078GB

> use demo

switched to db demo

> db.demo.find()

{ "_id" : ObjectId("5c38f77633430bbc2fe4fd82"), "name" : "odysee1" }

{ "_id" : ObjectId("5c38f77933430bbc2fe4fd83"), "name" : "odysee2" }

{ "_id" : ObjectId("5c38f77c33430bbc2fe4fd84"), "name" : "odysee3" }

雜集:淺談關於Mongodb數據庫主從複製

6、 補充

主從複製的其他參數:

--only 從節點指定複製某個數據庫,默認是複製全部數據庫

--fastsync 從節點以主數據庫的節點快照為節點啟動從數據庫

從節點的local數據庫中,存在一個集合sources。

這個集合保存了這個服務器的主服務器的信息。

> rs.slaveOk()

> show dbs

demo 0.078GB

local 0.078GB

> use local

switched to db local

> db.sources.find()

{ "_id" : ObjectId("5c38f7396c5e678d05336ca9"), "host" : "192.168.102.111:27017", "source" : "main", "syncedTo" : Timestamp(15472

38614, 1) }

雜集:淺談關於Mongodb數據庫主從複製

測試完成

缺點:

主節點掛了不能自動切換連接到從節點,需要手工切換,比較致命。

目前主從複製已經被副本集所代替,關於副本集的優缺點我們下篇分曉。

歡迎大家給予寶貴的意見或者建議。

歡迎大家補充或者共享一些其他的方法。

感謝支持。


分享到:


相關文章: