MongoDB有主從複製和副本集兩種主從複製模式,主從複製最大的問題就是沒法自動故障轉移,MongoDB副本集解決了主從模式沒法自動故障轉義的特色,所以是複製的首選。
對於簡單的主從複製沒法自動故障轉移的缺陷,各個數據庫都在改進,MySQL推出的MGR,Redis的哨兵,Mongodb的複製集。html
對於主從複製模式:
mongodb的主從配置異常簡單,
若是是非安全認證模式,只須要在主節點增長master = true,
從節點增長slave = true和source = ip:port兩個節點,分別啓動便可,無論主節點是否存在數據以及存在多少數據,從節點以slave的方式啓動,就會自動同步主節點的數據。
相比MySQL的主從模式(各類緣由致使的主從事務不一致),簡單的不是一點半點。mongodb
port=12345 #端口 dbpath= /usr/local/mongodb/db #數據庫存文件存放目錄 logpath= /usr/local/mongodb/db/mongodb.log #日誌文件存放路徑 logappend=true #使用追加的方式寫日誌 fork=true #守護程序的方式啓用,false即不在後臺運行 maxConns=100 #最大同時鏈接數 journal=true #每次寫入會記錄一條操做日誌(經過journal能夠從新構造出寫入的數據)。 storageEngine=wiredTiger #存儲引擎有mmapv一、wiretiger、mongorocks bind_ip = 10.104.174.247 #這樣就可外部訪問了,例如從win10中去連虛擬機中的MongoDB #複製只須要增長master = true master = true #若是開啓了安全認證,須要增長以下兩個節點。 auth=true #啓用驗證 keyFile= /usr/local/mongodb/db/keyfile #添加keyfile oplogSize=2048 #oplog大小
安全認證模式:數據庫
關於安全認證模式,糾結了很久,mongodb是這樣的:
1,對於單實例的mongodb,(建立用戶以後)開啓安全認證須要增長auth = true配置便可,
2,主從或者副本集模式下,(建立用戶以後)若是要開啓安全認證,必需要加上keyFile(設置能夠file以後auth參數纔有效),兩者必須同時配置,不然(主從or副本集)就不成功。安全
須要注意的是,若是在主節點建立了用戶,主從節點以開啓安全認證方式啓動,主節點的用戶信息一樣能夠同步到從節點,所以從節點並不須要再從新建立用戶信息。app
副本的初始化:編碼
mongodb的副本在啓動的時候會自動從主節點的oplog中讀取數據,從而完成初始化,這一點很是省心。
固然,可能存在主節點數據超過oplog大小或者說主節點oplog發生了重用(覆蓋),那麼就沒法經過oplog自動作到主從的同步,此時能夠能夠:
1,以autoresync = true的方式重啓副本。
2,刪除從節點的數據文件而後從新啓動從節點。
3,刪除從節點的數據文件,直接copy主節點的數據文件到從節點(我的認爲這種方式更加簡單高效),啓動從節點便可。
三種方式均可以達到完整同步主節點數據的目的。spa
以下是mongodb slave節點同步數據的模式,來自於:https://www.cnblogs.com/daizhj/archive/2011/06/20/2050916.html日誌
副本集搭建code
因爲MongoDB副本會自動從主節點(或者相鄰的最近節點)同步數據,不會出現事務衝突之類錯誤,所以副本集的配置也很簡單,這一點要比MySQL的各類配置簡單太多。htm
主節點生成keyfile:
openssl rand -base64 100 > /usr/local/mongodb/db/keyfile --文件內容採base64編碼,一共100個字符
修改文件權限:
chmod 600 /usr/local/mongodb/db/keyfile
複製改keyfile至各個節點,而後啓動各個節點。
搭建副本集須要移除掉主從複製的一些配置項(主節點的master = true,從節點的slave,source等配置項),以下是一個最簡單的配置項。
port=8000 #端口 dbpath= /usr/local/mongodb/db #數據庫存文件存放目錄 logpath= /usr/local/mongodb/db/mongodb.log #日誌文件存放路徑 logappend=true #使用追加的方式寫日誌 fork=true #守護程序的方式啓用,false即不在後臺運行 maxConns=100 #最大同時鏈接數 auth=true #啓用驗證 journal=true #每次寫入會記錄一條操做日誌(經過journal能夠從新構造出寫入的數據)。 #即便宕機,啓動時wiredtiger會先將數據恢復到最近一次的checkpoint點,而後重放後續的journal日誌來恢復。 storageEngine=wiredTiger #存儲引擎有mmapv一、wiretiger、mongorocks bind_ip = 10.104.174.247 keyFile= /usr/local/mongodb/db/keyfile #添加keyfile #master = true oplogSize=2048 #oplog replSet = rstest #副本集名稱
"health" : 1, //1 代表正常; 0 代表異常
"state" : 1, // 1 代表是Primary; 2 代表是Secondary;
"stateStr" : "PRIMARY", //代表此機器是主庫
副本集也能夠經過定義主機集合的方式
config_rs1={_id:'rs1',members:[
{_id:1,host:'10.104.174.247:8000',priority:1},
{_id:2,host:'10.104.174.247:9000'},
{_id:3,host:'10.104.174.247:1000'}]}
rs.initiate(config_rs1) //初始化配置
參考:
http://www.javashuo.com/article/p-duzmtenb-ev.html
https://www.cnblogs.com/oubo/archive/2012/03/01/2394669.html
https://www.cnblogs.com/daizhj/archive/2011/06/20/2050916.html