溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MongoDB 更改 Oplog Size 大小

發(fā)布時間:2020-07-07 14:19:15 來源:網(wǎng)絡(luò) 閱讀:1763 作者:Professor哥 欄目:MongoDB數(shù)據(jù)庫

MongoDB 的副本集同步中 Oplog 占了非常關(guān)鍵的作用。


Oplog Size 可不可以隨意更改?

https://docs.mongodb.com/manual/reference/configuration-options/#replication.oplogSizeMB
官方配置文檔說明

replication.oplogSizeMB
	Type:?integer

	The?maximum?size?in?megabytes?for?the?replication?operation?log?(i.e.,?the?oplog).
	Starting?in?MongoDB?4.0,?the?oplog?can?grow?past?its?configured?size?limit?to?avoid?deleting?the?majority?commit?point.
	By?default,?the?mongod?process?creates?an?oplog?based?on?the?maximum?amount?of?space?available.?For?64-bit?systems,?the?oplog?is?typically?5%?of?available?disk?space.
	Once?the?mongod?has?created?the?oplog?for?the?first?time,?changing?the?replication.oplogSizeMB?option?will?not?affect?the?size?of?the?oplog.
	To?change?the?oplog?size?of?a?running?replica?set?member,?use?the?replSetResizeOplog?administrative?command.?replSetResizeOplog?enables?you?to?resize?the?oplog?dynamically?without?restarting?the?mongod?process.
	
	See?Oplog?Size?for?more?information.
	The?replication.oplogSizeMB?setting?is?available?only?for?mongod.

其中,默認oplog 大小如無配置指定,則默認為當前磁盤空間的 5% 在 64位操作系統(tǒng)上。

一次生成 oplog 空間則終生有效,后續(xù)通過更改 mongod.conf 配置文件并重啟服務,均不生效。

在 MongoDB 3.6+ 版本中新增可以動態(tài)調(diào)整副本集 Oplog Size 的指令,無需重啟 mongod 服務。


查看當前 mongod 服務中分配的 Oplog Size 大小

查看當前已經(jīng)分配的 oplog size 大小有幾個類似的指令

sh2:PRIMARY>?rs.printReplicationInfo()
configured?oplog?size:???12958.975341796875MB
log?length?start?to?end:?938secs?(0.26hrs)
oplog?first?event?time:??Thu?Apr?11?2019?15:03:05?GMT+0800?(CST)
oplog?last?event?time:???Thu?Apr?11?2019?15:18:43?GMT+0800?(CST)
now:?????????????????????Thu?Apr?11?2019?15:18:43?GMT+0800?(CST)


sh3:PRIMARY>?rs.printReplicationInfo()
sh3:PRIMARY>?db.printReplicationInfo()
sh3:PRIMARY>?db.getReplicationInfo()
{
????????"logSizeMB"?:?102400,
????????"usedMB"?:?905.03,
????????"timeDiff"?:?4704,
????????"timeDiffHours"?:?1.31,
????????"tFirst"?:?"Thu?Apr?11?2019?13:54:30?GMT+0800?(CST)",
????????"tLast"?:?"Thu?Apr?11?2019?15:12:54?GMT+0800?(CST)",
????????"now"?:?"Thu?Apr?11?2019?15:12:54?GMT+0800?(CST)"
}

logSizeMB / configured oplog size:?當前已配置的空間大小,單位 MB。
usedMB: 當前已使用空間大小,單位 MB。
tFirst / oplog first event time: 當前 oplog 最開始的記錄時間。
tLast / oplog last event time: 當前 oplog 最新的更改記錄時間。
timeDiff / log length start to end: 當前mongod中當前更改記錄時間 - 最開始記錄時間,單位 秒。
timeDiffHours / log length start to end: 當前mongod中當前更改記錄時間 - 最開始記錄時間,單位 小時。


規(guī)劃需要更改的 oplog size 大小

根據(jù)業(yè)務場景不同,在高峰期獲取 mongod 實例的寫入量

sh2:PRIMARY>?rs.printReplicationInfo()
configured?oplog?size:???12958.975341796875MB
log?length?start?to?end:?938secs?(0.26hrs)
oplog?first?event?time:??Thu?Apr?11?2019?15:03:05?GMT+0800?(CST)
oplog?last?event?time:???Thu?Apr?11?2019?15:18:43?GMT+0800?(CST)
now:?????????????????????Thu?Apr?11?2019?15:18:43?GMT+0800?(CST)

