輕鬆掌握元件啟動之MongoDB(下):高可用複製集架構環境搭建

2023-10-17 15:01:06

引言

上一章節中,我們詳細介紹了在典型的三節點複製集環境中搭建MongoDB的步驟和注意事項。從準備組態檔到啟動MongoDB程序,我們一步步指導讀者完成了環境的設定。在本章節中,我們將進一步深入,重點講解如何進行復制集的設定和安全驗證,以及連線方式的選擇。通過學習這些內容,讀者將能夠更好地理解和應用MongoDB的複製集功能,確保資料的可靠性和安全性。

設定複製集

在複製集中,可以通過使用replSetInitiate命令或mongo shell的rs.initiate()方法來進行初始化。一旦初始化完成,各個成員之間會開始傳送心跳訊息,並進行Primary選舉操作。在此過程中,節點需要獲得足夠多成員的投票支援,才能成為Primary節點,而其他節點則會成為Secondary節點。

方法1:

 #mongo ‐‐port 28017
 # 初始化複製集
 > rs.initiate()
 # 將其餘成員新增到複製集
 > rs.add("192.168.65.174:28018")
 > rs.add("192.168.65.174:28019")

方法2:

 # mongo ‐‐port 28017
 # 初始化複製集
 > rs.initiate({
 _id: "rs0",
 members: [{
 _id: 0,host: "192.168.65.174:28017"
 },{
 _id: 1,host: "192.168.65.174:28018"
 },{
 _id: 2,host: "192.168.65.174:28019"
 }]
 })

驗證

MongoDB 主節點進行寫入

 # mongo ‐‐port 28017
 rs0:PRIMARY> db.user.insert([{name:"xiaoyu"},{name:"monkey"}])

MongoDB 從節點進行讀

 # mongo ‐‐port 28018
 # 指定從節點可讀
 rs0:SECONDARY> rs.secondaryOk()
 rs0:SECONDARY> db.user.find()

複製集狀態查詢

檢視最新複製集整體狀態:

rs.status()

在複製集中,可以檢視各成員的當前狀態,以瞭解它們是否健康、是否在進行全量同步、心跳資訊、增量同步資訊、選舉資訊以及上一次的心跳時間等。通過這些資訊,您可以監控和評估複製集的執行狀況。

在複製集中,通過檢視"members"欄位,可以獲得關於所有成員的狀態資訊。這些資訊可以幫助我們判斷成員的健康狀況,瞭解它們是否在進行全量同步,以及其他相關資訊。下面是一些主要的狀態列位的解釋:

  • health:表示成員是否健康,這是通過心跳檢測來確定的。
  • state/stateStr:表示成員的狀態。如果成員是主節點,則狀態為PRIMARY;如果成員是備用節點,則狀態為SECONDARY。當節點發生故障時,可能會出現一些其他的狀態,例如RECOVERY。
  • uptime:表示成員的啟動時間,即成員執行的時間。
  • optime/optimeDate:表示成員最後一次同步oplog的時間。oplog是MongoDB中的操作紀錄檔,用於在複製集中同步資料變更。
  • optimeDurable/optimeDurableDate:表示成員最後一次同步oplog的時間,這個時間是持久的,即該時間點之前的所有資料變更已經被持久化到磁碟上。
  • pingMs:表示成員與當前節點之間的ping時延,即網路延遲。
  • syncingTo:表示成員正在從哪個節點進行同步操作,即同步來源。

檢視當前節點角色:

db.isMaster()

除了當前節點的角色資訊,你可以通過傳送一個特定的命令來獲取更詳細的資訊,包括整個複製集的成員列表、真正的主節點(Primary)是誰以及與複製集相關的協定設定資訊等。Driver 在首次連線複製集時會傳送該命令。

Mongo Shell複製集命令

