MongoDB 複製集模式Replica Sets

五柳-先生發表於2015-09-15

1、概述

複製集是一個帶有故障轉移的主從叢集。是從現有的主從模式演變而來,增加了自動故障轉移和節點成員自動恢復。

複製集模式中沒有固定的主結點,在啟動後,多個服務節點間將自動選舉產生一個主結點。該主結點被稱為primary,一個或多個從結點被稱為secondaries。primary結點基本上就是master結點,不同之處在於primary結點在不同時間可能是不同的伺服器。如果當前的主結點失效了,複製集中的其餘結點將會試圖選出一個新的主結點。

複製集模式的好處是,一切自動化。首先,複製集模式本身做了大量的管理工作,自動管理從節點,確保資料不會不一致。其次,主節點掛掉後,會自動判斷叢集中的伺服器並進行故障轉移,推舉新的主節點。

一個複製集叢集支援1-7臺伺服器,在一個複製集中各個伺服器資料保持完全一致。

在一個複製集叢集中,各個伺服器有以下幾種狀態:

Primary 主節點,一個複製集有且僅有一臺伺服器處於Primary狀態,只有主節點才對外提供讀寫服務。如果主節點掛掉,複製集將會投票選出一個備用節點成為新的主節點。

Secondary 備用節點,複製集允許有多臺Secondary,每個備用節點的資料與主節點的資料是完全同步的。

  Recovering 恢復中,當複製集中某臺伺服器掛掉或者掉線後資料無法同步,重新恢復服務後從其他成員複製資料,這時就處於恢復過程,資料同步後,該節點又回到備用狀態。

Arbiter 仲裁節點,該類節點可以不用單獨存在,如果配置為仲裁節點,就主要負責在複本集中監控其他節點狀態,投票選出主節點。該節點將不會用於存放資料。如果沒有仲裁節點,那麼投票工作將由所有節點共同進行。

Down 無效節點,當伺服器掛掉或掉線時就會處於該狀態。

複製集的從節點讀請求,也是在各個Driver層設定slaveOk的值來實現的。

2、示例

同樣的在一臺機器上實現此功能。

(1)建立叢集名字 yy

第一個節點:C盤,埠號:2222

第二個節點:E盤,埠號:3333

第三個節點:F盤,埠號:4444

(2)例項化Replica Sets

開啟任意一個mongod節點,登入後執行如下內容(這裡登陸C盤):

進行初始化:

呼叫rs.conf()檢視配置資訊

可以看到2222成了主節點,3333成了從節點,4444是仲裁節點:

呼叫rs.status()檢視狀態:


呼叫 rs.isMaster()檢視是否是主節點


登入 3333埠檢視:

登入4444埠檢視:


(3)測試

在主庫中插入一節點,如下:

但此時在從庫中查詢報如下錯誤:

這是正常的現象,對於SECONDARY節點預設是不可讀的。因為SECONDARY是不允許讀和寫的,在寫多讀少的應用中,使用Replica Sets來實現讀寫分離。通過在連線時指定或者在主庫指定slaveOk,由SECONDARY來分擔讀的壓力,PRIMARY只承擔些操作。

解決方法:

第一種:在從節點設定slaveOk():

第二種:在主節點設定:

這樣就可以查詢了。

同樣,當主庫中刪除一條資料時,會同步到從庫。

如果把2222埠的服務停掉,則可以看到3333會成為主節點。

此時在3333上呼叫rs.status()可以看到了變化:

3333變成了主庫。


以上在一臺機器上配置了MongoDB的複製集模式。供大家參考。

相關文章