複製集是額外的數據副本,是跨多個服務器同步數據的過程,複製集提供了冗餘並增長了數據可用性,經過複製集能夠對硬件故障和中斷的服務進行恢復。
複製集的優點以下:數據庫
- 讓數據更安全
- 高數據可用性(24*7)
- 災難恢復
- 無停機維護(如備份、索引重建、故障轉移)
- 讀縮放(額外的副本讀取)
- 副本集對應用程序是透明的
MongoDB的複製集至少須要兩個節點。其中一個是主節點(Primary),負責處理客戶端的請求,其他的都是從節點(Secondary),負責複製主節點上的數據。
MongoDB各個節點常見的搭配方式爲:一主一從或一主多從。主節點記錄其上的全部操做到oplog中,從節點按期輪詢主節點獲取這些操做,從而保證從節點的數據與主節點一致。
客戶端在主節點寫入數據,在從節點讀取數據,主節點與從節點進行數據交互保障數據的一致性。若是其中一個節點出現故障,其餘節點立刻會將業務接過來而無須停機操做。
複製集特色以下:安全
- N個節點的羣集
- 任何節點可做爲主節點
- 全部寫入操做都在主節點上
- 自動故障轉移
- 自動恢復
如何建立多實例,在我以前的博客中已經寫過,能夠參考Yum安裝MongoDB及數據庫管理每一個實例建立時都應該先建立數據文件目錄(mongo)和日誌文件(mongod.log),同時在修改配置文件時要注意修改使用不一樣的端口號在作複製集時,咱們要多修改一個參數,replication的參數值,並保證多個實例的該參數值都保持一致根據項目要求,需建立額外三個實例,加上原有的一個實例,一共四個實例。
我在作實驗的時候發現,MongoDB中對配置文件的格式也有嚴格要求,在對replication參數值進行修改時要特別注意服務器
replication: replSetName: chenrs //該行內容需在行首空出兩個空格,不空格或者多空格都會致使服務啓動失敗
項目示意圖以下:
ide
咱們先配置包含三個節點的複製集,多出來的一個節點,會在接下來再作一個節點添加的操做3d
mongo chen={"_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> //此時節點狀態已經發生轉變
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", ··· //省略部份內容 } }
rs.freeze(30) //暫停30s不參與選舉 rs.stepDown(60,30) //交出主節點位置,維持從節點狀態很多於60秒,等待30秒使主節點和從節點日誌同步