MongoDB主從複製和副本集

MongoDB有主從複製和副本集兩種主從複製模式,主從複製最大的問題就是無法自動故障轉移,MongoDB副本集解決了主從模式無法自動故障轉義的特點,因此是複製的首選。

對於簡單的主從複製無法自動故障轉移的缺陷,各個數據庫都在改進,MySQL推出的MGR,Redis的哨兵,Mongodb的複製集。

對於主從複製模式:

mongodb的主從配置異常簡單,

如果是非安全認證模式,只需要在主節點增加master = true,

從節點增加slave = true和source = ip:port兩個節點,分別啓動即可,不管主節點是否存在數據以及存在多少數據,從節點以slave的方式啓動,就會自動同步主節點的數據。

相比MySQL的主從模式(各種原因導致的主從事務不一致),簡單的不是一點半點。

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 #存儲引擎有mmapv1、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副本集)就不成功。

需要注意的是,如果在主節點創建了用戶,主從節點以開啓安全認證方式啓動,主節點的用戶信息同樣可以同步到從節點,因此從節點並不需要再重新創建用戶信息。

副本的初始化:

mongodb的副本在啓動的時候會自動從主節點的oplog中讀取數據,從而完成初始化,這一點非常省心。

當然,可能存在主節點數據超過oplog大小或者說主節點oplog發生了重用(覆蓋),那麼就無法通過oplog自動做到主從的同步,此時可以可以:

1,以autoresync = true的方式重啓副本。

2,刪除從節點的數據文件然後重新啓動從節點。

3,刪除從節點的數據文件,直接copy主節點的數據文件到從節點(個人認爲這種方式更加簡單高效),啓動從節點即可。

三種方式都可以達到完整同步主節點數據的目的。

副本集搭建

由於MongoDB副本會自動從主節點(或者相鄰的最近節點)同步數據,不會出現事務衝突之類錯誤,因此副本集的配置也很簡單,這一點要比MySQL的各種配置簡單太多。

主節點生成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  #存儲引擎有mmapv1、wiretiger、mongorocks
bind_ip = 10.104.174.247  

keyFile= /usr/local/mongodb/db/keyfile #添加keyfile 
#master = true
oplogSize=2048  #oplog
replSet = rstest #副本集名稱

主節點副本集初始化

rs.initiate()

(數秒之後)同時發現rstest:SECONDARY>變爲rstest:PRIMARY>

加入新節點

rs.add("10.104.174.247:9000")

rs.add("10.104.174.247:10000")

rs.status() 查看副本集主從節點的狀態

"health" : 1, //1 表明正常; 0 表明異常

"state" : 1, // 1 表明是Primary; 2 表明是Secondary;

"stateStr" : "PRIMARY", //表明此機器是主庫

rs.isMaster()查看主節點信息

副本集也可以通過定義主機集合的方式

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) //初始化配置

歡迎工作一到五年的Java工程師朋友們加入Java架構開發: 855835163
羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章