mongodb 藉助一致性全備份加oplogs來新增新節點

賀子_DBA時代發表於2019-12-15
一致性備份+oplogs
如果採用直接rs.add的方法新增新節點,需要保證oplog不被覆蓋並且需要評估同步oplog的流量影響
問題,所以(一致性備份+oplogs)是我們通常進行橫向複製集新增secondary節點的方法,
當資料量大的時候,需要採用下面的方法:
環境描述
主節點 10.9.21.114:27017
兩個從節點
10.9.21.178:27017
10.9.21.179:27017
目標:用一致性快照方式新增第三個從節點10.9.21.115:27017
整體步驟簡述:
1)主節點或者其中一個從節點上進行一致性快照備份;
2)從節點上進行一致性快照恢復,僅僅對資料部分進行恢復,暫時不要對oplog進行恢復;
3)初始化oplog.rs集合,並恢復oplog記錄,恢復oplog記錄是為了告訴該節點從哪裡去讀取主庫的oplog,同時如果oplog為空,就會進行initial sync初始化,而初始化的時候會把原來的資料都刪除,所以需要恢復oplog;
4)初始化local資料庫的其他兩個集合db.replset.election(告訴目前的主節點是誰),db.system.replset(儲存的是副本集節點資訊,當新增進去之後可以自行同步主節點資料,也就是說可以不必恢復它)
5)修改資料庫配置並重啟資料庫(這一步操作前例項不開啟認證模式、複製集的配置);
6)用rs.add("HOST_NAME:PORT")命令將從節點新增進叢集;
7).用rs.status()觀察同步狀態並校驗資料的完整和一致性;
一.主節點或者其他兩個從節點上備份資料,我選擇的是一個從節點:
首先在主節點執行insert操作,模擬線上的業務,同時也可以作為最後驗證節點新增正常的依據:
MongoDB Enterprise liuhe_rs:PRIMARY> use liuwenhe
switched to db liuwenhe
MongoDB Enterprise liuhe_rs:PRIMARY> for (var i = 0; i < 100000; i++) {     db.hezi.insert({id: i}); }
同時執行備份操作,如下,等我備份完成,前面的插入操作還沒有結束!
[mongod@beijing-fuli-hadoop-04 ~]$ mongodump  -h 10.9.21.179 -u liuwenhe -p  liuwenhe  --authenticationDatabase admin --oplog -o /data/mongodb/backup/
二.將備份檔案scp到192.168.0.3上並進行恢復:
scp  -r  /data/mongodb/backup  mongod@10.9.21.115:/data/mongodb/backup/
三.第三個節點以單例項方式啟動:
備註:需要註釋掉以下副本集引數
vi /etc/mongod.conf
#replication:
#    oplogSizeMB: 51200
#    replSetName: liuhe_rs
#security:
#   keyFile: /data/mongodb/config/mongodb.key
#   authorization: enabled
[mongod@beijing-fuli-hadoop-03 /]$ /usr/bin/mongodb/bin/mongod  -f /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 60522
child process started successfully, parent exiting
四:在10.9.21.115上進行一致性快照恢復:
[mongod@beijing-fuli-hadoop-03 /data/mongodb/backup/backup]$ mongorestore   --oplogReplay
--dir /data/mongodb/backup/backup/
五:建立oplog.rs集合並初始化大小;
MongoDB Enterprise > use local
switched to db local
註釋:因為一致性全備份的時候並不會備份local和config庫,並且新建立啟動的mongod例項的local庫下只有startup_log這個集合如下所示:
MongoDB Enterprise > show collections;
startup_log
MongoDB Enterprise > db.createCollection("oplog.rs",{"capped":true,"size":100000000})
{ "ok" : 1 }
註釋:其中capped:true表示建立的集合是迴圈覆蓋的,限制大小的;建立固定集合。固定集合是指有著固定大小的集合,當達到最大值時,它會自動覆蓋最早的文件。size單位是KB
六:恢復一致性備份的oplog.rs集合的資料到10.9.21.115:
[mongod@beijing-fuli-hadoop-03 /data/mongodb/backup/backup]$ mongorestore -d local -c oplog.rs  /data/mongodb/backup/backup/oplog.bson
2019-12-13T22:29:33.370+0800    checking for collection data in /data/mongodb/backup/backup/oplog.bson
2019-12-13T22:29:33.371+0800    restoring local.oplog.rs from /data/mongodb/backup/backup/oplog.bson
2019-12-13T22:29:33.433+0800    no indexes to restore
2019-12-13T22:29:33.433+0800    finished restoring local.oplog.rs (1378 documents)
2019-12-13T22:29:33.433+0800    done
七:需要查詢主節點replset.election集合的資料並將這些資料儲存到10.9.21.115節點
在主節點21.114上的操作:
MongoDB Enterprise liuhe_rs:PRIMARY>  use local
switched to db local
MongoDB Enterprise liuhe_rs:PRIMARY>  db.replset.election.find()
{ "_id" : ObjectId("5dcfb9112670e3e338d03747"), "term" : NumberLong(7), "candidateIndex" : NumberLong(2) }
10.9.21.115節點上儲存主節點(21.114)上replset.election集合的資料內容:
MongoDB Enterprise > use  local
switched to db local
MongoDB Enterprise > db.replset.election.save({ "_id" : ObjectId("5dcfb9112670e3e338d03747"), "term" : NumberLong(7), "candidateIndex" : NumberLong(2) })
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5dcfb9112670e3e338d03747")
})
八:關閉第三個從節點,以副本集方式啟動mongodb:
MongoDB Enterprise > use admin
switched to db admin
MongoDB Enterprise >  db.shutdownServer()
2019-12-13T22:36:36.935+0800 I NETWORK  [js] DBClientConnection failed to receive message from 127.0.0.1:27017 - HostUnreachable: Connection closed by peer
server should be down...
九:以副本集方式啟動mongodb
修改第三個從節點配置,註釋去掉:
vi /etc/mongod.conf
#replication:
#    oplogSizeMB: 51200
#    replSetName: liuhe_rs
#security:
#   keyFile: /data/mongodb/config/mongodb.key
#   authorization: enabled
[mongod@beijing-fuli-hadoop-03 ~]$ /usr/bin/mongodb/bin/mongod  -f /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 64136
child process started successfully, parent exiting
十:主節點執行新增節點操作
MongoDB Enterprise liuhe_rs:PRIMARY> rs.add("10.9.21.115:27017")
{
"ok" : 1,
"operationTime" : Timestamp(1576247871, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1576247871, 1),
"signature" : {
"hash" : BinData(0,"p3g5oVNzyiHogsBYfSCpzrBpIks="),
"keyId" : NumberLong("6758082305262092289")
}
}
}
十一:驗證是否成功:
1.rs.status()可以看到剛加入的21.115的狀態
MongoDB Enterprise liuhe_rs:PRIMARY> rs.status()
2.rs.printSlaveReplicationInfo()檢視複製的狀態,如下可以看到21.115的資訊:
MongoDB Enterprise liuhe_rs:PRIMARY> rs.printSlaveReplicationInfo()
source: 10.9.21.178:27017
syncedTo: Fri Dec 13 2019 22:39:59 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
source: 10.9.21.179:27017
syncedTo: Fri Dec 13 2019 22:39:59 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
source: 10.9.21.115:27017
syncedTo: Fri Dec 13 2019 22:39:59 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
3.在32.115上檢視hezi的集合的資料量,這個是最關鍵的驗證,因為你一致性備份的時候,同時還有操作,如果資料量是一樣的,那麼也就證明,你的21.115節點新增是沒有問題了,資料開始同步了
MongoDB Enterprise liuhe_rs:SECONDARY> rs.slaveOk()
MongoDB Enterprise liuhe_rs:SECONDARY> use liuwenhe
switched to db liuwenhe
MongoDB Enterprise liuhe_rs:SECONDARY> db.hezi.count()
221323
在21.114上檢視hezi集合的資料量:
MongoDB Enterprise liuhe_rs:PRIMARY> use liuwenhe
switched to db liuwenhe
MongoDB Enterprise liuhe_rs:PRIMARY> db.hezi.count()
221323
對比發現資料是一樣的,說明新增節點的工作完成了。。。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29654823/viewspace-2668650/,如需轉載,請註明出處,否則將追究法律責任。

相關文章