MongoDB復制集及管理
MongoDB復制集概述
什麽是復制集
- 復制集是額外的數據副本,是跨多個服務器同步數據的過程,復制集提供了冗余並增加了數據可用性,通過復制集可以對硬件故障和中斷的服務進行恢復。
-
復制集的優點如下:
1)、讓數據更安全;
2)、高數據可用性;
3)、災難恢復;
4)、無停機恢復(如備份、索引重建、故障轉移);
5)、讀縮放(額外的副本讀取);
6)、副本集對應用程序是透明的;
復制集工作原理
- MongoDB的復制集至少需要兩個節點。其中一個是主節點(Primary),負責處理客戶端的請求,其余的都是從節點(Secondary),負責復制主節點上的數據。
- MongoDB各個節點的搭配方式為:一主一從或一主多從。主節點記錄其上的所有操作到oplog中,從節點定期輪詢主節點獲取這些操作,然後對自己的數據副本執行這些操作,從而保證從節點的數據與主節點一致。
- 客戶端在主節點寫入數據,在從節點讀取數據,主節點與從節點進行交互保障數據的一致性。如果其中一個節點出現故障,其他節點馬上會將業務接過來而無需停機操作。
-
復制集特點如下:
1)、N個節點的群集;
2)、任何節點可以做主節點;
3)、所有寫入操作都在主節點上;
4)、自動故障轉移;
5)、自動恢復;
MongoDB復制集部署
1、配置復制集
- 1)、創建多實例;
mkdir -p /data/mongodb/mongodb{2,3,4} #創建數據目錄
mkdir /data/logs
touch /data/logs/mongodb{2,3,4}.log #創建日誌文件
cd /data/logs
chmod 777 *.log #賦予權限
vi /etc/mongod.conf
bindIp: 0.0.0.0 #監聽地址
path: /data/mongodb/mongod.log #日誌文件存儲目錄
dbPath: /data/mongodb/mongo #數據存儲目錄
port: 27017 #監聽端口;每一個實例端口不一樣
---省略內容---
replication:
replSetName: kgcrs #復制集的名稱
cp mongod.conf mongod2.conf
cp mongod.conf mongod3.conf
cp mongod.conf mongod4.conf
- #編輯完成後,復制三分,作為其他三個實例的配置文件,將mongod2.conf中的port參數設置為27018,mongod3.conf中的port參數設置為27019,mongod4.conf中的port參數設置為27020,同樣也將padb和thPath參數修改為對應的路徑值。
mongod -f /etc/mongod.conf #啟動所有實例
mongo --port 27017
mongod -f /etc/mongod2.conf
mongo --port 27018
mongod -f /etc/mongod3.conf
mongo --port 27019
mongod -f /etc/mongod4.conf
mongo --port 27020
- 2)、初始化配置復制集
mongo
cfg={"_id":"kgcrs","members":[{"_id":0,"host":"192.168.27.28:27017"},{"_id":1,"host":"192.168.27.128:27018"},{"_id":2,"host":"192.168.27.128:27019"}]} #定義cfg初始化參數
rs.initiate(cfg) #初始化啟動復制集
- 3)、增加和刪除節點
mongo
rs.add("192.168.27.128:27020") #添加節點
rs.status() #查看狀態
rs.remove("192.168.27.128:27020") #刪除節點
re.status #查看狀態,新添加的節點已被刪除
-
4)、模擬故障自動切換與手動切換
- 模擬故障自動切換
mongo -f /etc/mongod.conf --shutdown #關閉復制集當前主節點
mongo --port 27018 #進入到第二個節點中
rs.ststus() #查看狀態
- 手動切換
mongod -f /etc/mongod.conf #開啟第一個節點
kgcrs:PRIMARY> rs.freeze(30) #暫停30s不參與選舉
mongo --port 27018
kgcrs:PRIMARY> rs.stepDown(60,30) #交出主節點位置,維持從節點狀態不少於60秒,等待30秒使主節點和從節點日誌同步
rs.ststus() #查看狀態
MongoDB復制集選舉原理
1、復制原理
- 復制是基於操作日誌oplog,相當於MySQL中的二進制日誌,只記錄發生改變的記錄。復制是將主節點的oplog日誌同步並應用到其他從節點的過程。
2、選舉的原理
-
節點類型分為標準(host)節點、被動(passive)節點和仲裁(arbiter)節點。
-
1)、只有標準節點可能被選舉為活躍(primary)節點,有選舉權。被動節點有完整副本,不可能成為活躍節點,有選舉權。仲裁節點不復制數據,不可能成為活躍節點,只有選舉權。
- 2)、標準節點與被動節點的區別:priority值高者是標準節點,低者則為被動節點。
-3)、選舉規則是票數高者獲勝,priority是優先權為0~1000的值,相當於額外增加0~1000的票數。選舉結果:票數高者獲勝;若票數相同,數據新者獲勝。
3、配置復制集的優先級並查看oplog日誌
mongon
cfg={"_id":"kgcrs","members":[{"_id":0,"host":"192.168.27.128:27017","priority":100},{"_id":1,"host":"192.168.27.128:27018","priority":100},{"_id":2,"host":"192.168.27.128:27019","priority":0},{"_id":3,"host":"192.168.27.128:27020","arbiterOnly":true}]} #配置4個節點的復制集
rs.reconfig(cfg)
kgcrs:PRIMARY> rs.isMaster() #查看狀態信息
kgcrs:PRIMARY> use kgc
kgcrs:PRIMARY> db.t1.insert({"id":1,"name":"tom"}) #插入數據
kgcrs:PRIMARY> db.t1.insert({"id":2,"name":"jerry"}) #插入數據
kgcrs:PRIMARY> db.t1.find() #查看集合中的數據
kgcrs:PRIMARY> db.t1.update({"id":2},{$set:{"name":"jack"}}) #更改
kgcrs:PRIMARY> db.t1.remove({"id":1}) #刪除
kgcrs:PRIMARY> use local
kgcrs:PRIMARY> show collections #查看集合
顯示
oplog.rs
kgcrs:PRIMARY> db.oplog.rs.find() #查看日誌記錄所有操作
#oplog會包含所有對數據有修改的操作;但查詢操作不會記錄。
4、模擬節點故障
-1)、如果主節點出現故障,另一個標準節點將會選舉成新的主節點;
mongod -f /etc/mongod.conf --shutdown #關閉第一個節點服務器
mongo --port 27018 #此時會選舉第二個標準節點為主節點
rs.status() #查看狀態信息
- 2)、當所有標準節點都出現故障,被動節點也不可能成為主節點;
mongod -f /etc/mongod2.conf --shutdown #關閉第二個節點服務器
mongo --port 27019 #此時被動節點不能成為主節點
rs.status() #查看狀態信息
MongoDB復制集管理
允許從節點讀取數據
- 默認MongoDB復制集的從節點不能讀取數據,可以使用rs.slaveOK()命令能夠在從節點讀取數據。
查看復制集狀態信息
- 可以使用rs.printReplicationInfo()查看日誌大小、時間範圍;使用rs.printSlaveReplicationInfo()查看復制的節點、時間;
更改oplog大小
mongo --port 27018
rs.printReplicationInfo() #查看日誌大小、時間範圍
use admin
db.shutdownServer()
exit
vim /etc/mongod2.conf #註銷replication:相關啟動參數,並修改port端口號27028
net:
port: 27028
#replication:
#replSetName: kgcrs
mongod -f /etc/mongod2.conf #單實例模式啟動
mongodump --port 27028 --db local --collection ‘oplog.rs‘ #全備當前節點的所有oplog記錄
mongo --port 27028
use local
db.oplog.rs.drop() #刪除原日誌文件
db.runCommand( { create: "oplog.rs", capped: true, size: (2 1024 1024 * 1024) } ) #重建新的日誌文件,並指定大小
use admin
db.shutdownServer() #關閉服務
exit
vim /etc/mongod2.conf
net:
port: 27018
replication:
replSetName: kgcrs
oplogSizeMB: 2048 #指定大小
mongod -f /etc/mongod2.conf #啟動
mongo --port 27018 #進入第二個節點
rs.printReplicationInfo() #查看日誌大小、時間範圍
exit
mongo #進入主節點
rs.stepDown() #有效產生選舉;讓出主節點,第二個會變成主節點
部署認證的復制
use admin #在主節點中創建一個用戶
db.createUser({"user":"root","pwd":"123","roles":["root"]})
exit
vim /etc/mongod.conf #編輯配置文件;4個都需添加如下內容
security:
keyFile: /usr/bin/kgcrskey1 #秘鑰文件位置
clusterAuthMode: keyFile #驗證模式為秘鑰驗證模式
cd /usr/bin/ #寫入四個實例的秘鑰文件(內容需一樣)
echo "kgcrs key"> kgcrskey1
echo "kgcrs key"> kgcrskey2
echo "kgcrs key"> kgcrskey3
echo "kgcrs key"> kgcrskey4
chmod 600 kgcrskey{1..4}
#四個實例依次進行重啟,並進入主節點進行驗證;
show dbs #無法查看數據庫
rs.status() #無法查看復制集
use admin #身份登錄驗證
db.auth("root","123")
rs.status() #可以查看數據庫
show dbs #可以查看復制集
MongoDB復制集及管理