sql server能夠做到讀寫分離,雙機熱備份和集羣部署,當然mongodb也能做到,實際應用中我們不希望數據庫採用單點部署,如果碰到數據庫宕機或者被毀滅性破壞那是多麼的糟糕。
注意新的3.0.5的說明 Master/slave options (old; use replica sets instead): 不過這篇還是以master/slave來做。
一:主從複製
1: 首先看看模型圖
2: 從上面的圖形中我們可以分析出這種架構有如下的好處:
<1> 數據備份。
<2> 數據恢復。
<3> 讀寫分離。
3:下面我們就一一實踐
實際應用中我們肯定是多服務器部署,限於自己懶的裝虛擬機,就在一臺機器上實踐了。
第一步:我們把mongodb部署多服務器上192.168.0.148和192.168.0.149。
第二步:啓動192.168.0.149上的mongodb,把該數據庫指定爲主數據庫,其實命令很簡單:>mongod --dbpath='XXX' --master,端口還是默認的27017.
先啓動主mongod --dbpath=/data/db/ --master
再啓動從mongod --slave --source 192.168.0.149:27017 --dbpath /data/db/
出現了sycing和sleep說明已經從主數據庫複製完成了,下面進行更爽的操作:
登錄Master 149 mongo 192.168.0.149:27017
再登錄Slave 148查看相關情況 mongo 192.168.0.148:27017
運行show dbs報錯了,主從啓動之後,連接slave可以成功連上,但是在slave中執行 show dbs 的時候就報錯了:
QUERY Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" }
解決方法:在報錯的slave機器上執行 rs.slaveOk()方法即可。下面查詢一下,看有同步了嗎
看到了嗎,成功同步了。
如果我還想增加一臺從屬數據庫,但是我不想在啓動時就指定,而是後期指定,那麼mongodb可否做的到呢?答案肯定是可以的。跟啓動Slave一樣增加就行了。是不是So easy啊。
讀寫分離
這種手段在大一點的架構中都有實現,在mongodb中其實很簡單,在默認的情況下,從屬數據庫不支持數據的讀取,但是沒關係,在驅動中給我們提供了一個叫做“slaveOkay"來讓我們可以顯示的讀取從屬數據庫來減輕主數據庫的性能壓力。
默認是從數據庫不支持寫的,需要在從數據庫執行rs.slaveOk(),其解釋如下:
Provides a shorthand for the following operation:
db.getMongo().setSlaveOk()
This allows the current connection to allow read operations to run on secondary members. See the readPref() method for more fine-grained control over read preference in the mongo shell.