亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

關于mongodb的journal日志工作方式分析

發布時間:2020-07-07 15:35:08 來源:網絡 閱讀:3002 作者:leezqang 欄目:MongoDB數據庫
1、journal目錄結構
  1. [root@gog /backup/mongo/data/journal]#ll 
  2. total 3148816 
  3. -rw------- 1 root root 1073741824 May 23 19:54 j._2 
  4. -rw------- 1 root root         88 May 23 19:54 lsn 
  5. -rw------- 1 root root 1073741824 Mar 18 01:22 prealloc.1 
  6. -rw------- 1 root root 1073741824 Mar 18 01:22 prealloc.2 
 
j._2表示正在使用中的journal文件,當單個文件達到1GB的時候,就會創建一個新的文件,舊文件不會循環使用,自動刪除。lsn保存最后使用的journal序列號,是個2進制文件,它實際保存的是系統啟動到現在的一個時間戳。prealloc.2是還未使用的初始化的journal文件。使用db.shutdownServer()和kill -2關閉的系統,也就是clean shutdown,journal文件夾下除prealloc.*文件 都會被刪除。 如果系統掉電或者運行時死機,再啟動時,mongo就會使用journal進行恢復,不用運行repair。 
 
2、journal刷新頻率
journal除了故障恢復的作用之外,還可以提高寫入的性能,批量提交(batch-commit),journal一般默認100ms刷新一次,在這個過程中,所有的寫入都可以一次提交,是單事務的,全部成功或者全部失敗。
關于刷新時間,它是可以更改,范圍是2-300ms,但是這并不是絕對的。mongodb提供了journal延遲測試的函數,
 
  1. > db.runCommand("journalLatencyTest"
  2.     "timeMillis" : { 
  3.         "8KB" : 19.74, 
  4.         "8KBWithPauses" : 20.31402, 
  5.         "1MB" : 25.2 
  6.     }, 
  7.     "timeMillisWithPrealloc" : { 
  8.         "8KB" : 4.13, 
  9.         "8KBWithPauses" : 4.51596, 
  10.         "1MB" : 11.4 
  11.     }, 
  12.     "onSamePartition" : true
  13.     "ok" : 1 
在實際運行中,刷新時間是--journalCommitInterval設置和延遲測試中較大的一個。
三、總結:
mongodb在啟動時,專門初始化一個線程不斷循環(除非應用crash掉),用于在一定時間周期內來從defer隊列中獲取要持久化的數據并寫入到磁盤的journal(日志)和mongofile(數據)處,當然因為它不是在用戶添加記錄時就寫到磁盤上,所以它不會造成性能上的損耗,當進行數據插入操作時,記錄(Record類型)都被放入到defer隊列中以供延時批量(groupcommit)提交寫入,但相信其中時間周期參數是個要認真考量的參數,系統為100毫秒,如果該值更低的話,可能會造成頻繁磁盤操作,過高又會造成系統宕機時數據丟失過多。
journal的刷新時間是可以改變的,2-300ms的范圍,使用 --journalCommitInterval 命令
 
查看journal運行情況:
  1. "dur" : { 
  2.         "commits" : 25, 
  3.         "journaledMB" : 3.899392, 
  4.         "writeToDataFilesMB" : 38.269053, 
  5.         "compression" : 0.09879529488786379, 
  6.         "commitsInWriteLock" : 0, 
  7.         "earlyCommits" : 0, 
  8.         "timeMs" : { 
  9.             "dt" : 3131, 
  10.             "prepLogBuffer" : 47, 
  11.             "writeToJournal" : 349, 
  12.             "writeToDataFiles" : 43, 
  13.             "remapPrivateView" : 3 
  14.         } 
  15.     } 
commits:在journalCommitInterval時間內提交的操作數。 
journaledMB:在journalCommitInterval時間內寫到journal文件中的數據量 。 
writeToDataFilesMB:在journalCommitInterval時間內從journal刷新到磁盤的數據量 。 
compression:v>2.0,表示客戶端提交寫入到journal的數據的壓縮比率,注意,寫入到journal的數據并不是全部的數據。( journaled_size_of_data / uncompressed_size_of_data ) 。 
commitsInWriteLock:在有寫鎖的情況下提交的數量,這表示寫的壓力很大。 
earlyCommits:表示在journalCommitInterval之前的時間,mongod請求提交的次數。用這個參數確定journalCommitInterval是不是設置的過長。 
dur.timeMS.prepLogBuffer:從privateView映射到Logbuffer的時間。
dur.timeMS.writeToJournal:從logbuffer刷新到journalfile 的時間。
dur.timeMS.writeToDataFiles:從journalbuffer映射到MMF,然后從MMF刷新到磁盤的時間,文件系統和磁盤會影響寫入性能。 
dur.timeMS.remapPrivateView:重新映射數據到PrivateView的時間,越小性能越好
 
借鑒了http://www.cnblogs.com/daizhj/archive/2011/03/21/1990344.html這篇文章中對mongodb源碼的分析部分
官方文檔 http://docs.mongodb.org/manual/core/journaling/#journaling-internals
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

香格里拉县| 黎川县| 莱阳市| 宁河县| 海原县| 郧西县| 兴化市| 闵行区| 横山县| 固安县| 邵阳市| 安龙县| 南汇区| 温州市| 来凤县| 民乐县| 安庆市| 东阳市| 阿巴嘎旗| 孟津县| 紫阳县| 崇州市| 恩平市| 巫溪县| 苍南县| 新竹县| 克什克腾旗| 平泉县| 宜川县| 张家川| 贵阳市| 龙山县| 平江县| 阳山县| 沅陵县| 图木舒克市| 手游| 日照市| 天峻县| 衡阳市| 葵青区|