標籤:群集 member 集中 丟失 ber 寫入 方式 date proc
什麼是複製集?
複製集是額外的資料副本,是跨多個伺服器同步資料的過程,複製集提供了冗餘並增加了資料可用性,通過複製集可以對硬體故障和中斷的服務進行恢複。
複製集的優勢如下:
- 讓資料更安全
- 高資料可用性(24*7)
- 災難恢複
- 無停機維護(如備份、索引重建、容錯移轉)
- 讀縮放(額外的副本讀取)
- 複本集對應用程式是透明的
複製集工作原理
MongoDB的複製集至少需要兩個節點。其中一個是主節點(Primary),負責處理用戶端的請求,其餘的都是從節點(Secondary),負責複製主節點上的資料。
MongoDB各個節點常見的搭配方式為:一主一從或一主多從。主節點記錄其上的所有操作到oplog中,從節點定期輪詢主節點擷取這些操作,從而保證從節點的資料與主節點一致。
用戶端在主節點寫入資料,在從節點讀取資料,主節點與從節點進行資料互動保障資料的一致性。如果其中一個節點出現故障,其他節點馬上會將業務接過來而無須停機操作。
複製集特點如下:
- N個節點的群集
- 任何節點可作為主節點
- 所有寫入操作都在主節點上
- 自動容錯移轉
- 自動回復
MongoDB複製集部署建立多執行個體
如何建立多執行個體,在我之前的部落格中已經寫過,可以參考Yum安裝MongoDB及資料庫管理每個執行個體建立時都應該先建立資料檔案目錄(mongo)和記錄檔(mongod.log),同時在修改設定檔時要注意修改使用不同的連接埠號碼在做複製集時,我們要多修改一個參數,replication的參數值,並保證多個執行個體的該參數值都保持一致根據項目要求,需建立額外三個執行個體,加上原有的一個執行個體,一共四個執行個體。
我在做實驗的時候發現,MongoDB中對設定檔的格式也有嚴格要求,在對replication參數值進行修改時要特別注意
replication: replSetName: chenrs //該行內容需在行首空出兩個空格,不空格或者多空格都會導致服務啟動失敗
項目如下:
初始化配置複製集建立複製集
我們先配置包含三個節點的複製集,多出來的一個節點,會在接下來再做一個節點添加的操作
mongochen={"_id":"chenrs","members":[{"_id":0,"host":"172.16.10.27:27017"},{"_id":1,"host":"172.16.10.27:27018"},{"_id":2,"host":"172.16.10.27:27019"}]}
初始化複製集
在初始化複製集時,要確保從節點沒有資料,不然在初始化以後會造成從節點伺服器的資料丟失。
rs.initiate(chen)
查看複製集中各節點狀態
chenrs:SECONDARY> rs.status(){ "set" : "chenrs", "date" : ISODate("2018-07-14T14:40:20.756Z"), ··· //省略部分內容 "members" : [ { "_id" : 0, "name" : "172.16.10.27:27017", "health" : 1, //健康值為1,代表該節點處於運行良好狀態 "state" : 1, //1代表主 "stateStr" : "PRIMARY", //處於peimary狀態 ··· //省略部分內容 }, { "_id" : 1, "name" : "172.16.10.27:27018", "health" : 1, "state" : 2, //2代表從 "stateStr" : "SECONDARY", //處於secondary狀態 ··· //省略部分內容 }, { "_id" : 2, "name" : "172.16.10.27:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", ··· //省略部分內容 }}chenrs:PRIMARY> //此時節點狀態已經發生轉變
節點管理(在primary上做)添加節點
rs.add("172.16.10.27:27020")
刪除節點
rs.remove("172.16.10.27:27020")
容錯移轉切換類比主節點損壞
ps aux | grep mongod //查詢本地的節點的進程號kill -9 40882 //殺死主節點進程
查看節點狀態
chenrs:SECONDARY> rs.status(){ "set" : "chenrs", "date" : ISODate("2018-07-14T15:21:21.426Z"), "myState" : 2, "term" : NumberLong(2), "syncingTo" : "172.16.10.27:27019", "syncSourceHost" : "172.16.10.27:27019", "syncSourceId" : 2, ··· //省略部分內容 "members" : [ { "_id" : 0, "name" : "172.16.10.27:27017", "health" : 0, //健康值為0,處於停機狀態 "state" : 8, "stateStr" : "(not reachable/healthy)", ··· //省略部分內容 }, { "_id" : 1, "name" : "172.16.10.27:27018", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", ··· //省略部分內容 }, { "_id" : 2, "name" : "172.16.10.27:27019", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", ··· //省略部分內容 }}
主動切換主從狀態(在primary上做)
rs.freeze(30) //暫停30s不參與選舉rs.stepDown(60,30) //交出主節點位置,維持從節點狀態不少於60秒,等待30秒使主節點和從節點日誌同步
關於複製集的選舉原理我會在接下來的部落格中寫出來,敬請期待!!
配置MongoDB複製集