1.複製集的作用
1.1 MongoDB複製集的主要意義在於實現服務高可用
1.2 它的實現依賴於兩個方面的功能:
· 資料寫入時將資料迅速複製到另一個獨立節點上 · 在接收寫入的節點發生故障時自動選舉出一個新的替代節點
1.3 在實現高可用的同時,複製集實現了其他幾個附加作用:
· 資料分發:將資料從一個區域複製到另一個區域,減少另一個區域的讀延遲 · 讀寫分離:不同型別的壓力分別在不同的節點上執行 · 異地容災:在資料中心故障時快速切換到異地
2.典型複製集結構
2.1 一個典型的複製集由3個以上具有投票權的節點組成,包括:
· 一個主節點(PRIMARY):接受寫入操作和選舉時投票 · 兩個(或多個)從節點(SECONDARY):複製主節點上的新資料和選舉時投票 · 不推薦使用Arbiter(投票節點,即不做資料儲存只用來投票)
3. 資料是如何複製的?
- 當一個修改操作,無論是插入、更新或刪除,到達主節點時,它對資料的操作將被記錄下來(經過一些必要的轉換),這些記錄成為oplog
- 從節點通過在主節點上開啟一個tailable遊標不斷獲取新進入主節點的oplog,並在自己的資料上回放,以此保持與主節點資料一致
4. 通過選舉完成故障恢復
- 具有投票權的節點之間兩兩互相傳送心跳(預設2s)
- 當5次心跳未收到時判斷為節點失聯
- 如果失聯的是主節點,從節點會發起選舉,選出新的主節點
- 如果失聯的是從節點則不會產生新的選舉
- 選舉基於 RAFT一致性演算法 實現,選舉成功的必要條件是大多數投票節點存活
- 複製集最多可以有50個節點,但具有投票權的節點最多7個
影響選舉的因素
- 整個叢集必須有大多數節點存活
- 被選舉為主節點的節點必須:
- 能夠與多數節點建立連線
- 具有較新的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
來確認已經正確執行
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()