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 映像執行下列指令:
> 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