1. 程式人生 > >mongodb中journal工作原理

mongodb中journal工作原理

From:  http://f.dataguru.cn/thread-139560-1-1.html

先介紹一下Journal:


    journal檔案在MongoDB中的作用相當於redo日誌檔案在oracle中的作用,它可以在即使伺服器意外宕機的情況下,將資料庫操作進行重演。


    在64位的機器上,2.0以上版本預設是開啟了journal的,但是在32位機器上,或者2.0以下的版本中,預設是不開啟journal的。所以在我的安裝了2.4.3版本的32位機器上,每次啟動mongodb都提示“warning: 32-bit servers don't have journaling enabled by default. Please use --journal if you want durability.”,所以我須要在啟動mongodb時帶上 --journal 引數;而在預設啟動journal的機器上如果不想啟動journal,則可以帶上 --nojournal 引數。


    第一次啟動帶啟用journal的服務前,通常磁碟上是沒有journal file的,這時mongodb就會現在磁碟上為journal檔案分配磁碟空間,這個過程會花比較長的時間(所以老師的視訊演示中,第一次啟動服務時花了很長的時間),在這段時間內服務是不可用的。如果想避免這個預分配動作也是可以的,就是從別的mongodb例項中拷貝一個已經預分配的檔案,然後放到自己的journal路徑中,這個預分配檔案是不含資料的,因此是這種操作方式是安全的。另外,我在網上看到有人說如果採用ext4的檔案系統,這個預分配的時間就會減小很多(據說ext4在ext3基礎上效能的提高,比ext3在ext2基礎上效能的提高要高不少),可惜我在嘗試做這個實驗時,嘗試了幾次把虛擬機器CentOS上的ext3檔案系統轉為ext4都沒有成功,所以最終放棄了這個實驗,希望如果有人做了這個實驗的話,將過程分享分享。


    預設情況下mongodb每100毫秒往journal檔案中flush一次資料,不過這是在資料檔案和journal檔案處於同一磁碟捲上的情況,而如果資料檔案和journal檔案不在同一磁碟捲上時,預設重新整理輸出時間是30毫秒。不過這個毫秒值是可以修改的,可修改範圍是2~300,值越低,重新整理輸出頻率越高,資料安全度也就越高,但磁碟效能上的開銷也更高。

    journal檔案是以“j._”開頭命名的,且是append only的,如果1個journal檔案滿了1G大小,mongodb就會新建立一個journal檔案來使用,一旦某個journal檔案所記載的寫操作都被使用過了,mongodb就會把這個journal檔案刪除。通常在journal檔案所在的資料夾下,只會存在2~3個journal檔案,除非你使用mongodb每秒都寫入大量的資料。而使用 smallfiles 這個執行時選項可以將journal檔案大小減至128M大小。



Journal的工作原理:
    首先要知道在這個原理中,存在著兩個file,兩個view。兩個file是 data file 和 journal file,兩個view是 shared view 和 private view。兩個file是對磁碟而言的,而兩個view是對記憶體而言的,下面以圖解的方式解釋:

啟動服務前:
1.PNG 

啟動服務後,MongoDB請求作業系統將Data file對映到Shared view,此時作業系統只管對映這個動作,並不將資料載入到Shared view中,而是由MongoDB在需要時再將資料進行載入到Shared view。
2.PNG 

然後,MongoDB再請求作業系統將Shared view對映到Private view,之後MongDB對資料的讀寫操作都是直接操作的Private view:
3.PNG 

如果發生了寫操作:
4.PNG 

Private view變髒以後,根據journalCommitInterval的設定,將在一定時間後將寫操作往Journal file中複製,這個過程稱為“group commit”:
5.PNG 
Journal file中記錄的是原生的操作(raw operation),這些原生的操作可以使MongoDB完成以下操作:
    對文件的插入/更新(document insertion/updates)
    對索引的修改(index modifications)
    對名稱空間檔案的修改(changes to the namespace files)
這些原生操作告訴了Journal file資料變化發生在Data file的什麼位置。至此,MongoDB上發生的寫事件可以被認為是安全的了,因為這些寫操作已經被記錄在了Journal file上,即使伺服器掉電了,在下次啟動MongoDB時,Journal file上的寫操作將會被重演。

接下來,Journal file中記錄的寫操作會應用在Shared view上:
6.PNG 

預設每隔60秒,MongoDB請求作業系統將Shared view重新整理輸出到Data file:
7.PNG 
資料就被寫入到資料檔案了。這時MongoDB還會將Journal file中已輸出到Data file的寫操作刪除掉(由於MongoDB在將Journal file中寫操作放到Shared view時,是通過了一個前指標和一個後指標來操作的,所以MongoDB知道哪些寫操作是被放到Shared view了的,哪些沒有)。

最後,MongoDB還會例行地如一開始一樣,將Shared view對映到Private view,以保持一致性(也是防止Private view變得太過於髒了)。
8.PNG 

參考:
    MongoDB官方文件、
http://blog.mongodb.org/post/337 ... bs-journaling-works

相關推薦

mongodbjournal工作原理

From:  http://f.dataguru.cn/thread-139560-1-1.html 先介紹一下Journal:     journal檔案在MongoDB中的作用相當於redo日誌檔案在oracle中的作用,它可以在即使伺服器意外宕機的情況下,將資料庫操

mongodb Journal工作原理

先介紹一下Journal:     journal檔案在MongoDB中的作用相當於redo日誌檔案在oracle中的作用,它可以在即使伺服器意外宕機的情況下,將資料庫操作進行重演。     在64位的機器上,2.0以上版本預設是開啟了journal的,但是在32位機器上,或者2.0以下的版本中,預設是不開啟

