導讀:html
在以前的文章中(超連接),咱們說了MongoDB如今已經再也不推薦使用主從複製模式,而是推薦副本集,那麼副本集究竟有什麼優勢呢?咱們不妨來探索一下。數據庫
(一)副本集(replica set)概述服務器
對於副本集,官方文檔是這樣定義的:副本集是一組mongod維護相同數據的實例,一個副本集包含多個數據承載節點和一個仲裁節點(可選),在數據承載節點中,只有一個成員節點被視爲主節點,主節點可以進行讀寫操做,其它節點則被視爲次要節點,次要節點只能進行讀操做。架構
(二)副本集的架構異步
(1)PSS架構spa
「一主兩從」架構,若是主節點不可用,則符合條件的次要節點將進行選舉以自行選舉新的主要節點。3d
跨2個或多個數據中心分佈的副本集:日誌
在兩個數據中心之間分佈副本集成員可提供優於單個數據中心的好處。在兩個數據中心分佈中,code
--若是其中一個數據中心發生故障,則與單個數據中心分發不一樣,該數據仍可讀取。htm
--若是具備少數成員的數據中心發生故障,則副本集仍然能夠同時執行寫操做和讀操做。
--可是,若是擁有大多數成員的數據中心發生故障,則副本集將變爲只讀。
若是可能,請在至少三個數據中心中分配成員。對於配置服務器副本集(CSRS),最佳實踐是分佈在三個(或更多,取決於成員的數量)中心中。若是第三個數據中心的成本太高,則一種分配可能性是,在公司政策容許的狀況下,在兩個數據中心之間平均分配數據承載成員,並將剩餘成員存儲在雲中。
(2)PSA架構
在某些狀況下(例如只有一個主服務器和一個輔助服務器,但因爲成本限制,禁止添加另一個服務器),你能夠選擇一個mongod實例做爲仲裁器添加到副本集,仲裁節點參加選舉,可是不保存數據。
(三)自動故障轉移
當主節點與其它成員的通訊時間超過參數electionTimeoutMillis(默認10000,即10s)的限定時,會發生自動故障轉移,原來的某個從節點會轉換角色爲主節點。
(四)讀取首選項(讀寫分離)
默認狀況下,客戶端從主節點讀取數據,可是,客戶端也能夠指定首選項,將讀取請求發送到從節點。
(五)MongoDB副本集成員
MongoDB副本集主要有三種成員:
(1)主節點
主節點是副本集中接收寫操做的惟一成員,MongoDB在主數據庫上執行寫操做,而後再主數據庫的oplog上記錄操做,從節點複製該日誌,將操做應用於從數據庫。
在如下3節點副本集中,主數據庫不可用,將會觸發一次選舉,將從節點之一選舉爲新的主節點。
(2)從節點(副本節點)
副本節點爲只讀節點,對於副本節點,能夠將其配置爲:
(3)仲裁節點
在某些狀況下(例如您有一個主服務器和一個輔助服務器,但因爲成本限制,禁止添加另外一個輔助服務器),您能夠選擇將仲裁器添加到副本集。一個仲裁器不具備數據集的副本,並不能成爲主節點。可是,仲裁節點參加選舉。仲裁人具備確切的1個投票。
(六)操做日誌oplog
MongoDB在主數據庫上執行寫操做,並在操做日誌中記錄該操做,而後從數據庫將日誌異步同步過去並應用,每一個副本集節點都包含一個oplog,保存在local.oplog.rs中。
由於每一個副本集成員都存在oplog日誌,爲了促進複製,全部副本集成員都會發送心跳(pings)給全部的其它成員,任何從節點均可以從其它節點導入操做日誌條目。
(1)oplog大小設置
首次啓動副本集成員時,若是未指定操做日誌大小,則MongoDB將建立默認大小的操做日誌
默認操做日誌大小取決於存儲引擎:
儲存引擎 默認操做日誌大小 下界 上界 ----------------- ----------------- ------ ------- 內存中存儲引擎 物理內存的5% 50兆字節 50 GB WiredTiger存儲引擎 可用磁盤空間的5% 990兆字節 50 GB
在mongod建立操做日誌以前,可使用oplogSizeMB參數指定其大小,首次啓動副本集成員以後,使用replSetResizeOplog命令更改操做日誌大小。
(2)查看oplog狀態
要查看操做日誌狀態,包括操做的大小和時間範圍,可使用re.printReplicationInfo()方法。
【完】