MongoDB學習4:MongoDB複製集機制和原理,搭建複製集

等一個,晴天發表於2020-08-11

1.複製集的作用

  1.1 MongoDB複製集的主要意義在於實現服務高可用

  1.2 它的實現依賴於兩個方面的功能:

   · 資料寫入時將資料迅速複製到另一個獨立節點上
   · 在接收寫入的節點發生故障時自動選舉出一個新的替代節點

  1.3 在實現高可用的同時,複製集實現了其他幾個附加作用:

   · 資料分發:將資料從一個區域複製到另一個區域,減少另一個區域的讀延遲
   · 讀寫分離:不同型別的壓力分別在不同的節點上執行
   · 異地容災:在資料中心故障時快速切換到異地

2.典型複製集結構

  2.1 一個典型的複製集由3個以上具有投票權的節點組成,包括:

   · 一個主節點(PRIMARY):接受寫入操作和選舉時投票
   · 兩個(或多個)從節點(SECONDARY):複製主節點上的新資料和選舉時投票
   · 不推薦使用Arbiter(投票節點,即不做資料儲存只用來投票)
MongoDB學習4:MongoDB複製集機制和原理,搭建複製集

3. 資料是如何複製的?

  • 當一個修改操作,無論是插入、更新或刪除,到達主節點時,它對資料的操作將被記錄下來(經過一些必要的轉換),這些記錄成為oplog
  • 從節點通過在主節點上開啟一個tailable遊標不斷獲取新進入主節點的oplog,並在自己的資料上回放,以此保持與主節點資料一致
    MongoDB學習4:MongoDB複製集機制和原理,搭建複製集

4. 通過選舉完成故障恢復

  • 具有投票權的節點之間兩兩互相傳送心跳(預設2s)
  • 當5次心跳未收到時判斷為節點失聯
  • 如果失聯的是主節點,從節點會發起選舉,選出新的主節點
  • 如果失聯的是從節點則不會產生新的選舉
  • 選舉基於 RAFT一致性演算法 實現,選舉成功的必要條件是大多數投票節點存活
  • 複製集最多可以有50個節點,但具有投票權的節點最多7個
    MongoDB學習4:MongoDB複製集機制和原理,搭建複製集

  影響選舉的因素

  • 整個叢集必須有大多數節點存活
  • 被選舉為主節點的節點必須:
    • 能夠與多數節點建立連線
    • 具有較新的oplog
    • 具有較高的優先順序(如果有配置)

  複製集節點具有以下常見選項

  • 是否具有投票權(v 引數):有則參與投票
  • 優先順序(priority 引數):優先順序越高的節點越優先成為主節點。優先順序為0的節點無法成為主節點
  • 隱藏(hidden 引數):複製資料,但對應用不可見。隱藏節點可以具有投票權,但優先順序必須為0
  • 延遲(slaveDelay 引數):複製n秒之前的資料,保持與主節點的時間差

  複製集註意事項

  • 關於硬體
    • 因為正常的複製集節點都有可能成為主節點,它們的地位是一樣的,因此硬體配置上必須一致
    • 為了保證節點不會同時當機,各個節點使用的硬體必須具有獨立性
  • 關於軟體
    • 複製集各節點軟體版本必須一致,防止出現不可預知的問題
  • 增加節點不會增加系統寫效能 !

5. 在一臺機器上執行3個例項來搭建一個簡單的複製集

  5.1 通過實驗將學會:

   如何啟動一個MongoDB例項
   如何將3個MongoDB例項搭建成一個複製集
   如何對複製集執行引數做一些常規調整

  5.2 建立資料目錄

mkdir -p /data/db{1,2,3}

  5.3 準備配置檔案並啟動例項

   複製集的每個MongoDB程式應該位於不同的伺服器。我們現在在一臺機器上執行3個程式,因此要為他們各自配置:

  • 不同的埠(示例將使用28017、28019、28019)
  • 不同的資料目錄
    • /data/db1
    • /data/db2
    • /data/db3
  • 不同的日誌檔案路徑
    • /data/db1/mongod.log
    • /data/db2/mongod.log
    • /data/db3/mongod.log
  • 三個配置檔案:
  • /data/db1/mongod.conf
systemLog:
 destination: file
 path: /data/db1/mongod.log   # log path
 logAppend: true
storage:
 dbPath: /data/db1    # data directory
net:
 bindIp: 0.0.0.0
 port: 28017
replication:
 replSetName: rs0
processManagement:
 fork: true
  • /data/db2/mongod.conf
systemLog:
 destination: file
 path: /data/db2/mongod.log   # log path
 logAppend: true
storage:
 dbPath: /data/db2    # data directory
net:
 bindIp: 0.0.0.0
 port: 28018
replication:
 replSetName: rs0
processManagement:
 fork: true

  • /data/db3/mongod.conf
systemLog:
 destination: file
 path: /data/db3/mongod.log   # log path
 logAppend: true
storage:
 dbPath: /data/db3    # data directory
net:
 bindIp: 0.0.0.0
 port: 28019
replication:
 replSetName: rs0
processManagement:
 fork: true
  • 使用如下命令啟動MongoDB例項(成功啟動終端會顯示success)
./mongod -f /data/db1/mongod.conf 
./mongod -f /data/db2/mongod.conf 
./mongod -f /data/db3/mongod.conf 
  • 使用 ps -ef | grep mongod來確認已經正確執行
MongoDB學習4:MongoDB複製集機制和原理,搭建複製集

  5.4 配置複製集

  • 方法1(此方式需要hostname能被解析,輸入hostname -f可以檢視)
#假定使用28017做為主節點

./mongo --port 28017   # 進入mongodb的終端
> rs.initiate()

>rs.add("localhost:28018")  # 如果localhost不行可改為本機ip
>rs.add("localhost:28019")

  • 方法2
#假定使用28017做為主節點

./mongo --port 28017   # 進入mongodb的終端
 # 如果localhost不行可改為本機ip
> rs.initiate({
  _id:"rs0",
  members:[{
   _id:0,
   host:"localhost:28017"
  },{
   _id:1,
   host:"localhost:28018"
  },{
   _id:2,
   host:"localhost:28019"
  }]
})
  • 使用 rs.status() 可以檢視複製集狀態

  5.5 驗證複製集

  • MongoDB主節點進行寫入
# mongo localhost:28017
> db.test.insert({a:1})
> db.test.insert({a:2})
  • MongoDB從節點進行讀取
# mongo localhost:28018
> rs.salvaOk()
> db.test.find()

可以看到MongoDB幾乎是沒有延遲的,資料就可以同步到子節點上,建議在生產環境上一定要使用MongoDB的複製集

相關文章