溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Mongodb 日志原理和操作

發(fā)布時(shí)間:2020-08-08 17:39:40 來源:ITPUB博客 閱讀:168 作者:runblood 欄目:關(guān)系型數(shù)據(jù)庫

日志原理:

WiredTiger使用檢查點(diǎn)在磁盤上提供一致性數(shù)據(jù)視圖,并允許MongoDB從上一個(gè)檢查點(diǎn)恢復(fù)。 但是,如果MongoDB在檢查點(diǎn)之間意外退出,則需要使用日志記錄來恢復(fù)上次檢查點(diǎn)之后發(fā)生的信息。

 

通過日志記錄,恢復(fù)過程如下:

查看數(shù)據(jù)文件以查找上一個(gè)檢查點(diǎn)的標(biāo)識(shí)符。

在日志文件中搜索與上一個(gè)檢查點(diǎn)的標(biāo)識(shí)符相匹配的記錄。

自上次檢查點(diǎn)以來,在日志文件中應(yīng)用這些操作。

 

MongoDB WiredTiger 首先使用內(nèi)存緩沖來存儲(chǔ)日志記錄,直到超過128 kB,才寫入磁盤。根據(jù)以下時(shí)間間隔或條件,WiredTiger將緩沖的日記記錄同步到磁盤:

3.2版新增功能:每50毫秒。

版本3.6中:MongoDB 設(shè)置檢查點(diǎn)以60秒的間隔執(zhí)行。

如果寫入操作包含 j:true 的寫入指令,則WiredTiger會(huì)強(qiáng)制WiredTiger日志文件同步。

由于MongoDB使用的日志文件大小限制為100 MB,WiredTiger大約每隔100 MB創(chuàng)建一個(gè)新的日志文件。當(dāng)WiredTiger創(chuàng)建新的日志文件時(shí),WiredTiger將同步前一個(gè)日志文件。

注意: 在寫操作之間,當(dāng)日志記錄保留在WiredTiger緩沖區(qū)中時(shí),在mongod強(qiáng)制關(guān)閉時(shí)更新可能會(huì)丟失。

日志方式:

  1. 不開啟      journal ,寫入 wiredtiger      的數(shù)據(jù),并不會(huì)立即持久化存儲(chǔ);而是每分鐘會(huì)做一次全量的checkpoint( storage.syncPeriodSecs 配置項(xiàng),默認(rèn)為1分鐘),將所有的數(shù)據(jù)持久化。
  2. 開啟 journal 后 ,每次寫入會(huì)記錄一條操作日志(通過journal可以重新構(gòu)造出寫入的數(shù)據(jù))。這樣即使出現(xiàn)宕機(jī),啟動(dòng)時(shí)      Wiredtiger 會(huì)先將數(shù)據(jù)恢復(fù)到最近的一次checkpoint的點(diǎn),然后重放后續(xù)的 journal 操作日志來恢復(fù)數(shù)據(jù)。 

MongoDB 里的 journal 行為 主要由2個(gè)參數(shù)控制, storage.journal.enabled  決定是否開啟journal, storage.journal.commitInternalMs  決定 journal 刷盤的間隔( journal操作的最大間隔時(shí)間。可以是2-300ms之間的值,低的值有助于持久化,但是會(huì)增加磁盤的額外負(fù)擔(dān)。

如果journal和數(shù)據(jù)文件在同一磁盤上,默認(rèn)為100ms。如果在不同的磁盤上為30ms。

如果強(qiáng)制mongod提交日志文件,可以指定j:true,指定后,時(shí)間變?yōu)樵瓉淼娜种? ),默認(rèn)為100ms,用戶也可以通過寫入時(shí)指定 writeConcern 為 {j: ture} 來每次寫入時(shí)都確保 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默認(rèn)情況下日志文件非常大,每秒都會(huì)記錄大量的connection等調(diào)試信息,這對于我們管理日志和定位        錯(cuò)誤有很大影響,需要修改它的默認(rèn)日志級別。

     mongodb的日志級別在配置文件中的verbose和quiet參數(shù)決定。verbose表示會(huì)打印debug信息,范例配置如下

     verbose=true

     vv=true

     注:這里的vv表示debug級別,有vv-vvvvv,v越多則記錄的日志信息越詳細(xì)。

     而如果設(shè)置了quiet=true參數(shù),表示安靜地輸出,即不會(huì)再有debug信息,日志中只會(huì)打印一些關(guān)鍵的信息,比如        自動(dòng)故障切換,系統(tǒng)錯(cuò)誤等信息,相當(dāng)于error log。這時(shí)需要注釋掉verbose參數(shù)。范例配置如下:

     #verbose=true

     quiet=true

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI