配置MongoDB復制集
阿新 • • 發佈:2018-07-15
客戶端 freeze not 集中 replicat cto 啟動 配方 備份 什麽是復制集?
根據項目要求,需創建額外三個實例,加上原有的一個實例,一共四個實例。
我在做實驗的時候發現,MongoDB中對配置文件的格式也有嚴格要求,在對replication參數值進行修改時要特別註意
復制集是額外的數據副本,是跨多個服務器同步數據的過程,復制集提供了冗余並增加了數據可用性,通過復制集可以對硬件故障和中斷的服務進行恢復。
復制集的優勢如下:
- 讓數據更安全
- 高數據可用性(24*7)
- 災難恢復
- 無停機維護(如備份、索引重建、故障轉移)
- 讀縮放(額外的副本讀取)
- 副本集對應用程序是透明的
復制集工作原理
MongoDB的復制集至少需要兩個節點。其中一個是主節點(Primary),負責處理客戶端的請求,其余的都是從節點(Secondary),負責復制主節點上的數據。
MongoDB各個節點常見的搭配方式為:一主一從或一主多從。主節點記錄其上的所有操作到oplog中,從節點定期輪詢主節點獲取這些操作,從而保證從節點的數據與主節點一致。客戶端在主節點寫入數據,在從節點讀取數據,主節點與從節點進行數據交互保障數據的一致性。如果其中一個節點出現故障,其他節點馬上會將業務接過來而無須停機操作。
復制集特點如下:
- N個節點的群集
- 任何節點可作為主節點
- 所有寫入操作都在主節點上
- 自動故障轉移
- 自動恢復
MongoDB復制集部署
創建多實例
如何創建多實例,在我之前的博客中已經寫過,可以參考Yum安裝MongoDB及數據庫管理每個實例創建時都應該先創建數據文件目錄(mongo)和日誌文件(mongod.log),同時在修改配置文件時要註意修改使用不同的端口號在做復制集時,我們要多修改一個參數,replication的參數值,並保證多個實例的該參數值都保持一致
我在做實驗的時候發現,MongoDB中對配置文件的格式也有嚴格要求,在對replication參數值進行修改時要特別註意
replication:
replSetName: chenrs //該行內容需在行首空出兩個空格,不空格或者多空格都會導致服務啟動失敗
項目示意圖如下:
初始化配置復制集
創建復制集
我們先配置包含三個節點的復制集,多出來的一個節點,會在接下來再做一個節點添加的操作
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> //此時節點狀態已經發生轉變
節點管理(在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復制集