命令 描述
rs.add() 為複製集新增節點
rs.addArb() 為複製集新增一個 arbiter
rs.conf() 返回複製集設定資訊
rs.freeze() 防止當前節點在一段時間內選舉成為主節點
rs.help() 返回 replica set 的命令幫助
rs.initiate() 初始化一個新的複製集
rs.printReplicationInfo() 以主節點的視角返回複製的狀態報告
rs.printSecondaryReplicationInfo() 以從節點的視角返回複製狀態報告
rs.reconfig() 通過重新應用複製集設定來為複製集更新設定
rs.remove() 從複製集中移除一個節點
rs.secondaryOk() 為當前的連線設定 從節點可讀
rs.status() 返回複製集狀態資訊。
rs.stepDown() 讓當前的 primary 變為從節點並觸發 election
rs.syncFrom() 設定複製集節點從哪個節點處同步資料,將會覆蓋預設選取邏輯

安全認證

建立使用者

在主節點伺服器上,啟動mongo

 use admin
 #建立使用者
 db.createUser( {
 user: "xiaoyu",
 pwd: "xiaoyu",
 roles: [ { role: "clusterAdmin", db: "admin" } ,
 { role: "userAdminAnyDatabase", db: "admin"},
 { role: "userAdminAnyDatabase", db: "admin"},
 { role: "readWriteAnyDatabase", db: "admin"}]
 })

建立keyFile檔案

KeyFile檔案在MongoDB叢集中的作用是提供安全認證機制。它用於在叢集節點之間進行身份驗證,以增加叢集的安全性。(開啟keyfile認證就預設開啟了auth認證了)。

 #mongo.key採用隨機演演算法生成,用作節點內部通訊的金鑰檔案。
 openssl rand ‐base64 756 > /data/mongo.key
 #許可權必須是600
 chmod 600 /data/mongo.key

在進行復制集的初始化之前,請確保先停止所有主從節點上的mongod服務。然後,建立一個名為keyFile的檔案,並將其拷貝到複製集的其他從節點伺服器上。在複製集的每個從節點上,將keyFile檔案的路徑地址設定到mongo.conf組態檔中的keyFile欄位,並設定keyFile檔案的許可權為600。最後,啟動mongod服務。這樣做的目的是為了確保keyFile檔案能夠被所有節點正確存取,並提供必要的安全認證機制。

 # 啟動mongod
 mongod ‐f /data/db1/mongod.conf ‐‐keyFile /data/mongo.key
 mongod ‐f /data/db2/mongod.conf ‐‐keyFile /data/mongo.key
 mongod ‐f /data/db3/mongod.conf ‐‐keyFile /data/mongo.key

測試

1 #進入主節點
2 mongo ‐‐port 28017

1 #進入主節點
2 mongo ‐‐port 28017 ‐uxiaoyu ‐pxiaoyu ‐‐authenticationDatabase=admin

複製集連線方式

方式一:在連線複製集時直接連線到主節點(Primary),並且在正常情況下可以進行讀寫操作,但一旦主節點發生故障切換,你無法正常存取資料庫,

方式二(強烈推薦):通過使用高可用URI連線到MongoDB,當主節點發生故障切換時,MongoDB驅動程式可以自動感知並將流量路由到新的主節點。這種方式可以提供更高的可用性和自動故障轉移。

springboot操作複製集設定

 spring:
   data:
   mongodb:
   uri:
    mongodb://xiaoyu:[email protected]:28017,192.168.65.174:28018,192.168.65.174:28019/test?authSource=admin&replicaSet=rs0

總結

本章介紹了MongoDB複製集的設定和使用方法。首先,我們學習瞭如何初始化和新增節點到複製集,並驗證了主節點的寫入和從節點的讀取功能。然後,我們瞭解瞭如何查詢複製集的狀態,包括成員的健康狀況、同步資訊和角色等。最後,我們介紹瞭如何設定複製集的安全認證,包括建立使用者和生成keyFile檔案,並演示了使用認證資訊連線複製集的方式。通過本章的學習,你將掌握MongoDB複製集的基本使用和設定方法。