mongodb日誌

MongoDB使用提早寫日誌到磁盤journal來保證寫操做的持續性,並提供崩潰恢復。在將數據變更寫入數據文件以前,MongoDB將更改寫入journal。若是MongoDB進程須要終止或者在將更改從journal寫入數據文件以前遇到錯誤,MongoDB可以從新執行寫操做來維持數據庫的一致性。html

若是沒有journal,若是mongod意外退出,你要預設你的數據處於不一致狀態,須要進行repair,或者最好從副本集中選擇一個數據一致的成員,從新進行數據同步。web

啓用了journal以後,若是mongod意外退出,程序能夠從journal中恢復出任何數據,數據仍舊處於一致性狀態。默認狀況下,沒有記錄到journal的寫入內容的丟失不超過100毫秒。mongodb

啓用了journal,若是你須要整個數據集都駐留在內存裏,你須要足夠的RAM來容納整個數據集以及「寫工做集(write working set)」,「寫工做集」是你但願看到的私有視圖重映射間的惟一數據(The 「write working set." is the amount of data you expect to see written between re-mappings of the private view),更多信息,請參考Storage Views used in Journalingshell

重要數據庫

在 2.0 版更改: For 64-bit builds of mongod, journaling is enabled by default. For other platforms, see journal.緩存

步驟

啓用journaling

默認64位操做系統,啓用了journalling安全

顯示啓用journalling,啓動mongod時添加參數--journalapp

若是journal文件存在,mongod啓動後,進程須要預配置新的日誌文件。在這個操做過程當中,只有完成了預配置,mongod纔開始監聽鏈接:對有些操做系統,這可能持續幾分鐘。在這個過程當中,應用和mongo shell不可用。less

 

禁用journaling

警告性能

生產系統不要禁用journaling。若是你的mongod實例由於某種緣由意外未乾淨退出,且你沒有運行journaling,這種狀況下你須要從未受影響的副本集成員中或者備份中恢復數據。

要禁用journaling,啓動mongod添加參數--nojournal

獲取提交確認

你能夠經過食用getLastError命令和j參數來獲取提交確認,詳細信息,參考Internal Operation of write concern

避免預配置帶來的延遲

爲了不預分配帶來的延遲,你能夠拷貝其它mongod實例的journal目錄到當前目錄來實現文件預配置。

預配置文件不包含數據。後續刪除是安全的。不過若是你啓用了journaling重啓了mongod,這些文件會從新被建立。

例如

如下順序爲監聽在27017端口的mongod進程預配置了journal文件。

For demonstration purposes, the sequence starts by creating a set of journal files in the usual way.

  1. 爲journal文件建立一個臨時目錄:

    mkdir ~/tmpDbpath
  2. 啓動mongod進程,該進程使用此臨時目錄存放journal文件:

    mongod --port 10000 --dbpath ~/tmpDbpath --journal
  3. 當看到以下輸出時,代表mongod已經建立好這些文件,使用CONTROL+C中止mongod實例:

    web admin interface listening on port 11000
  4. 講臨時目錄中的journal文件移動到新實例使用的文件目錄中:

    mv ~/tmpDbpath/journal /data/db/
  5. 啓動新實例:

    mongod --port 27017 --dbpath /data/db --journal

監控Journal狀態

使用以下命令監控journal狀態:

  • serverStatus

    ServerStatus顯示實例狀態信息,訪問性能。

  • journalLatencyTest
    使用journalLatencyTest測量在append-only模式下,須要多久才能寫入磁盤。你能夠在空閒系統上運行該命令得到journaling的基線同步時間。你也能夠在繁忙的操做系統上運行該命令獲取同步時間。若是journal目錄和數據目錄在同一個捲上,該時間可能會稍高。
    journalLatencyTest還能夠檢測磁盤是否開啓了寫緩存。若是磁盤不是SSD,而寫入時間很是低(好比不足2毫秒),磁盤驅動器極可能緩存了寫操做。這種狀況下,系統要啓用直接寫入(write-through),除非你的磁盤控制卡有電池。(unless you have a disk controller card with battery backed RAM)

更改組提交間隔

使用journalCommitInterval更改組提交間隔。容許範圍爲2-300ms

值越低日誌的持續性越好,但代價是下降磁盤性能。

意外關閉時的數據恢復

若是遇到數據庫崩潰,MongoDB須要進行日誌重演,完成以後服務才變的可用。若是MongoDB必須重演日誌,在日誌輸出端會進行提示。

該狀況不需進行repairDatabase

日誌間隔

mongd開啓了journaling運行過程當中, MongoDB stores and applies write operations in memory and in the journal before the changes are in the data files.

日誌文件

MongoDB開啓日誌後,在定義好的dbpath內建立一個日誌目錄。日誌目錄下存放日誌文件,這些文件是預先寫入的redo日誌。這個目錄同時還存放一個最後序列數字文件。若是數據庫被幹淨地關閉,journal目錄下的文件會所有被刪除。

日誌文件是追加式文件,這些文件有一個前綴j._。當日志文件達到1G,MongoDB建立一個新的日誌文件。當日志文件中全部的寫操做已經被應用,該文件會被刪除。除非每秒鐘你寫入了不少數據,不然該目錄下應該只包括兩到三個日誌文件。

若是想一想限制日誌文件最大爲128M,使用在mongod運行時使用smallfiles命令。

 

重要

If you place the journal on a different filesystem from your data files you cannot use a filesystem snapshot to capture consistent backups of a dbpath directory.

 

日誌中的存儲視圖

journaling在mongodb中添加了三個存儲視圖

共享視圖(shared view)存儲了要上傳到MongoDB數據文件中的修改過的數據。共享視圖是惟一可以直接訪問MongoDB數據文件的視圖。當實例開啓了journaling,mongod會要求系統將磁盤上已存在的數據文件映射到共享視圖的內存視圖(sharedview memory view)。操做系統映射這些文件,但不加載它們。若是後續須要,mongoDB會將這些數據文件加載進來。

私有視圖(private view)存儲了須要讀操做的數據。MongoDB maps private view to the shared view and is the first place MongoDB applies new write operations.

日誌是一種記錄在磁盤上的視圖,該視圖存儲了新的寫入操做,這些操做已經被記錄在私有cache中,但尚未寫入到數據文件。日誌提供了數據持續性。若是mongod實例崩潰,但沒有將數據寫入數據文件,日誌能夠經過將數據重演到共享視圖,最後寫入數據文件。

日誌如何記錄寫操做

MongoDB將寫操做複製一組提交(journal in batches called group commits)。默認,每100ms之行一次組提交:即每100msmongodb將該100ms內的全部命令一次提交。這種組提交策略下降了對性能的影響。

日誌存儲原始操做,以便MongoDB能夠將其進行重組:

  • 文檔插入/更新
  • 索引更改
  • 名稱空間文件的更改

寫操做發生時,MongDB將數據寫入RAM中的私有視圖,而後將其批量複製到日誌。日誌將這些操做記錄到磁盤。mongodb以條目形式在journal的前向指針中添加操做。每一個條目描述了在數據文件的哪些字節處有寫操做。

As part of journaling, MongoDB routinely asks the operating system to remap the shared view to the private view, for consistency.

MongoDB以後將journal的寫操做應用到共享視圖。此時,共享視圖和數據文件變的不一致。

默認每隔60s,MongoDB請求操做系統將共享視圖內容刷入數據文件。這保證了老是最新的。

當MongoDB將寫操做刷入數據文件時,MongoDB將寫操做從journal's behind pointer中移除此操做。

When MongoDB flushes write operations to the data files, MongoDB removes the write operations from the journal’s behind pointer. The behind pointer is always far back from advanced pointer.

做爲日誌記錄的一部分,爲了一致性,MongoDB會按期要求操做系統從新將共享視圖映射進私有視圖。

 

 

http://mongodb-documentation.readthedocs.io/en/latest/administration/journaling.html

相關文章
相關標籤/搜索