MongoDB 3 2 oplog刪除策略優化

2021-09-23 19:00:40 字數 1336 閱讀 7399

oplog(local.oplog.rs集合)預設情況下配置為可用磁碟空間的5%,當oplog寫滿時,就會開始刪除最先寫入的oplog,一次正常的insert操作包含如下步驟:

將文件寫入指定的集合

將寫入操作記錄到oplog

如果oplog滿了,刪除最先寫入的oplog

mongodb 3.2為了提公升寫入效能,使用wiredtiger引擎時,針對local.oplog.rs這個集合的刪除策略進行了優化,主要改進:

將刪除動作從使用者的寫入路徑移除,放到後台執行緒執行

批量刪除,並不是oplog一滿就立馬觸發刪除,而是一次刪除一批

monogd啟動時,會根據oplog的最大位元組數將整個集合分為10-100個stone(可以理解為oplog的一段資料,包含多個文件,stone的具體個數oplogsizemb的配置相關)。

wiredtigerrecordstore::oplogstones::oplogstones(operationcontext* txn, wiredtigerrecordstore* rs)

: _rs(rs)

其中_numstonestokeep為oplog應該保持的stone個數,而_minbytesperstone代表每個stone的最小位元組數。

接下來,會根據oplog當前的大小以及_minbytesperstone來估算下,當前的oplog大致包含的stone數量,並通過取樣的方式來獲取每個stone的起始位置(不能保證每個stone的大小跟預期完全一樣),然後將所有的stone按順序儲存到乙個佇列中。

mongod在服務寫請求的過程中,每次都會記錄下新產生oplog的大小,當新產生的oplog的總量超過_minbytesperstones時,就會產生乙個新的stone加入到佇列中。

void wiredtigerrecordstore::oplogstones::createnewstoneifneeded(recordid lastrecord) 

// ...

oplogstones::stone stone = ;

_stones.push_back(stone);

_pokereclaimthreadifneeded(); // 喚醒後台**oplog空間的執行緒

}

當佇列中的stone數量超過_numstonestokeep,後台執行緒就會刪除最老的stone裡的資料,來**oplog的儲存空間。

createcollection

wiredtiger random cursor

MongoDB更新同步的oplog位置

在mongodb中,副本集節點之間為了保持一致性,需要通過oplog的同步與回放來進行。mongodb採用的是節點向源節點主動拉取的方式,從源節點拉取oplog,目的節點需要及時通知其他節點它的最新的同步到的時間點。如上圖所示,2個secondary從primary上面拉取oplog,每當secon...

利用mongodb的oplog進行對庫進行增量備份

實驗環境 system centos linux release 7.7.1908 core mongo v4.0.0 開啟許可權驗證環境 oplog詳細介紹 oplog官方介紹 oplog的概念 oplog operations log 是乙個特殊的上限集合,它儲存了修改儲存在資料庫中的資料的所有...

Mongodb全備 增備 oplog恢復誤刪資料

買了兩瓶進口白蘭地,想著品嚐品嚐,我基本上一年也不喝酒,當然除了過年的時候是避免不了的。在上班期間邊喝邊醉邊工作。太勁大了,一看才四十度。感覺比國內的後勁大得多,基本上喝上六七口就上頭,完全扛不住的節奏。我都沒敢想伏特加,估計更扛不住。不過酒還是要少喝。言歸正傳,mongo這幾年也好多公司再用了,於...