日志原理:
WiredTiger使用檢查點在磁盤上提供一致性數據視圖,并允許MongoDB從上一個檢查點恢復。?但是,如果MongoDB在檢查點之間意外退出,則需要使用日志記錄來恢復上次檢查點之后發生的信息。
通過日志記錄,恢復過程如下:
查看數據文件以查找上一個檢查點的標識符。
在日志文件中搜索與上一個檢查點的標識符相匹配的記錄。
自上次檢查點以來,在日志文件中應用這些操作。
MongoDB WiredTiger 首先使用內存緩沖來存儲日志記錄,直到超過128 kB,才寫入磁盤。根據以下時間間隔或條件,WiredTiger將緩沖的日記記錄同步到磁盤:
3.2版新增功能:每50毫秒。
版本3.6中:MongoDB?設置檢查點以60秒的間隔執行。
如果寫入操作包含?j:true?的寫入指令,則WiredTiger會強制WiredTiger日志文件同步。
由于MongoDB使用的日志文件大小限制為100 MB,WiredTiger大約每隔100 MB創建一個新的日志文件。當WiredTiger創建新的日志文件時,WiredTiger將同步前一個日志文件。
注意:
在寫操作之間,當日志記錄保留在WiredTiger緩沖區中時,在mongod強制關閉時更新可能會丟失。
日志方式:
不開啟 ? ? ?journal
,寫入 wiredtiger ? ? ?的數據,并不會立即持久化存儲;而是每分鐘會做一次全量的checkpoint(
storage.syncPeriodSecs
配置項,默認為1分鐘),將所有的數據持久化。
開啟 journal 后
,每次寫入會記錄一條操作日志(通過journal可以重新構造出寫入的數據)。這樣即使出現宕機,啟動時 ? ? ?Wiredtiger 會先將數據恢復到最近的一次checkpoint的點,然后重放后續的 journal 操作日志來恢復數據。
MongoDB 里的 journal 行為 主要由2個參數控制,
storage.journal.enabled
決定是否開啟journal,
storage.journal.commitInternalMs
決定 journal 刷盤的間隔(
journal操作的最大間隔時間。可以是2-300ms之間的值,低的值有助于持久化,但是會增加磁盤的額外負擔。
如果journal和數據文件在同一磁盤上,默認為100ms。如果在不同的磁盤上為30ms。
如果強制mongod提交日志文件,可以指定j:true,指定后,時間變為原來的三分之一
),默認為100ms,用戶也可以通過寫入時指定 writeConcern 為 {j: ture} 來每次寫入時都確保 journal 刷盤。
日志切換:
use admin
db.runCommand( { logRotate : 1 } )
后者:
1 3 * * * killall -SIGUSR1 mongod
3 3 * * * killall -SIGUSR1 mongos
15 3 * * * /usr/bin/find /data/mongodb/data/prod_shard2_1/log/ -name "mongodb.log.*" -mtime +30 -exec rm -fr {} \;
19 3 * * * /usr/bin/find /data/mongodb/data/prod_configdb2/log/ -name "mongodb.log.*" -mtime +30 -exec rm -fr {} \;
21 3 * * * /usr/bin/find /data/mongodb/data/prod_mongos/log/ -name "mongodb.log.*" -mtime +30 -exec rm -fr {} \;
日志級別在配置文件中的加入:
use admin
db.runCommand( {
setParameter: 1,
logComponentVerbosity: {
verbosity: 1,
query: {
verbosity: 2
},
storage: {
verbosity: 2,
journal: {
verbosity: 1
}
}
}
} )
或者:
verbose&&quiet
mongodb默認情況下日志文件非常大,每秒都會記錄大量的connection等調試信息,這對于我們管理日志和定位 ? ? ? ?錯誤有很大影響,需要修改它的默認日志級別。
mongodb的日志級別在配置文件中的verbose和quiet參數決定。verbose表示會打印debug信息,范例配置如下
verbose=true
vv=true
注:這里的vv表示debug級別,有vv-vvvvv,v越多則記錄的日志信息越詳細。
而如果設置了quiet=true參數,表示安靜地輸出,即不會再有debug信息,日志中只會打印一些關鍵的信息,比如 ? ? ? ?自動故障切換,系統錯誤等信息,相當于error log。這時需要注釋掉verbose參數。范例配置如下:
#verbose=true
quiet=true