MongoDB: Replica set(高可用性)

如何設定高可用性的 replica set

Replica set 是一組 MongoDB 節點,透過在多台伺服器之間複製資料,協同運作以提供高可用性及提升效能。有了 replica set,即使其中一個節點發生故障,您的資料庫仍然可以存取,同時亦可透過分散工作負載來處理更多請求。

三個節點的 replica set 範例三個節點的 replica set 範例

在高可用性的架構下,即使有一個節點離線,您的資料仍可由其他節點提供。效能方面亦有所提升,因為所有寫入操作都會送往 primary 節點,而讀取操作則可以分散到 secondary 節點。

如果您是首次接觸 replica set,建議參考 MongoDB 官方文件 以獲取更多背景資訊。

要建立 replica set,您至少需要三個 MongoDB 節點:

  1. 一個節點作為 primary,負責所有寫入操作,預設也處理讀取操作。
  2. 其他節點為 secondary,它們會幾乎即時地持續從 primary 複製資料。

如果某個 secondary 節點暫時無法使用,您的應用程式仍可正常運作。當該節點重新加入叢集時,會自動同步期間遺漏的資料,並與 replica set 其他成員保持一致。

若 primary 節點發生故障,replica set 會自動觸發選舉程序以選出新的 primary。這個過程通常約需 10 秒。在此期間,replica set 會進入唯讀狀態。當新 primary 選出後,所有操作會恢復正常。

選舉過程範例選舉過程範例

如要在 Stackhero 上建立 replica set,您至少需要三個 MongoDB 實例。以下是詳細步驟:

  1. 於 Stackhero 控制台啟動三個(或以上)MongoDB 實例。
  2. 實例啟動後,請於控制台更新其設定:
    1. 為每個實例設定相同的管理員密碼。
    2. 啟用啟用 replica set選項。
    3. 選擇一個replica 名稱密鑰,所有節點需共用這些資訊。(請注意:replica 名稱建立後不能更改。如不確定,可使用 rs-1 作為預設值。)

請確保所有實例的設定完全一致(管理員密碼、replica set 名稱及 replica 密鑰)。

設定儲存後,您需要在 MongoDB 內定義 replica set 的所有成員。操作方法如下:

  1. 您可以使用以下指令透過 Mongo CLI 連線:
mongo --quiet mongodb://admin@<XXXXXX>.stackhero-network.com/?tls=true

如果您尚未安裝 Mongo CLI,可使用官方 Docker image 執行以下指令:

> docker run -it mongo /bin/bash

此指令會開啟一個 shell,讓您直接執行 Mongo 指令。

  1. 連線後,請使用以下指令初始化 replica set。請將 _id 替換為您選定的 replica set 名稱,並根據實際情況調整成員主機名稱:
rs.initiate({
   _id: "rs-1",
   members: [
      { _id: 0, host: "<XXXXXX>.stackhero-network.com:27017" },
      { _id: 1, host: "<XXXXXX>.stackhero-network.com:27017" },
      { _id: 2, host: "<XXXXXX>.stackhero-network.com:27017" }
   ]
})

如指令執行成功,您會看到類似 { "ok" : 1 } 的回應。

  1. 若想檢視 replica set 設定,可執行:
rs.conf()

只需在其中一個節點套用此設定,其餘節點會自動更新。

您的 MongoDB replica set 現已運作。

為方便您監控 replica set 狀態,我們特別製作了一個 Node.js 腳本,每秒檢查一次狀態。您可於我們的 GitHub repository 下載此腳本。

腳本截圖腳本截圖

如遇到此錯誤,通常是因為未啟用 TLS 加密。您可於連線 URL 加入 tls=true 參數以解決。例如:

mongodb://admin:PASSWORD@<XXXXXX>.stackhero-network.com:27017/admin?tls=true