第10章 MongoDB 進階功能:複製機制


10.1 複製的基本概念
複製機制(Replica Set)是 MongoDB 提供的一項核心功能,用於保證數據的高可用性和可靠性。在複製機制中,資料會在多個節點中自動複製,使得即使主節點(Primary)因故障不可用,次要節點(Secondary)依然能夠提供讀取服務,並在需要時被選舉為新的主節點。

運作原理
主節點(Primary)
主節點負責處理所有的寫入操作和預設的讀取操作。其他次要節點會從主節點同步數據。

次要節點(Secondary)
次要節點通過複製主節點的數據維持同步,可以作為讀取操作的來源,根據需求提供負載均衡。

仲裁節點(Arbiter)
仲裁節點的主要作用是協助選舉新的主節點。它不存儲數據,但在需要選舉時提供投票以避免平局。

10.2 Replica Set 的運作機制
Heartbeat 心跳機制
每個節點之間通過心跳訊號(Heartbeat)來監控彼此的健康狀態。如果某個節點無法響應心跳,則會啟動選舉流程。

選舉與故障恢復
Primary 故障
如果主節點無法回應,剩餘的節點將基於權重(Priority)和數據同步程度進行選舉,選出新的主節點。

恢復後的節點
恢復的節點會重新加入複製流程,根據優先級和現有的主節點同步數據。

10.3 實戰演練:設置與操作 Replica Set
步驟 1:準備工作與啟動服務
在本地電腦模擬三個 MongoDB 節點並啟用 Replica Set,首先需要創建三個資料夾來存儲數據。

創建資料夾

bash
複製程式碼
mkdir -p d:\local_replSet\db1
mkdir -p d:\local_replSet\db2
mkdir -p d:\local_replSet\db3
每個資料夾代表一個 MongoDB 節點的數據存儲位置。

啟動 MongoDB 服務 分別啟動三個 MongoDB 節點,並指定複製組(Replica Set)的名稱為 rs0:

bash
複製程式碼
mongod --replSet rs0 --port 27017 --dbpath "d:\local_replSet\db1"
mongod --replSet rs0 --port 27018 --dbpath "d:\local_replSet\db2"
mongod --replSet rs0 --port 27019 --dbpath "d:\local_replSet\db3"
每個命令會啟動一個 MongoDB 節點,並在對應的資料夾中存儲數據。

步驟 2:初始化 Replica Set
連線到主節點 使用 mongosh 工具連接到一個節點(例如 port 27017):

bash
複製程式碼
mongosh mongodb://localhost:27017
初始化 Replica Set 在連線的 Mongo Shell 中輸入以下指令:

javascript
複製程式碼
rs.initiate({
    _id: "rs0",
    members: [
        { _id: 0, host: "localhost:27017" },
        { _id: 1, host: "localhost:27018" },
        { _id: 2, host: "localhost:27019" }
    ]
});
_id:指定 Replica Set 的名稱。
members:定義 Replica Set 中的節點。
驗證初始化結果 使用 rs.status() 查看 Replica Set 的當前狀態:

javascript
複製程式碼
rs.status();
這將顯示所有節點的角色(Primary 或 Secondary)、健康狀態(Health)以及同步進度。

步驟 3:操作成員
新增成員
將新的節點加入 Replica Set,例如 localhost:27020:

javascript
複製程式碼
rs.add({ _id: 3, host: "localhost:27020" });
新增成員後,使用 rs.status() 驗證節點是否加入成功。

移除成員
在遇到節點故障或不需要某個節點時,可以將其從 Replica Set 中移除。例如,移除 localhost:27018:

javascript
複製程式碼
rs.remove("localhost:27018");
升級成員為 Primary
當需要提升某個節點為 Primary 時,可以調整節點的優先權。例如,將 localhost:27020 提升為 Primary:

取得當前配置:
javascript
複製程式碼
let cfg = rs.conf();
調整優先權:
javascript
複製程式碼
cfg.members[3].priority = 2;  // 提高優先權
cfg.members[0].priority = 0.5;  // 降低舊 Primary 優先權
更新配置:
javascript
複製程式碼
rs.reconfig(cfg);
10.4 測試與驗證
驗證狀態 使用以下指令查看 Replica Set 的當前狀態:

javascript
複製程式碼
rs.status();
性能監控 使用 mongostat 工具實時監控節點的同步狀態和性能:

bash
複製程式碼
mongostat --host rs0/localhost:27017,localhost:27018,localhost:27019
10.5 注意事項與最佳實踐
分散式部署 將節點部署在不同伺服器或地點,避免硬體故障導致整體服務不可用。

仲裁節點(Arbiter)的使用 在節點數量為偶數時加入 Arbiter,避免選舉出現平局。但仲裁節點僅參與選舉,無法處理讀寫請求。

定期備份與監控

使用 mongodump 進行數據備份。
定期監控節點性能,使用 mongotop 分析操作佔用的時間。
啟用安全性 配置身份驗證與 SSL 加密,防止未經授權的訪問。

結論
Replica Set 是 MongoDB 提供的核心功能之一,旨在保證數據的高可用性和可靠性。透過合理配置和管理 Replica Set,可以輕鬆應對多節點環境下的讀寫需求,並在節點故障時自動恢復,確保服務不中斷。通過本章的詳細實踐,您將能夠靈活應用這一功能,為業務提供穩定可靠的數據庫服務。

 

 