Java8 ConcurrentHashMap工作原理的要點分析

tail dtree outer initial 而不是 ubd rule 設定 tree 簡介: 本文主要介紹Java8中的並發容器ConcurrentHashMap的工作原理,和其它文章不同的是,本文重點分析了不同線程的各類並發操作如get,put,remove之間是如

HADOOPHDFS工作原理

轉載:http://www.weixuehao.com/archives/596 http://www.cnblogs.com/iloveyouforever/p/4303903.html http://www.cnblogs.com/iloveyouforever/p/430435

pythonsuper工作原理

python中可以通過super來呼叫父類的__init__函式,這個的好處是,當父類名稱變化時,不需要進行子類程式碼更改,如下: 如果使用1,super方式呼叫父類__init__函式進行例項化,當父類A進行名字更改為B時,C類中不需要進行程式碼更改; 如果使用2,父類.__init

ARMMMU工作原理

本文描述基於儲存器管理單元的系統結構, 包含以下內容: ·  關於儲存器管理單元的結構 ·  儲存器訪問的順序 ·  轉換過程 ·  訪問許可權 ·  域 ·  異常 ·  CP15 暫存器 http://embedded.homeunix.org 30/06/2003 Pa

JSeval工作原理和json格式(eval+json兩者結合應用)

var bar ='bar'; // if variable bar equals 'bar', foobar is the result of // last executing statement: bar="foo-bar";var foobar = eval('if(bar == "bar") {b

Spring MVCDispatcherServlet工作原理探究

下面類圖將主要的類及方法抽離出來,以便檢視方便,根據類的結構來說明整個請求是如何工作的 主要使用到的技術有Spring的IOC容器和Servlet。 假如我們要實現一個請求home.htm然後返回home.jsp檢視資源則 當home.htm請求到達時,我們需要Disp

djangoadmin路由系統工作原理

blog items module 程序 email asc @property 目的 urn 一、如圖所示 from django.contrib import admin from . import models class zhangsan(admin.ModelA

HTTP協議報文、工作原理及Java的HTTP通信技術詳解

tor 報文 buffered mod protoc 禁止 ans 請求報文 客戶端 博客園 首頁 新隨筆 聯系 管理 訂閱

詳解javascriptthis的工作原理

new 變量 person get 工作 func 存在 嚴格 es5 在 JavaScript 中 this 常常指向方法調用的對象,但有些時候並不是這樣的,本文將詳細解讀在不同的情況下 this 的指向。 一、指向 window: 在全局中使用 this,它將會指向全局

How Javascript works (Javascript工作原理) (二) 引擎,運行時,如何在 V8 引擎書寫最優代碼的 5 條小技巧

tco master 一次 指定 ava 技術分享 將不 創建 跳轉 個人總結: 一個Javascript引擎由一個標準解釋程序,或者即時編譯器來實現。 解釋器(Interpreter): 解釋一行,執行一行。 編譯器(Compiler): 全部編譯成機器碼,統一執行。(減

Java的HashMap的工作原理是什麽?

內部實現 它的 閾值 索引 查看 解決 family 空間 並且 Java中的HashMap是以鍵值對(key-value)的形式存儲元素的。HashMap需要一個hash函數,它使用hashCode()和equals()方法來向集合/從集合添加和檢索元素。當調用put()

MongoDB復制集的工作原理介紹(二)

不能 數據同步 nat ring $inc tla 2.3 支持 pla 復制集工作原理 1)數據復制原理 開啟復制集後,主節點會在 local 庫下生成一個集合叫 oplog.rs,這是一個有限集合,也就是大小是固定的。其中記錄的是整個mongod實例一段時間內數據庫

javathrows子句是怎麽用的?工作原理是什麽?

必須 .com 意義 ron main style 同學 begin gin 7.throws子句 (視頻下載) (全部書籍)馬克-to-win:當你的方法裏拋出了checked異常,如你不catch,代表你當時不處理(不想處理或沒條件處理),但你必須得通過"throws

詳解SpringMVCController的方法參數的工作原理

使用 extc component 格式 cab swa sse 字符串 logs Spring MVC中Controller的處理方法的參數可以是Integer,String,自定義對象,ServletRequest,ServletResponse,ModelAndVie

Java 的 HashMap 的工作原理是什麼?

Java 中的 HashMap 是以鍵值對(key-value)的形式儲存元素的。HashMap 需要一個hash函式,它使用 has hCode()和 equals()方法來向集合/從集合新增和檢索元素。當呼叫 put()方法的時候,HashMap會計算 key 的 hash 值,然後把鍵

深入解析Vue的computed工作原理

我們通過實現一個簡單版的和Vue中computed具有相同功能的函式來了解computed是如何工作的。 JS屬性: JavaScript有一個特性是 Object.defineProperty ,它能做很多事,但我在這篇文章只專注於這個方法中的一個: var perso

旋轉編碼器的工作原理以及如何在Arduino使用

在本篇文章中,我們將學習旋轉編碼器的工作原理以及如何將其與Arduino開發板一起使用。旋轉編碼器是一種位置感測器,用於確定旋轉軸的角度位置。它根據旋轉運動產生模擬或數字電訊號。 有許多不同型別的旋轉編碼器,可通過輸出訊號或感測技術進行分類。在本篇文章中,我們使用的特定旋轉編碼

Java併發包Semaphore的工作原理、原始碼分析及使用示例

簡介: 在多執行緒程式設計中有三個同步工具需要我們掌握,分別是Semaphore(訊號量),countDownLatch(倒計數門閘鎖),CyclicBarrier(可重用柵欄) 歡迎探討,如有錯誤敬請指正 如需轉載,請註明出處 http://www.cnblogs.com/n