oplog 与 journal是什么关系?谁会先写入?


  • 註冊用戶

    oplog 与 journal是什么关系?谁会先写入?


  • Lv 1

    • oplog 與 journal 是 MongoDB 裡不同層次的概念,放在一起比先後本身是不合理的。
    • oplog 在 MongoDB 裡是一個普通的集合,所以 oplog 的寫入與普通集合的寫入並無區別。
    • 一次寫入,會對應資料、索引,oplog的修改,而這3個修改,會對應一條journal操作日誌。

    MongoDB journal 與 oplog,究竟誰先寫入?最近經常被人問到,本文主要科普一下 MongoDB 裡 oplog 以及 journal 這兩個概念。

    journal

    journal 是 MongoDB 存儲引擎層的概念,目前 MongoDB主要支持 mmapv1、wiredtiger、mongorocks 等存儲引擎,都支援配置journal。

    MongoDB 所有的資料寫入、讀取最終都是調存儲引擎層的介面來存儲、讀取資料,journal 是存儲引擎存儲資料時的一種輔助機制。

    以wiredtiger 為例,如果不配置 journal,寫入 wiredtiger 的資料,並不會立即持久化存儲;而是每分鐘會做一次全量的checkpoint(storage.syncPeriodSecs配置項,預設為1分鐘),將所有的資料持久化。如果中間出現宕機,那麼資料只能恢復到最近的一次checkpoint,這樣最多可能丟掉1分鐘的資料。

    所以建議「一定要開啟journal」,開啟 journal 後,每次寫入會記錄一條操作日誌(通過journal可以重新構造出寫入的資料)。這樣即使出現宕機,啟動時 Wiredtiger 會先將資料恢復到最近的一次checkpoint的點,然後重放後續的 journal 操作日誌來恢復資料。

    MongoDB 裡的 journal 行為 主要由2個參數控制,storage.journal.enabled 決定是否開啟journal,storage.journal.commitInternalMs 決定 journal 刷盤的間隔,默認為100ms,用戶也可以通過寫入時指定 writeConcern 為 {j: ture} 來每次寫入時都確保 journal 刷盤。

    oplog

    oplog 是 MongoDB 主從複製層面的一個概念,通過 oplog 來實現複製集節點間資料同步,用戶端將資料寫入到 Primary,Primary 寫入資料後會記錄一條 oplog,Secondary 從 Primary(或其他 Secondary )拉取 oplog 並重放,來確保複製集裡每個節點存儲相同的資料。

    oplog 在 MongoDB 裡是一個普通的 capped collection,對於存儲引擎來說,oplog只是一部分普通的資料而已。

     文章來源:  

    本帖下載内容已隐藏,请登入以查看隐藏内容!


  • 註冊用戶

    原來如此,感謝分享



    1. 受教了 對觀念的釐清很有幫助

  • 註冊用戶

    學習了~ 感謝分享~


登录后回复
 

与 萌阔论坛 的连接断开,我们正在尝试重连,请耐心等待