背景:網絡
線上架構爲MongoDB副本集,三節點外加一隱藏備份節點,因爲備份節點所在機房關停須要遷移備份節點至新機房架構
問題發現:app
遷移過程須要全量拷貝數據至新機房,數據拷貝至新機房,從新啓動備份節點,發現狀態一直RECOVERING狀態性能
問題分析:文檔
排查發現oplogsize設置爲50G,而數據量大小爲150G左右,新機房機器配置爲sas盤,寫入性能不好,故網絡傳輸很慢,傳輸大約2個小時左右,而在這兩個小時期間,發現業務有大量的update操做,致使oplog被覆蓋。get
問題處理:同步
一、因爲是備份節點,不會暫時影響到業務,跟業務溝通找到業務低峯期大約在下午3-6點時段;it
二、查找是否能夠在線修改oplogsize大小,發現當前版本(3.2.20)還不支持,故關閉備份節點,mv數據文件到backup目錄下,開啓備份節點從新全量拉取數據,而後在同步oplog。幸運的是,業務給了確實未作大量的修改類操做,oplog未被覆蓋,數據同步成功,開啓監控,完成。io
技術難點:
因爲對MongoDB是新手,查閱文檔發現MongoDB3.6才能夠在線修改oplogsize
舊版本修改只能經過一下方法修改
oplog大小的指定
在mongod建立oplog大小以前,能夠replication.oplogSizeMB參數指定,若是已經建立好了oplog大小,後續須要改變的話,步驟以下:
方法一:簡單粗暴型
將節點停掉,修改配置文件中oplog大小,而後刪掉data數據目錄下的全部文件,啓動節點,從新拉取數據;要一個節點一個節點作
方法二:稍微複雜點的
a、關閉從節點
db.shutdownServer()
b、註釋掉副本集參數replSet,而後做爲一個單實例啓動該節點
c、建立oplog的備份
mongodump --host=10.110.98.189 --port=9311 -udba -pxxxxxx --authenticationDatabase=admin -d local -c 'oplog.rs' -o /data1/LSW_product_picture_mongo/backup
d、確認local下沒有tmp表,而後將oplog的最新一條記錄保存到tmp表中
use local
db.temp.drop()
db.temp.save( db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() )
db.temp.find()
e、刪掉當前的oplog表
db = db.getSiblingDB('local')或者use local
db.oplog.rs.drop()
f、建立新的oplog大小,好比50g:
db.runCommand( { create: "oplog.rs", capped: true, size: (50 * 1024 * 1024 * 1024) } )
g、將剛纔保存在temp中的oplog插入新創建的oplog表中
db.oplog.rs.save( db.temp.findOne() )
db.oplog.rs.find()
h、去掉副本集參數replSet的註釋,從新啓動該節點