mongodb支持傳統的master-slave架構。沒有自動故障轉移功能,需要指定master和slave端。建議使用復制集架構,復制集架構比復制架構更好維護,功能更強。
一、基本概念
復制集是由一組擁有相同數據集的 mongod 實例組成的。其中的一個節點為主節點(Primary),所有的寫請求都是在它上面完成的。而其他的節點都是從節點(secondary),從節點接收從主節點上傳來的操作並應用,並以此來保證其與主節點的數據集一致。
主節點:接收所有來自客戶端的寫操作。一個復制集只能有一個主節點。由於在一個復制集中只有一個成員能夠接收寫操作,復制集為所有來自主節點的讀提供了 嚴格的一致性校驗 。主節點通過將所有數據集的變動記錄到 oplog 中以支持復制的實現
從節點:將主節點上的oplog復制過來並應用這些操作來修改其自己的數據集以確保從節點的數據集與主節點的數據集一致。一旦主節點不可用了,復制集就會將一個從節點選舉成為新的主節點。客戶端默認是從主節點進行讀操作,但是客戶端也可以通過指定 復制集讀選項 來將讀操作發送給從節點。需要注意的是,在從節點上進行讀操作時,所獲得的數據可能不是此時主節點上的值。
投票節點:我們也可以為復制集新增一個額外的 mongod 實例作為 投票節點 。該節點中並不包含數據集,投票節點的作用僅僅是在選舉過程中參與投票。當復制集的成員個數為偶數時,添加一個投票節點可以防止平局的出現,通過多數選票來選舉出新的主節點。由於投票節點僅提供投票功能,故無需一個專用的物理機。
投票節點將只做投票使用。當主節點降職變為從節點的時候,其他的一個從節點將在選舉中被推選為主節點。
二、復制集架構
最基礎的復制集架構是由三個成員組成的。這樣的架構為復制集提供了冗余與故障切換的余地。根據應用的需求來設計復制集的架構,盡量避免不必要的復雜化。
復制集應含有奇數個成員
奇數個成員的存在確保了復制集可以正常的選舉出主節點。如果副本集現有偶數個成員,那麼請增加一個投票節點以保證其成員個數為奇數。
為特殊需求使用隱藏節點和延時節點。
新增隱藏節點或是延時節點來為特殊需求提供服務,比如備份或是報表。
以讀為主的架構的負載均衡
若業務帶來的大量的讀請求,我們可以通過做讀寫分離來提升復制集的讀能力。隨著業務的擴展,我們可以通過在其他數據中心新增從節點的方式來提高冗余能力與可用性。
決定復制集各成員的分布與功能
物理位置上的節點分布
在其他數據中心擁有至少一個復制集節點可以很好地在主數據中心出問題時為數據提供安全性保障。將這類節點的priority設置為0,以防其升職為主節點。
保證在一個數據中心中擁有多數節點
當復制集在多個數據中心擁有節點,且各數據中心網絡隔離時,為了保證數據的復制與傳輸,各節點之間需要能夠正常溝通。
在選舉中,各節點需要能夠互相溝通來保證其多數性。為了保證復制集節點能夠保持多數且能夠正常的選舉出主節點,我們需要保證一個數據中心擁有復制集中的多數節點。
三、故障切換
復制集通過選舉來從當前主節點不可用的困境中恢復。
復制集選舉
一旦當前主節點不可用了,復制集就會進行選舉並推選出一個新的主節點。
故障切換時的回滾
之前的主節點在故障切換後重新回歸復制集時將會發生寫操作的回滾。回滾只會發生在主節點的寫操作沒能成功在從節點上應用就辭職的情況下。當主節點重新以一個從節點加入復制集,它將進行 “回滾”,其上得寫操作將與復制集中其他成員的保持一致。
MongoDB會盡量避免回滾的發生。回滾如果確實發生了,往往是由於網絡導致的。從節點如果無法跟上之前主節點上的寫操作的吞吐,那麼將會加劇回滾的影響范圍。
當主節點在從節點完成寫操作的復制後才辭職的或是主節點一直是可用的或是與多數節點可以溝通的,將不會發生回滾。
選取回滾的數據
當回滾發生後,管理員需要決定是恢復回滾的數據還是忽視它。MongoDB將回滾的數據以 BSON 文件的形式寫到數據庫 dbPath 文件夾中的 rollback/ 目錄。回滾數據文件的命名是按照以下規則進行的
如:records.accounts.2011-05-09T18-10-04.0.bson
可通過設置 復制集的安全寫級別 確保寫操作應用到了整個復制集來避免回滾。
影響選舉的因素
1.心跳檢測
復制集成員每兩秒向復制集中其他成員進行心跳檢測。如果某個節點在10秒內沒有返回,那麼它將被標記為不可用。
2.連接
如果復制集中的某個節點不能連接上其他多數節點,那麼它將不能升職為主節點。在選舉中,多數是指多數投票而不是多數節點個數。如果復制集是由三個節點組成的,且三個節點均可投票,只要其中兩個節點能夠互相溝通那麼復制集就能選舉出新的主節點。如果有兩個節點不可用了,那麼剩下的節點將為從節點,因為它不能與復制集中多數節點進行溝通。 如果兩個從節點不可用了,剩下的主節點將降職為從節點。
3.網絡隔離
網絡隔離影響了選舉中多數選票的結構。如果主節點不可用了,且每個相互隔離的網絡中都沒有多數選票的出現,那麼復制集將 不會選舉出新的主節點。復制集將變為只讀的。為了避免這種情況的出現,我們需要將多數節點置於主數據中心,少數節點放於其他數據中心。
觸發選舉的情況
當復制集中沒有主節點可用的時候將觸發選舉,比如:
1.新復制集的初始化。
2.一個從節點無法與主節點進行連接。當從節點們無法與主節點進行溝通的時候將會觸發選舉。
3.主節點辭職了
主節點將在以下幾種情況下辭職:
1.在接收到 replSetStepDown 命令後。
2.現有的某個從節點在選舉中合格,且它又有更高的優先級。
3.當主節點無法與復制集中多數節點進行溝通的時候。
4.有些情況下,在我們需要修改一些復制集配置的時候會觸發選舉,導致主節點辭職
注意:當主節點辭職後,它將關閉所有已經建立的連接來確保客戶端不會在從節點中進行寫操作。這將對客戶端對復制集的架構獲取與防止回滾提供幫助。
我們具體來看下選舉的過程心跳檢測