MongoDB 副本集

副本是指確保在多個 Mongo 資料庫伺服器上提供相同資料的過程。為了提高資料可用性,有時需要這樣做。

因為如果你的主 MongoDB 伺服器因任何原因而關閉,將無法訪問資料。但是,如果你定期將資料複製到另一臺伺服器,即使主伺服器出現故障,你也可以從另一臺伺服器訪問資料。

副本的另一個目的是負載平衡的可能性。如果有許多使用者連線到系統,而不是讓每個人都連線到一個系統,則可以將使用者連線到多個伺服器,以便分配相同的負載。

在 MongoDB 中,多個 MongDB 伺服器分組在稱為副本集的集合中。副本集將具有主伺服器,該伺服器將接受來自客戶端的所有寫入操作。在此之後新增到集合中的所有其他例項將被稱為輔助例項,主要用於所有讀取操作。

Replica Set:使用 rs.initiate() 新增第一個成員

如上一節所述,要啟用複製,我們首先需要建立 MongoDB 例項的副本集。

讓我們假設我們的示例中有 3 個伺服器,分別是 ServerA,ServerB 和 ServerC。在此配置中,ServerA 將成為我們的主伺服器,ServerB 和 ServerC 將成為我們的輔助伺服器。

下面是建立副本集以及將第一個成員新增到集合時需要遵循的步驟。

步驟 1: 確保將新增到副本集的所有 mongod.exe 例項安裝在不同的伺服器上。這是為了確保即使一臺伺服器出現故障,其他伺服器也將可用,因此 MongoDB 的其他例項將可用。

步驟 2: 確保所有 mongo.exe 例項可以相互連線。從 ServerA 發出以下 2 個命令

mongo -host ServerB -port 27017

mongo -host ServerC -port 27017

同樣,從剩餘的伺服器執行相同的操作。

步驟 3: 使用 replSet 選項啟動第一個 mongod.exe 例項。此選項為將成為此副本集的一部分的所有伺服器提供分組。

mongo -replSet "Replica1"

其中 Replica1 是副本集的名稱。你可以為副本集名稱選擇任何有意義的名稱。

步驟 4: 現在第一臺伺服器被新增到副本集中,下一步是通過發出以下命令來啟動副本集 rs.initiate()

步驟 5: 通過發出命令 rs.conf() 來驗證副本集,以確保正確設定副本

Replica Set:使用 rs.add() 新增輔助節點

只需使用 rs.add 命令即可將輔助伺服器新增到副本集。此命令接受輔助伺服器的名稱,並將伺服器新增到複製集。

步驟 1: 假設你有 ServerA,ServerB 和 ServerC,它們是你的副本集和 ServerA 的一部分,被定義為副本集中的主伺服器。

要將 ServerB 和 ServerC 新增到副本集,請使用命令

rs.add("ServerB")

rs.add("ServerC")

Replica Set:使用 rs.remove() 重新配置或刪除

要從配置集中刪除伺服器,我們需要使用 rs.remove 命令

步驟 1: 首先關閉要刪除的例項。可以通過從 mongo shell 發出 db.shutdownserver 命令來完成此操作。

步驟 2: 連線到主伺服器

步驟 3: 使用 rs.remove 命令從副本集中刪除所需的伺服器。因此,假設你有一個具有 ServerA,ServerB 和 ServerC 的副本集,並且你想要從副本集中刪除 ServerC,請使用命令

rs.remove("ServerC")

排除副本集故障

以下步驟與使用副本集時遇到問題時可以進行故障排除的方法相同。

  1. 確保所有 mongo.exe 例項可以相互連線。假設你有 3 臺名為 ServerA,ServerB 和 ServerC 的伺服器。從伺服器 A,發出以下 2 個命令

    mongo -host ServerB -port 27017
    
    mongo -host ServerC -port 27017
    
  2. 執行 rs.status 命令。此命令提供副本集的狀態。預設情況下,每個成員都會向對方傳送名為 heartbeat 訊息的訊息,這些訊息只表示伺服器處於活動狀態且正常工作。 status 命令獲取這些訊息的狀態,並顯示副本集中是否存在任何成員問題。

  3. 檢查 Oplog 的大小,Oplog 是 MongoDB 中的一個集合,用於儲存對 MongoDB 資料庫執行的寫入歷史記錄。然後,MongoDB 使用此 Oplog 將寫入複製到副本集中的其他成員。要檢查 Oplog,請連線到所需的成員例項並執行 rs.printReplicationInfo 命令。此命令將顯示日誌的大小以及在日誌檔案變滿之前它可以在其日誌檔案中儲存事務的時間。