第10章 MongoDB 進階功能:複製機制

10.1 複製的基本概念

MongoDB 提供 Replica Set(複製機制)來提高資料的可靠性與服務的高可用性 (High Availability)。透過資料儲存在多個 MongoDB 節點中,即使資料庫崩潰,也能透過其他節點提供服務,避免查詢或新增操作中斷。

Replica Set 的主要特性類似於重要文件的備份流程,將數據存儲在不同位置以防資料遺失。當啟動 MongoDB 服務時,可以透過 --replSet 參數開啟 Replica Set。例如:

 
bash
mongod --replSet "rs0"

這個指令將啟動 Replica Set 並設定組名為 rs0

Replica Set 的三種類型成員

  1. Primary(主要節點)
    • 處理資料的讀取和寫入操作。
  2. Secondary(次要節點)
    • 從 Primary 同步資料,主要用於讀取查詢操作。
  3. Arbiter(仲裁節點)
    • 不存儲資料,但在 Primary 節點故障時協助選舉新的 Primary。

使用者透過驅動 (Driver) 連線到 Replica Set,通常預設會連線到 Primary 節點。但可以透過 Read Preference(讀取偏好)設定查詢資料時的負責成員。


10.2 Replica Set 的運作機制

成員架構與溝通

  • Heartbeat 機制:各節點之間會定期透過心跳訊號 (Heartbeat) 確認成員狀態。若某個成員未回應,其他節點會啟動選舉流程。
  • 最小成員要求:Replica Set 至少需要三個成員(包含 Primary、Secondary 和 Arbiter)。
  • 容錯機制:根據節點數量確保服務持續運作,具體如表:
成員數量 最少成員數 容錯數量
3 2 1
5 3 2

選舉與恢復流程

  1. 第一階段:Primary 節點故障
    當 Primary 節點未回應時,其餘成員啟動選舉流程,由符合條件的 Secondary 節點成為新的 Primary。

  2. 第二階段:選舉新的 Primary
    Secondary 節點根據優先級 (Priority) 選舉出新的 Primary,其餘節點繼續同步資料。

  3. 第三階段:故障節點恢復
    原故障節點恢復後,根據優先級決定是否重新成為 Primary。


10.3 實戰演練:設置與操作 Replica Set

以下步驟模擬在本地端設置三個 MongoDB 節點並啟用 Replica Set:

步驟 1:建立資料夾與啟動服務

  1. 建立三個資料夾作為資料庫的儲存路徑:

     
    bash
    mkdir -p d:\local_replSet\db1 mkdir -p d:\local_replSet\db2 mkdir -p d:\local_replSet\db3
  2. 分別啟動三個 MongoDB 節點:

     
    bash
    mongod --replSet rs0 --port 27017 --dbpath "d:\local_replSet\db1" mongod --replSet rs0 --port 27018 --dbpath "d:\local_replSet\db2" mongod --replSet rs0 --port 27019 --dbpath "d:\local_replSet\db3"

步驟 2:初始化 Replica Set

  1. 連線到任一節點(預設連線到 port 27017):

     
    bash
    mongosh mongodb://localhost:27017
  2. 初始化 Replica Set:

     
    javascript
    rs.initiate({ _id: "rs0", members: [ { _id: 0, host: "localhost:27017" }, { _id: 1, host: "localhost:27018" }, { _id: 2, host: "localhost:27019" } ] });
  3. 驗證狀態:

     
    javascript
    rs.status();

步驟 3:操作成員

  1. 新增成員
    將新的節點 (port 27020) 加入 Replica Set:

     
    javascript
    rs.add({ _id: 3, host: "localhost:27020" });
  2. 移除成員
    移除故障節點 (port 27018):

     
    javascript
    rs.remove("localhost:27018");
  3. 升級成員為 Primary
    調整節點權重以升級為 Primary:

     
    javascript
    let cfg = rs.conf(); cfg.members[3].priority = 2; // 提高新的節點優先權 cfg.members[0].priority = 0.5; // 降低舊 Primary 優先權 rs.reconfig(cfg);

10.4 測試與驗證

  1. 驗證 Replica Set 的狀態:

     
    javascript
    rs.status();
  2. 使用 mongostat 監控節點的同步狀態:

     
    bash
    mongostat --host rs0/localhost:27017,localhost:27018,localhost:27019

10.5 注意事項與最佳實踐

  1. 分散式部署
    將節點部署在不同伺服器上,避免硬體故障導致整體服務不可用。

  2. 仲裁節點(Arbiter)適用性
    當節點數量為偶數時可加入 Arbiter,避免選舉出現平局。

  3. 定期監控
    使用工具如 mongostatmongotop 監控資料庫性能。

  4. 安全性
    啟用身份驗證與 SSL 加密,保護 Replica Set 的通訊安全。


結論

Replica Set 是 MongoDB 保證數據高可用性的重要機制。透過 Replica Set 的設置與操作,可以有效應對服務故障和節點遷移等情況,同時提供穩定的讀寫服務。透過本章的學習,您將能熟練應用 Replica Set 來提升資料庫的可靠性與可用性。

創作者介紹
創作者 AI革命家 REVOLUTIONARY 的頭像
AI革命家

AI革命家 REVOLUTIONARY

AI革命家 發表在 痞客邦 留言(0) 人氣( 0 )