mongodb線上調整Oplog Size的值

水逸冰發表於2021-07-25
1.版本差異
3.4及之前的版本,改變oplog的大小需要刪除然後重建local.oplog.rs集合。
3.6滯後可以使用replSetResizeOplog命令線上重建。從mongo 4.0開始,local.oplog.rs集合更是無法刪除了,老的方式徹底走不通了。
2.線上修改
注意修改值必須在990M以上。
先從從節點調整,最後調整主節點
最後,不寫入配置檔案重啟也會生效。
firstset:SECONDARY> use local
switched to db local
firstset:SECONDARY> db.oplog.rs.stats().maxSize
1038090240
firstset:SECONDARY> db.adminCommand({replSetResizeOplog: 1, size: 1000})
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1627203194, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1627203194, 1)
}
firstset:SECONDARY> db.oplog.rs.stats().maxSize
1048576000
依次執行所有節點,主節點最後。
arbiter仲裁節點執行會報錯
firstset:ARBITER> use local
switched to db local
firstset:ARBITER> db.oplog.rs.stats().maxSize
firstset:ARBITER> db.adminCommand({replSetResizeOplog: 1, size: 1000})
{
"ok" : 0,
"errmsg" : "oplog does not exist",
"code" : 26,
"codeName" : "NamespaceNotFound"
}
3.壓縮oplog,回收空間
4.4版本之前,當執行壓縮oplog的時候,主從複製將會暫停。4.4之後,即使在壓縮的時候,主從複製不再受到影響。
調整完oplog大小後,空間不會被主動回收,可以用compact回收空間
從庫直接執行:
firstset:SECONDARY> use local
switched to db local
firstset:SECONDARY> db.runCommand({ "compact" : "oplog.rs" })
{ "bytesFreed" : 0, "ok" : 1 }
主庫執行會報錯:
firstset:PRIMARY> use local
switched to db local
firstset:PRIMARY> db.runCommand({ "compact" : "oplog.rs" })
{
"ok" : 0,
"errmsg" : "will not run compact on an active replica set primary as this is a slow blocking operation. use force:true to force",
"$clusterTime" : {
"clusterTime" : Timestamp(1627203956, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1627203956, 1)
}
可以使用force強制執行:
use local
db.runCommand({ "compact" : "oplog.rs" ,"force":true})
也可以服務降級後執行,但是這會觸發主從切換,生產環境慎用:
firstset:PRIMARY> rs.stepDown()
{
       "ok" : 1,
       "$clusterTime" : {
               "clusterTime" : Timestamp(1627204246, 1),
               "signature" : {
                       "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                       "keyId" : NumberLong(0)
               }
       },
       "operationTime" : Timestamp(1627204246, 1)
}
firstset:SECONDARY> db.runCommand({ "compact" : "oplog.rs" })
{ "bytesFreed" : 0, "ok" : 1 }


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

相關文章