Mongodb的oplogsize修改


前景:

    由於某些情況,我們必須修改oplog size來增大同步窗口期,例如業務的快速增長,延遲節點無法跟上Primary節點的oplog增長速度;MongoDB在3.6版本后才對oplogSize支持了動態修改,但MongoDB版本低於3.6版本則需要逐個剔除副本集逐個擴容,至此記錄修改oplogsize的步驟。

查詢oplogsize大小命令:

repset:PRIMARY> db.getReplicationInfo()            #查看 oplog 的狀態,輸出信息包括 oplog 日志大小,操作日志記錄的起始時間

repset:PRIMARY> db.printReplicationInfo()          #查看oplog的狀態、總大小、使用大小、存儲的時間范圍、記錄時長。

repset:PRIMARY> db.oplog.rs.stats().maxSize     #顯示當前的oplog大小 maxSize

repset:PRIMARY> db.getReplicationInfo()
{
    "logSizeMB" : 1755.03173828125,
    "usedMB" : 0.84,
    "timeDiff" : 861042,
    "timeDiffHours" : 239.18,
    "tFirst" : "Mon Jun 24 2019 16:18:20 GMT+0800 (CST)",
    "tLast" : "Thu Jul 04 2019 15:29:02 GMT+0800 (CST)",
    "now" : "Thu Jul 04 2019 15:29:06 GMT+0800 (CST)"
}
repset:PRIMARY> db.printReplicationInfo()
configured oplog size:   1755.03173828125MB
log length start to end: 861132secs (239.2hrs)
oplog first event time:  Mon Jun 24 2019 16:18:20 GMT+0800 (CST)
oplog last event time:   Thu Jul 04 2019 15:30:32 GMT+0800 (CST)
now:                     Thu Jul 04 2019 15:30:36 GMT+0800 (CST)

一、修改MongoDB3.6版本以上的oplog

  3.6版本后支持的動態擴容方法

1、修改之前oplogsize的大小:

repset:PRIMARY> db.getReplicationInfo()
{
    "logSizeMB" : 1755.03173828125,    #大小為1.8G
    "usedMB" : 0.83,
    "timeDiff" : 860512,
    "timeDiffHours" : 239.03,
    "tFirst" : "Mon Jun 24 2019 16:18:20 GMT+0800 (CST)",
    "tLast" : "Thu Jul 04 2019 15:20:12 GMT+0800 (CST)",
    "now" : "Thu Jul 04 2019 15:20:15 GMT+0800 (CST)"
}

登錄到mongo shell后查看oplog.rs集合大小

repset:PRIMARY> use local
switched to db local
repset:PRIMARY> db.oplog.rs.stats().maxSize
NumberLong(1840284160)  #單位為bytes,即1.8G

2、通過管理命令修改

