在生產(chǎn)環(huán)境新增secondary:10.9.197.6:27017 ,數(shù)據(jù)量140G,卻同步了一天還未追上數(shù)據(jù),通過如下方式查看同步情況:
創(chuàng)新互聯(lián)建站專注于中小企業(yè)網(wǎng)站建設(shè)、策劃制作、運行維護,主要提供一站式的企業(yè)網(wǎng)站建設(shè)服務(wù)。建站類型:公司網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司獨立站等。創(chuàng)新互聯(lián)不是單一的建網(wǎng)站,而是結(jié)合企業(yè)的建站目標去規(guī)劃網(wǎng)站怎么建,如何利于運營,尋求適合的建站方案。其次,網(wǎng)站后臺操作的便捷性也是網(wǎng)站制作過程中的重點,創(chuàng)新互聯(lián)建站的網(wǎng)站后臺簡單便捷,真正實現(xiàn)了零基礎(chǔ)操作。
查看主從復(fù)制狀態(tài)命令,以下兩種方式結(jié)果是一致的:
use admin
db.runCommand( { replSetGetStatus : 1 } )
指定的值不會影響命令的輸出。此命令提供的數(shù)據(jù)源自于包含在由副本集的其他成員發(fā)送到當(dāng)前實例的心跳中的數(shù)據(jù)。由于心跳的頻率,這些數(shù)據(jù)可能是幾秒鐘過期。詳情請參考官檔:https://docs.MongoDB.com/manual/reference/command/replSetGetStatus/
rs.status()
查看復(fù)制狀態(tài),發(fā)現(xiàn)狀態(tài)是"stateStr"
: "RECOVERING"。信息為"infoMessage" : "could not find
member to sync from",使用 rs.syncFrom("10.9.161.130:27017")也無法讓其繼續(xù)正常同步。具體信息如下:
如果不能停庫的情況下,顯然方法一是不合適的,應(yīng)該選擇方法二:調(diào)大oplog大小
方法1:不停服務(wù)情況下
參考官檔:https://docs.mongodb.com/v3.2/tutorial/change-oplog-size/
1) db.shutdownServer()
2) 用其他端口以單機模式重新啟動該實例,不使用--replSet參數(shù)
方法一:根據(jù)生產(chǎn)環(huán)境參數(shù)文件設(shè)置啟動mongo,即將非默認情況參數(shù)進行指定
如下參數(shù)根據(jù)生產(chǎn)參數(shù)文件來設(shè)置,情況不一:
/data/servers/app/mongodb-3.2.8/bin/mongod --port 37017 --dbpath /data/servers/data/mg27017/data/ --directoryperdb --wiredTigerDirectoryForIndexes --nojournal &
該方法較為麻煩,建議選擇下面的方法二:
方法二:將參數(shù)文件進行修改:注釋replSet部分,修改port為37017,然后以改完后的控制文件來啟動mongo
/data/servers/app/mongodb-3.2.8/bin/mongod -f /data/servers/data/mg27017/mongod.conf
下面截圖顯示的是只要更改的部分,端口號改為任意的沒被占用的即可,此處改為37017
netstat -anp | grep $port查看端口號是否已啟動
在單機模式(非replSet方式)下備份該37017端口已存在的oplog,oplog對應(yīng)的集合為local數(shù)據(jù)庫下的oplog.rs。下面為具體命令:
/data/servers/app/mongodb-3.2.8/bin/mongodump --db local --collection 'oplog.rs' --port 37017 --host=127.0.0.1 -uroot -p111111111 --authenticationDatabase=admin -o /data/servers/data/mg27017/dump
【命令說明】
-o(--out)是制定輸出目錄。該目錄需要執(zhí)行備份的用戶擁有相應(yīng)權(quán)限,不用提前創(chuàng)建
--authenticationDatabase是用戶名和密碼對應(yīng)的認證數(shù)據(jù)庫,如果環(huán)境不需要密碼認證,則-u、-p、--authenticationDatabase不需要指定
保存oplog中的最后一個條目
登陸local數(shù)據(jù)庫
use local
定義對象:db
db = db.getSiblingDB('local')
使用temp集合來保存最后一個條目,這個集合保證里面沒有數(shù)據(jù):db.temp.drop(),在刪除前確認下該數(shù)據(jù)是否可以刪除,如果不可以刪除,使用另一個集合也是一樣的。此處temp沒有數(shù)據(jù)
使用db.collection.save() 方法:找到自然順序的逆向排序后的最后一個條目,并將其保存到一個臨時的集合里面
db.temp.save( db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() )
插入后結(jié)果為
刪除local下的oplog.rs集合,結(jié)果返回為true
db = db.getSiblingDB('local')
db.oplog.rs.drop()
創(chuàng)建oplog.rs固定集合,設(shè)置大小為4G,該大小根據(jù)實際情況來定
db.runCommand( { create: "oplog.rs", capped: true, size: (4* 1024 *1024*1024) } )
將之前保存的oplog的最后一個條目插入到新的oplog里
db.oplog.rs.save(
db.temp.findOne() )
跟temp結(jié)果比對是一致的
關(guān)閉單機實例,要用admin才能關(guān)閉
use admin
db.shutdownServer()
將之前更改的操作還原,啟動mongo
/data/servers/app/mongodb-3.2.8/bin/mongod -f /data/servers/data/mg27017/mongod.conf
查看主從復(fù)制狀態(tài),確保狀態(tài)正常
db.runCommand( { replSetGetStatus : 1 } )或者rs.status()
對要更改oplog大小的所有secondary成員重復(fù)此過程。
對于主庫,需要先將主庫切成從庫,再重復(fù)上述oplog調(diào)整過程
rs.stepDown()
config=rs.conf()
config.members[2].priority = 6
rs.reconfig(config)
此處數(shù)字2為rs.conf()里要變成主庫的secondary所在的次序,從0開始算,與id無關(guān)。priority數(shù)字最大即變成主庫。舊的主庫調(diào)整完后,記得要將priority變?yōu)?。
方法2:停服務(wù)情況下
該方法操作最為簡便,但是需要停服務(wù)。具體步驟為
use admin
db.shutdownServer()
rm -rf /data/servers/data/mg27017/local/*
如果不確定誰是主庫,就mv下數(shù)據(jù)目錄
rm -rf /data/servers/data/mg27017/data/*
oplogSizeMB: 4096
/data/servers/app/mongodb-3.2.8/bin/mongod -f /data/servers/data/mg27017/mongod.conf
該方法會導(dǎo)致主庫如果異常,沒有從庫可切換,不建議使用該方式
設(shè)置多大的oplog合適呢,可以根據(jù)現(xiàn)在數(shù)據(jù)大小,io和大致的oplog window時間預(yù)估一個合適的大小
rs.printReplicationInfo()
log length start to end: 當(dāng)oplog寫滿時可以理解為時間窗口
oplog last event time: 最后一個操作發(fā)生的時間