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
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
3、開啟master的mongod服務
bin/mongod --config ~/mongodb3.0/etc/mongodb.conf
開啟mongo客戶端
bin/mongo 192.168.102.111
4、 開啟slave的mongod服務
bin/mongod --config ~/mongodb3.0/etc/mongodb.conf
開啟mongo客戶端
bin/mongo 192.168.102.112
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" }
在slave中查看
Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not mast
er" }
解釋:
slave[默認是不可讀]是不允許讀寫的,可以通過在連接時指定或者在主庫指定slaveOk,由slave來分擔讀的壓力。
解決方案:
在slave節點數據庫中執行rs.slaveOk()命令即可
執行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" }
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) }
測試完成
缺點:
主節點掛了不能自動切換連接到從節點,需要手工切換,比較致命。
目前主從複製已經被副本集所代替,關於副本集的優缺點我們下篇分曉。
歡迎大家給予寶貴的意見或者建議。
歡迎大家補充或者共享一些其他的方法。
感謝支持。
閱讀更多 程序員日常筆記 的文章