repset:PRIMARY> use local
switched to db local
repset:PRIMARY> db.adminCommand({replSetResizeOplog:1,size:4096})   #單位為MB,擴容至4G
{
    "ok" : 1,
    "operationTime" : Timestamp(1562225042, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1562225042, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

3、驗證是否成功

repset:PRIMARY> db.oplog.rs.stats().maxSize
NumberLong("4294967296")

至此,Mongodb的oplogsize動態擴展成功。

注意:

   更改給定副本集成員 replSetResizeOplog的oplog大小不會更改副本集中任何其他成員的oplog大小必須replSetResizeOplog在群集中的每個副本集成員上運行 ,以更改所有成員的oplog大小。

   減小OPLOG大小並不能自動收回磁盤空間。您必須compact針對數據庫中的 oplog.rs集合運行localcompact 阻止它運行的數據庫上的所有操作。運行compact針對oplog.rs因此防止OPLOG同步。有關調整oplog和壓縮大小的過程 oplog.rs,請參閱更改Oplog的大小

二、修改MongoDB3.6版本以下的oplog

需求: Oplog擴容,盡量少的影響業務  

思路:先由從節點開始,一台一台的從復制集中剝離,修改,再回歸復制集,最后操作主節點來減少業務影響時間。

流程:先關閉一個從節點,去掉–replSet啟動參數,更換啟動端口–port,將節點以單機模式啟動。

備份:備份現有的oplog

詳細過程:

1、關閉從節點

[root@iZ2ze6rm1auwacy4tk6ucaZ ~]# ps -ef|grep mongo
root     28527     1  0 14:46 ?        00:00:17 mongod -f /etc/mongod1.conf
root     28605     1  0 14:46 ?        00:00:18 mongod -f /etc/mongod2.conf
root     28686     1  0 14:46 ?        00:00:12 mongod -f /etc/mongod3.conf
root     30794 28282  0 15:50 pts/0    00:00:00 grep mongo
[root@iZ2ze6rm1auwacy4tk6ucaZ ~]# mongod --shutdown -f /etc/mongod2.conf 
killing process with pid: 28605

2、修改從節點配置文件,

    注釋副本集配置參數並修改端口,及單擊模式啟動

[root@iZ2ze6rm1auwacy4tk6ucaZ ~]# mongod -f /etc/mongod2.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 30940
child process started successfully, parent exiting

注:此時停止掉副節點的依舊保持在副本集中,不過此時它的狀態為不可達,健康值為0。在作為單機模式啟動修改完成,再以副本集模式啟動即可。

3、備份節點oplog記錄

[root@iZ2ze6rm1auwacy4tk6ucaZ ~]# mongodump -h 172.17.136.124:27021 -d  local -c oplog.rs -o /root/oplog
2019-07-04T15:59:01.603+0800    writing local.oplog.rs to 
2019-07-04T15:59:01.630+0800    done dumping local.oplog.rs (8069 documents)

4、進入mongo,將現在的oplog中最新的位置復制到tmp表(local數據庫)中:

> use local
switched to db local
> db.temp.save( db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() )
WriteResult({ "nInserted" : 1 })
> db.temp.find()  #驗證記錄是否存在
{ "_id" : ObjectId("5d1db2646bebcb3f6483cce3"), "ts" : Timestamp(1562226683, 1), "h" : NumberLong("2207544736706975504") }

 5、刪除原有oplog集合

> db.oplog.rs.drop()
true

6、創建新的oplog集合,為4G

> db.runCommand({create:"oplog.rs",capped:true,size:(4*1024*1024*1024)})
{ "ok" : 1 }  #創建成功

7、將tmp中的數據存儲到新的oplog中,並驗證

> db.oplog.rs.save( db.temp.findOne() )
WriteResult({
    "nMatched" : 0,
    "nUpserted" : 1,
    "nModified" : 0,
    "_id" : ObjectId("5d1db2646bebcb3f6483cce3")
})
> db.oplog.rs.find()  #驗證
 { "_id" : ObjectId("5d1db2646bebcb3f6483cce3"), "ts" : Timestamp(1562226683, 1), "h" : NumberLong("2207544736706975504") }

8、關閉從節點,並恢復原有config配置,並在config中設置oplogSize為你之前設置的大小,並啟動。

    關閉從節點

[root@iZ2ze6rm1auwacy4tk6ucaZ ~]# mongod --shutdown -f /etc/mongod2.conf 
killing process with pid: 30940

    恢復原有配置文件時,要注意oplogSizeMB參數值的修改,修改為擴容后的值

#配置文件中指定oplog大小
replication: oplogSizeMB:
4096 replSetName: repset

    重新啟動從節點

[root@iZ2ze6rm1auwacy4tk6ucaZ ~]# mongod -f /etc/mongod2.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 31702
child process started successfully, parent exiting

9、登陸mongoshell檢查節點狀態及oplog大小

[root@iZ2ze6rm1auwacy4tk6ucaZ ~]# mongo 172.17.136.124:27018
repset:SECONDARY> db.getReplicationInfo() { "logSizeMB" : 4096, "usedMB" : 0.01, "timeDiff" : 0, "timeDiffHours" : 0, "tFirst" : "Thu Jul 04 2019 15:51:23 GMT+0800 (CST)", "tLast" : "Thu Jul 04 2019 15:51:23 GMT+0800 (CST)", "now" : "Thu Jul 04 2019 16:20:43 GMT+0800 (CST)" }

    至此,oplog大小修改完畢,依次修改其他節點,修改主節點是可先降級或直接關閉主節點

Primary>rs.stepDown()          ---可以更有效的產生選舉

補充:

1、若是在啟動副本集是指定了oplogsize大小。在動態擴容后,oplog.rs集合大小已發生變化,但配置文件中最初指定的oplogsize大小不變,並且重啟后依舊不變,但是oplogsize依舊是擴容之后的大小。

2、如果減小oplogsize的大小,可能會造成oplog記錄丟失,導致節點異常,故不可減小。

參考文檔:

https://docs.mongodb.com/manual/reference/command/replSetResizeOplog/#dbcmd.replSetResizeOplog  #oplog動態擴容官網資料

https://docs.mongodb.com/manual/core/replica-set-oplog/#oplog    #oplog及副本集相關文檔

http://www.mongoing.com/oplog #oplog擴容參考文檔

http://www.mongoing.com/blog/oplog-size #oplog大小設置估算

http://blog.itpub.net/31547523/viewspace-2214748/

https://www.cnblogs.com/operationhome/p/10688798.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM