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這幾年也好多公司再用了,於...