1、journal目錄結(jié)構(gòu)
- [root@gog /backup/mongo/data/journal]#ll
- total 3148816
- -rw------- 1 root root 1073741824 May 23 19:54 j._2
- -rw------- 1 root root 88 May 23 19:54 lsn
- -rw------- 1 root root 1073741824 Mar 18 01:22 prealloc.1
- -rw------- 1 root root 1073741824 Mar 18 01:22 prealloc.2
j._2表示正在使用中的journal文件,當(dāng)單個文件達(dá)到1GB的時候,就會創(chuàng)建一個新的文件,舊文件不會循環(huán)使用,自動刪除。lsn保存最后使用的journal序列號,是個2進(jìn)制文件,它實際保存的是系統(tǒng)啟動到現(xiàn)在的一個時間戳。prealloc.2是還未使用的初始化的journal文件。使用db.shutdownServer()和kill -2關(guān)閉的系統(tǒng),也就是clean shutdown,journal文件夾下除prealloc.*文件 都會被刪除。 如果系統(tǒng)掉電或者運行時死機(jī),再啟動時,mongo就會使用journal進(jìn)行恢復(fù),不用運行repair。
2、journal刷新頻率
journal除了故障恢復(fù)的作用之外,還可以提高寫入的性能,批量提交(batch-commit),journal一般默認(rèn)100ms刷新一次,在這個過程中,所有的寫入都可以一次提交,是單事務(wù)的,全部成功或者全部失敗。
關(guān)于刷新時間,它是可以更改,范圍是2-300ms,但是這并不是絕對的。MongoDB提供了journal延遲測試的函數(shù),
- > db.runCommand("journalLatencyTest")
- {
- "timeMillis" : {
- "8KB" : 19.74,
- "8KBWithPauses" : 20.31402,
- "1MB" : 25.2
- },
- "timeMillisWithPrealloc" : {
- "8KB" : 4.13,
- "8KBWithPauses" : 4.51596,
- "1MB" : 11.4
- },
- "onSamePartition" : true,
- "ok" : 1
- }
在實際運行中,刷新時間是--journalCommitInterval設(shè)置和延遲測試中較大的一個。
三、總結(jié):
mongodb在啟動時,專門初始化一個線程不斷循環(huán)(除非應(yīng)用crash掉),用于在一定時間周期內(nèi)來從defer隊列中獲取要持久化的數(shù)據(jù)并寫入到磁盤的journal(日志)和mongofile(數(shù)據(jù))處,當(dāng)然因為它不是在用戶添加記錄時就寫到磁盤上,所以它不會造成性能上的損耗,當(dāng)進(jìn)行數(shù)據(jù)插入操作時,記錄(Record類型)都被放入到defer隊列中以供延時批量(groupcommit)提交寫入,但相信其中時間周期參數(shù)是個要認(rèn)真考量的參數(shù),系統(tǒng)為100毫秒,如果該值更低的話,可能會造成頻繁磁盤操作,過高又會造成系統(tǒng)宕機(jī)時數(shù)據(jù)丟失過多。
journal的刷新時間是可以改變的,2-300ms的范圍,使用 --journalCommitInterval 命令
查看journal運行情況:
- "dur" : {
- "commits" : 25,
- "journaledMB" : 3.899392,
- "writeToDataFilesMB" : 38.269053,
- "compression" : 0.09879529488786379,
- "commitsInWriteLock" : 0,
- "earlyCommits" : 0,
- "timeMs" : {
- "dt" : 3131,
- "prepLogBuffer" : 47,
- "writeToJournal" : 349,
- "writeToDataFiles" : 43,
- "remapPrivateView" : 3
- }
- }
commits:在journalCommitInterval時間內(nèi)提交的操作數(shù)。
journaledMB:在journalCommitInterval時間內(nèi)寫到j(luò)ournal文件中的數(shù)據(jù)量 。
writeToDataFilesMB:在journalCommitInterval時間內(nèi)從journal刷新到磁盤的數(shù)據(jù)量 。
compression:v>2.0,表示客戶端提交寫入到j(luò)ournal的數(shù)據(jù)的壓縮比率,注意,寫入到j(luò)ournal的數(shù)據(jù)并不是全部的數(shù)據(jù)。( journaled_size_of_data / uncompressed_size_of_data ) 。
commitsInWriteLock:在有寫鎖的情況下提交的數(shù)量,這表示寫的壓力很大。
earlyCommits:表示在journalCommitInterval之前的時間,mongod請求提交的次數(shù)。用這個參數(shù)確定journalCommitInterval是不是設(shè)置的過長。
dur.timeMS.prepLogBuffer:從privateView映射到Logbuffer的時間。
dur.timeMS.writeToJournal:從logbuffer刷新到j(luò)ournalfile 的時間。
dur.timeMS.writeToDataFiles:從journalbuffer映射到MMF,然后從MMF刷新到磁盤的時間,文件系統(tǒng)和磁盤會影響寫入性能。
dur.timeMS.remapPrivateView:重新映射數(shù)據(jù)到PrivateView的時間,越小性能越好
借鑒了http://www.cnblogs.com/daizhj/archive/2011/03/21/1990344.html這篇文章中對mongodb源碼的分析部分
官方文檔 http://docs.mongodb.org/manual/core/journaling/#journaling-internals
網(wǎng)頁標(biāo)題:關(guān)于mongodb的journal日志工作方式分析
新聞來源:http://muchs.cn/article42/ispsec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計、電子商務(wù)、企業(yè)網(wǎng)站制作、軟件開發(fā)、網(wǎng)站營銷、虛擬主機(jī)
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源:
創(chuàng)新互聯(lián)