replicattion set 多臺服務器維護相同的數據副本,提升服務器的可用性,總結下來有如下好處:mongodb
數據備份與恢復數據庫
讀寫分離bash
正如上圖所示,MongoDB 複製集的架構中,主要分爲兩部分:主節點(Primary)和從節點(Secondary)。服務器
主節點:在一個複製集中只有而且必須有一個主節點,主節點也是衆多實例中惟一能夠接收客戶端寫操做的節點,固然也能夠進行讀操做;架構
從節點:從節點會複製主節點的操做,以獲取徹底一致的數據集。客戶端不可以直接對從節點進行寫操做,可是能夠進行讀操做,這個須要經過複製集選項進行設置。app
投票節點:投票節點 並不含有 複製集中的數據集副本,且也 沒法 升職爲主節點。投票節點的存在是爲了使複製集中的節點數量爲奇數,這樣保證在進行投票的時候不會出現票數相同的狀況。若是添加了一個節點後,總節點數爲偶數,那麼就須要相應的增長一個投票節點。ui
注:MongoDB 3.0 把複製集中的成員數量從原來的12個提高到了50個,可是投票節點的數量仍然保持不變,仍是7個。spa
一個主節點,兩個從節點,自動化故障切換的特性
最基本的複製集架構是有3個節點的形式。這樣在主節點不可用之後,從節點會進行投票選出一個節點成爲主節點,繼續工做。以下圖所示:日誌
三個節點的複製集架構,還有另一種形式:一個主節點,一個從節點,一個投票節點。以下圖所示:
一個主節點,一個從節點,一個投票節點
在這種架構中,當主節點不可用時,只有從節點能夠升爲主節點,而投票節點是不能夠成爲主節點的。投票節點僅僅在選舉中進行投票。以下圖所示:
code
其餘概念
從節點還有集中特殊的設置狀況,不一樣的設置有不一樣的需求:
優先級爲0:設置 priority:0 ,那麼該結點將不能成爲主節點,可是其數據還是與主節點保持一致的,並且應用程序也能夠進行讀操做。這樣能夠在某些特殊的狀況下,保證其餘特定節點優先成爲主節點。
隱藏節點:隱藏節點與主節點的數據集一致,可是對於應用程序來講是不可見的。隱藏節點能夠很好的與 複製集 中的其餘節點隔離,並應對特殊的需求,好比進行報表或者數據備份。隱藏節點也應該是一個不能升職爲主節點的優先級爲0的節點。
延時節點:延時節點也將從 複製集 中主節點複製數據,然而延時節點中的數據集將會比複製集中主節點的數據延後。舉個例子,如今是09:52,若是延時節點延後了1小時,那麼延時節點的數據集中將不會有08:52以後的操做。
因爲延時節點的數據集是延時的,所以它能夠幫助咱們在人爲誤操做或是其餘意外狀況下恢復數據。舉個例子,當應用升級失敗,或是誤操做刪除了表和數據庫時,咱們能夠經過延時節點進行數據恢復。
oplog:全拼 oprations log,它保存有數據庫的全部的操做的記錄。在複製集中,主節點產生 oplog,而後從節點複製主節點的 oplog 進行相應的操做,這樣達到保持數據集一致的要求。所以從節點的數據與主節點的數據相比是有延遲的。
# 建立數據存儲目錄 mkdir -p /data/r0 /data/r1 /data/r2 # 建立日誌文件 touch /var/log/mongo17.log /var/log/mongo18.log /var/log/mongo19.log #啓動3個實例,且聲明實例屬於某複製集 rsa ./bin/mongod --port 27017 --dbpath /data/r0 --smallfiles --replSet rsa --fork --logpath /var/log/mongo17.log ./bin/mongod --port 27018 --dbpath /data/r1 --smallfiles --replSet rsa --fork --logpath /var/log/mongo18.log ./bin/mongod --port 27019 --dbpath /data/r2 --smallfiles --replSet rsa --fork --logpath /var/log/mongo19.log # 進入27017進行配置初始化 ./bin/mongo --port 27017 rsconf = { _id:'rsa', members: [ {_id:0, host:'192.168.42.168:27017' } ] } rs.initiate(rsconf); # 若是之後須要再重載一下config的話,用rs.reconfig(rsconf); # 添加節點 rs.add('192.168.42.168:27018'); rs.add('192.168.42.168:27019'); # 查看狀態 rs.status(); # 刪除節點 rs.remove('192.168.1.201:27019'); # 主節點插入數據 >use test >db.user.insert({uid:1,name:'lily'}); #鏈接secondary查詢同步狀況 ./bin/mongo --port 27019 >show dbs rsa:SECONDARY> show dbs; 2015-08-27T11:39:00.638+0800 E QUERY Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" } # 還能夠經過isMaster()命令來查看信息; rsa:PRIMARY> db.isMaster(); { "setName" : "rsa", "setVersion" : 5, "ismaster" : true, "secondary" : false, "hosts" : [ "192.168.42.168:27018", "192.168.42.168:27019", "192.168.42.168:27017" ], "primary" : "192.168.42.168:27018", "me" : "192.168.42.168:27018", "electionId" : ObjectId("55dea0cffa0c638625a82486"), "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2015-08-27T05:49:13.740Z"), "maxWireVersion" : 3, "minWireVersion" : 0, "ok" : 1 } # 出現上述錯誤,是由於slave默認不準讀寫 >rs.slaveOk(); >show dbs; # 執行上面一個語句就能夠看到和primary一致的數據,而且能夠把讀和寫分離開來;
以上即是一個最簡單的複製集架構,其中若是27017的主節點崩潰,那27018的節點就由從節點變爲主節點;注意,若是再添加原來的27017節點進來,那主節點仍是27018;
#!/bin/bash IP='192.168.1.202' NA='rsb' if [ "$1" = "reset" ] then pkill -9 mongo rm -rf /home/m* exit fi if [ "$1" = "install" ] then mkdir -p /home/m0 /home/m1 /home/m2 /home/mlog /usr/local/mongodb/bin/mongod --dbpath /home/m0 --logpath /home/mlog/m17.log --logappend --port 27017 --fork --replSet ${NA} /usr/local/mongodb/bin/mongod --dbpath /home/m1 --logpath /home/mlog/m18.log --logappend --port 27018 --fork --replSet ${NA} /usr/local/mongodb/bin/mongod --dbpath /home/m2 --logpath /home/mlog/m19.log --logappend --port 27019 --fork --replSet ${NA} exit fi if [ "$1" = "repl" ] then /usr/local/mongodb/bin/mongo <<EOF use admin rsconf = { _id:'${NA}', members:[ {_id:0,host:'${IP}:27017'}, {_id:1,host:'${IP}:27018'}, {_id:2,host:'${IP}:27019'}, ] } rs.initiate(rsconf) EOF fi