如上面所示,項目大多都是 insert、update 等更新操作,所以 12G 的 oplog 空間,在業(yè)務高峰只能夠存儲最近 900 秒的變更操作日志。

如果需要使 oplog 保留更長的周期,那么需要合理規(guī)劃更大的?oplog.rs?空間大小。


更改 oplog size 大小
概述

oplog在內(nèi)部作為上限集合存在,因此您無法在正常操作過程中修改其大小。
在大多數(shù)情況下,默認的oplog大小是可接受的大小;
但是,在某些情況下,您可能需要更大或更小的oplog。
例如,如果應用程序在短時間內(nèi)執(zhí)行大量多次更新或刪除,則可能需要更改oplog大小。

為了修改oplog大小,我們需要以此為復制集中的每個節(jié)點進行維護手動操作。該過程需要:停止 mongod 進程,并以非單節(jié)點方式啟動,修改oplog大小,再重啟該節(jié)點。

[重要]
請確保我們從副本集的從節(jié)點(Secondary)開始維護,并最后維護主節(jié)點(Primary)。

流程
  • 以單節(jié)點模式重啟節(jié)點

    在 Primary 節(jié)點上可以使用?rs.stepDown()?指令來強制手動切換為Secondary 節(jié)點。

  • 并保留就的 oplog 的條目作為查詢條件,清空?oplog.rs?集合并重新建立指定大小的?oplog.rs?集合。

  • 以副本集模式啟動 mongod 實例。


1. 首先在 secondary 節(jié)點上關(guān)閉 mongod 實例。比如通過?db.shutdownServer()?命令來關(guān)閉:

>?db.shutdownServer()

在其他端口上以單節(jié)點模式(不包含 --replSet 參數(shù))重新啟動?mongod?實例。命令如下:

#?sudo?-u?mongod?mongod?--port?37017?--dbpath?/var/lib/mongo

2.?復制現(xiàn)有 Oplog (可選)
我們可以選擇備份現(xiàn)有結(jié)點的 oplog 來以防萬一,命令如下:

mongodump?--port?37017?--db?local?--collection?'oplog.rs'

3. 以新的大小和 Seed Entry 重建 oplog
保存 oplog 中最新的條目。例如,連接進入?mongo Shell,并通過如下命令進入 local 數(shù)據(jù)庫:

>?use?local

在?mongo Shell?窗口中,我們也可以使用如下命令來設(shè)置?db:

>?db?=?db.getSiblingDB('local')

確保?local.temp?集合為空的:

>?db.temp.drop()

使用?natural order?排序來找到 oplog 中最后一條數(shù)據(jù),并通過?db.collection.save()?命令插入?local.temp?集合中:

>?db.temp.save(db.oplog.rs.find({},?{ts:?1,?h:?1}).sort({$natural:?-1}).limit(1).next())

檢驗?local.temp?集合中保存的最后一條 oplog 數(shù)據(jù):

>?db.temp.find()

4. 刪除已存在老的 Oplog 集合
通過如下命令在?local?庫中刪除老的oplog.rs?集合:

>?db?=?db.getSiblingDB('local')
>?db.oplog.rs.drop()

結(jié)果會返回?true

5. 建立新的 Oplog 集合大小
通過?create?命令來建立新的 oplog(新的大?。?。指定 size(單位是 bytes)。下面的命令會建立一個大小為?20 * 1024 * 1024 * 1024?也就是 20G 的 oplog 集合:

>?db.runCommand({create:?"oplog.rs",?capped:?true,?size:?(20?*?1024?*?1024?*?1024)})

命令執(zhí)行成功后會返回如下內(nèi)容:

{?"ok"?:?1?}

6. 將之前保存在?local.temp?集合中的老的最后一條 oplog 數(shù)據(jù)插入到新的 oplog 集合中。 例如:

>?db.oplog.rs.save(?db.temp.findOne()?)

通過如下命令來確認:

>?db.oplog.rs.find()

7. 結(jié)束,以副本集模式重啟 mongod 實例。

>?db?=?db.getSiblingDB('admin')
>?db.shutdownServer()
#?service?mongod?restart

該復制集將會恢復并會在其成為主節(jié)點之前 “catch up” 數(shù)據(jù)。

8. 重復以上操作在所有我們希望修改 oplog 大小的機器上。最后再在主節(jié)點上進行該操作。


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI