MongoDB複製集(replica set):MongoDB複製集維護相同數據集的一組mongod進程,複製集是生產部署的基礎,具備數據冗餘以及高可用性。node
那爲何要設置複製集(replica set)呢?mongodb
副本集包含多個數據節點和可選的一個仲裁節點。 而在數據節點中:只有一個主節點(primary node),其餘節點爲爲從節點(secondary nodes)。
各個節點成員經過心跳機制進行通訊,當主節點與從節點的通訊的時間超過配置的electionTimeoutMillis期間(默認爲10秒)時,符合條件的從節點要求選舉將本身指定爲新主節點,羣集嘗試完成新主節點的選舉並恢復正常操做。數據庫
oplog: 它保存了修改存儲在數據庫中的數據的全部操做的滾動記錄,MongoDB在主節點服務器上應用數據庫操做,而後在主節點服務器的oplog上記錄操做,而後從節點成員在異步過程當中經過心跳機制從任何其餘成員導入oplog並應用這些操做,oplog中的每一個操做都是冪等的。全部副本集成員都在local.oplog.rs集合中包含oplog的副本,這容許它們維護數據庫的當前狀態。服務器
從節點: 複製主節點的oplog並將oplog記錄的操做應用於其數據集,若是主節點宕機了,將從符合條件的從節點選舉選出新的主節點,。 並且你能夠經過配置實現特定的功能,好比:網絡
仲裁節點: 仲裁節點不維護數據集。 仲裁節點的目的是經過響應其餘副本集節點的心跳和選舉請求來維護副本集中的仲裁。 由於它們不存儲數據集,因此仲裁節點能夠是提供副本集仲裁功能的好方法,其資源成本比具備數據集的全功能副本集成員更便宜。 若是您的副本集具備偶數個成員,請添加仲裁節點以得到主要選舉中的大多數投票。並且仲裁節點老是隻有1次選舉投票,所以容許副本集具備不均勻的投票成員數,而沒有複製數據的額外成員的開銷。架構
心跳機制(Hearbeat): 複製集成員間默認每2s會發送一次心跳信息,若是10s未收到某個節點的心跳,則認爲該節點已宕機不能夠訪問;若是宕機的節點爲Primary,Secondary(前提是可被選爲Primary)會發起新的Primary選舉。仲裁人與其餘集合成員之間的惟一溝通是:選舉期間的投票,心跳和配置數據,並且這些交換未加密。數據同步: 爲了維護共享數據集的最新副本,副本的從節點設置同步或複製來自其餘節點的數據。 MongoDB使用兩種形式的數據同步:初始化同步新節點同步完整的數據集,以及整個集羣節點同步後續數據更改。異步
其中,初始化同步(Initial Sync)過程:分佈式
克隆除本地數據庫以外的全部數據庫。 要進行克隆,mongod會掃描每一個源數據庫中的每一個集合,並將全部數據插入到這些集合的本身的副本中。 初始同步會在爲每一個集合複製文檔時構建全部集合索引。 在早期版本的MongoDB中,在此階段僅構建_id索引。學習
初始同步在數據複製期間提取新添加的oplog記錄。 確保目標成員在本地數據庫中有足夠的磁盤空間,以便在此數據複製階段的持續時間內臨時存儲這些oplog記錄。ui
將全部更改應用於數據集。 使用來自源的oplog,mongod更新其數據集以反映副本集的當前狀態。 初始同步完成後,成員從STARTUP2轉換爲SECONDARY。
標準複製集架構由三臺服務器,其中包括三個數據節點(一個主節點、兩個從節點)或兩個數據節點(一個主節點、一個從節點)和一個仲裁節點兩種狀況。以下所示:
三個數據節點:
兩個數據節點以及一個仲裁節點:
優先級0型節點不能夠成爲成爲主節點,也不能觸發選舉。將從節點配置爲優先級爲0以防止它成爲主節點,這在多數據中心部署中特別有用,在許多狀況下,您無需將備用數據庫設置爲優先級0.可是,在具備不一樣硬件或地理分佈的副本集中,優先級爲0的備用數據庫可確保僅某些成員成爲主數據庫,這樣能夠根據實際網絡分區的網絡質量等實際狀況進行配置。
例如,一個數據中心承載主數據中心和輔助數據中心:
將第二個數據中心節點優先級爲0只能爲從節點數據庫,而數據中心1中的節點才能成爲主節點數據庫。(好比你跨機房A、B部署了一個複製集,而且想指定Primary必須在A機房,這時能夠將B機房的複製集成員Priority設置爲0,這樣Primary就必定會是A機房的成員),隱藏型(Hidden)節點:
因爲延遲型從節點是數據集的「滾動備份」或運行「歷史」快照,所以它們能夠幫助您從各類人爲錯誤中恢復。 例如,延遲節點能夠從不成功的應用程序升級和操做員錯誤(包括丟棄的數據庫和集合)中恢復。並且延遲型從節點必定是優先級爲0的從節點,也是隱藏型從節點。不能成主節點,也不能給客戶端查詢。
在選擇延遲量時,請考慮延遲量:複製集節點能夠經過配置members[n].votes來決定該節點是否具備投票權利!members[n].votes值爲1具備投票權利爲投票型節點,爲0則不能夠投票即爲不可投票節點。無表決權的節點必須優先級爲0,也是優先級大於0的成員不能爲0值。雖然無表決權的成員不在選舉中投票,但這些成員持有副本集數據的副本,而且能夠接受來自客戶端應用程序的讀取操做。
另外在副本集最多可包含50個成員,但只有7個投票成員,所以非投票成員容許副本集具備7個以上的成員。並投票成員只有具有如下狀態能夠進行投票:
{
"_id" : <num>,
"host" : <hostname:port>,
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 0
}
複製代碼
最大投票成員爲數量
副本集最多可包含50個成員,但只有7個投票成員。 若是副本集已有7個投票成員,則其餘成員必須是非投票成員。
部署奇數個成員
副本集應該確保具備奇數個投票成員,若是您擁有偶數個投票成員,請部署仲裁節點,以便該集合具備奇數個投票成員。仲裁節點不存儲數據的副本而且須要更少的資源。 所以,您能夠在應用程序服務器或其餘共享進程上運行仲裁程序。 容錯能力
副本集的容錯是當變爲不可用的成員數,而且仍然在副本集中留下足夠的節點成員來選擇主節點成員。容錯是副本集大小的影響, 見下表:
Number of Members | Majority Required to Elect a New Primary | Fault Tolerance |
---|---|---|
3 | 2 | 1 |
4 | 3 | 1 |
5 | 3 | 2 |
6 | 4 | 2 |
所以能夠得出,將成員添加爲偶數個到副本集並不老是會增長容錯能力。可是,在這些狀況下,其中將其中一個節點設置成隱藏型和延遲型從節點能夠爲專用功能提供支持,例如備份或報告。
提升讀負載能力
在具備很是高讀取流量的部署中,您能夠經過將讀取分發給從節點來提升讀取吞吐量。 隨着部署的增加,將節點添加或移動到備用數據中心以提升冗餘和可用性。
副本集分佈在兩個或更多數據中心
副本集分佈在兩個或更多數據中心的優點:
在不一樣地域部署數據節點(具備備用的數據中心)
要在數據中心發生故障時保護您的數據,請在備用數據中心至少保留一個成員。 若是可能,使用奇數個數據中心,並選擇一個成員分佈,以最大限度地提升即便丟失數據中心的可能性,剩餘的副本集成員能夠造成能夠造成「大多數」選取出主節點,並有提供數據的副本的能力。爲確保主數據中心的節點在備用數據中心的成員以前被選爲主要成員,請將備用數據中心中節點members[n].priority 設置爲低於主數據中節點,以下所示:
根據部署結構部署複製集示例 三個節點成員的副本集,成員合理分佈以及解析以下:
五副節點成員的副本集,成員合理分佈以及解析以下:
高可用
集羣具備自主選舉能力,影響選取的因子和條件有如下:
Write concern描述了在操做返回成功以前必須確認寫操做的數據承載成員(即主節點成員和從節點成員,但不是仲裁者)的數量。成員只能在收到併成功應用寫入後才能確認寫入操做。
對於副本集,默認的w:1的Write concern 要求在返回Write concern確認以前,只有Primary主節點確認寫入。您能夠指定一個大於1的整數值,以要求來自主節點的確認以及知足指定值所需的多個從節點,最多爲副本集中數據承載成員的總數。
Client 發出帶有須要寫入請求的寫入操做Write concern將等待直到主節點接收來自指定須要寫入詢問全部數量的成員的確認。對於大於1或w:「majority 」的寫入諮詢 Write concern,主節點接收到所需的從節點數量在返回確承認寫入答覆通知client確認寫入。對於w:1的寫入諮詢Write Concern,主要能夠在本地應用(單機模式)寫入時當即返回可寫入答覆,由於它有資格對所請求的Write Concern作出判決。
指定超時等待寫入諮詢Write concern的寫操做僅表示所需數量的副本集成員未在wtimeout時間段內確認寫操做。它不必定表示主節點Primary未能應用寫入。
檢驗寫操做
在insert()方法中增長write Concern選項,並指定「大多數」寫入關注和5秒超時,以便操做不會無限期地阻塞,以下:
db.products.insert(
{ item: "envelopes", qty : 100, type: "Clasp" },
{ writeConcern: { w: "majority" , wtimeout: 5000 } }
)
複製代碼
例如,在3個節點成員的副本集中,操做將須要來自3個成員中的2個的確認。若是稍後縮放副本集以包括兩個額外的投票節點,則相同的操做將須要來自5個副本集成員中的3個的確認。若是主節點服務器未在wtimeout限制內返回寫入諮詢 Write concern確認,則寫入操做將失敗並出現寫入問題錯誤。
修改默認Write Concern
能夠經過在副本集配置中設置settings.getLastErrorDefaults設置來修改副本集的默認寫入問題。配置在返回以前等待寫操做(在大多數投票成員上確認後)操做命令:
cfg = rs.conf()
cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 }
rs.reconfig(cfg)
複製代碼
Read Preference是mongodb如何將讀操做分配到節點中,默認狀況下,應用程序將其讀取操做定向到副本集中的主要成員(即讀取首選項模式「primary」)。 可是,客戶端能夠指定讀取首選項以將讀取操做發送到輔助節點。Read Preference 模式以下:
如下是使用讀取首選項模式的常見用例:
最後可關注公衆號,一塊兒學習,天天會分享乾貨,還有學習視頻領取!