MongoDB: Replica set(高可用性)
如何設定高可用性的 replica set
Replica set 是一組 MongoDB 節點,透過在多台伺服器之間複製資料,協同運作以提供高可用性及提升效能。有了 replica set,即使其中一個節點發生故障,您的資料庫仍然可以存取,同時亦可透過分散工作負載來處理更多請求。
三個節點的 replica set 範例
在高可用性的架構下,即使有一個節點離線,您的資料仍可由其他節點提供。效能方面亦有所提升,因為所有寫入操作都會送往 primary 節點,而讀取操作則可以分散到 secondary 節點。
如果您是首次接觸 replica set,建議參考 MongoDB 官方文件 以獲取更多背景資訊。
Replica set 的運作方式
要建立 replica set,您至少需要三個 MongoDB 節點:
- 一個節點作為 primary,負責所有寫入操作,預設也處理讀取操作。
- 其他節點為 secondary,它們會幾乎即時地持續從 primary 複製資料。
如果某個 secondary 節點暫時無法使用,您的應用程式仍可正常運作。當該節點重新加入叢集時,會自動同步期間遺漏的資料,並與 replica set 其他成員保持一致。
若 primary 節點發生故障,replica set 會自動觸發選舉程序以選出新的 primary。這個過程通常約需 10 秒。在此期間,replica set 會進入唯讀狀態。當新 primary 選出後,所有操作會恢復正常。
選舉過程範例
開始使用 MongoDB replica set
如要在 Stackhero 上建立 replica set,您至少需要三個 MongoDB 實例。以下是詳細步驟:
- 於 Stackhero 控制台啟動三個(或以上)MongoDB 實例。
- 實例啟動後,請於控制台更新其設定:
- 為每個實例設定相同的管理員密碼。
- 啟用啟用 replica set選項。
- 選擇一個replica 名稱及密鑰,所有節點需共用這些資訊。(請注意:replica 名稱建立後不能更改。如不確定,可使用
rs-1作為預設值。)
請確保所有實例的設定完全一致(管理員密碼、replica set 名稱及 replica 密鑰)。
設定儲存後,您需要在 MongoDB 內定義 replica set 的所有成員。操作方法如下:
- 您可以使用以下指令透過 Mongo CLI 連線:
mongo --quiet mongodb://admin@<XXXXXX>.stackhero-network.com/?tls=true
如果您尚未安裝 Mongo CLI,可使用官方 Docker image 執行以下指令:
> docker run -it mongo /bin/bash
此指令會開啟一個 shell,讓您直接執行 Mongo 指令。
- 連線後,請使用以下指令初始化 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 } 的回應。
- 若想檢視 replica set 設定,可執行:
rs.conf()
只需在其中一個節點套用此設定,其餘節點會自動更新。
您的 MongoDB replica set 現已運作。
檢查 MongoDB replica set 狀態
為方便您監控 replica set 狀態,我們特別製作了一個 Node.js 腳本,每秒檢查一次狀態。您可於我們的 GitHub repository 下載此腳本。
腳本截圖
疑難排解
處理錯誤:「network error while attempting to run command 'isMaster' on host」
如遇到此錯誤,通常是因為未啟用 TLS 加密。您可於連線 URL 加入 tls=true 參數以解決。例如:
mongodb://admin:PASSWORD@<XXXXXX>.stackhero-network.com:27017/admin?tls=true