MongoDB儲存引擎-MMAPv1學習總結
一.讀寫鎖
不支援MVCC
Version < 2.2 :
只支援程式級鎖,一個Mongod例項一個鎖。
2.2 ≤ Version < 2.8 :
支援庫級鎖,一個db一把鎖。
3.0.0 ≤ Version
支援 collection 級別的鎖。
記憶體
記憶體對映檔案
交由作業系統管理,不能
手動配置管理
無強制記憶體量要求
快取索引、熱資料等
二.Journal日誌
Journal日誌,是MongoDB的預寫日誌WAL(類似Mysql的Redo log)。
journal就是一個預寫事務日誌,來確保資料的永續性,wiredTiger每隔60秒(預設)或者待寫入的資料達到2G時,mongodb將對journal檔案提交一個checkpoint(檢測點,將記憶體中的資料變更flush到磁碟中的資料檔案中,並做一個標記點,表示此前的資料表示已經持久儲存在了資料檔案中,此後的資料變更存在於記憶體和journal日誌)。對於write操作,首先被持久寫入journal,然後在記憶體中儲存變更資料,條件滿足後提交一個新的檢測點,即檢測點之前的資料只是在journal中持久儲存,但並沒有在mongodb的資料檔案中持久化,延遲持久化可以提升磁碟效率,如果在提交checkpoint之前,mongodb異常退出,此後再次啟動可以根據journal日誌恢復資料。journal預設使用了snappy壓縮,檢測點建立後,此前的journal日誌即可清除。mongod可以禁用journal,這在一定程度上可以降低它帶來的開支;對於單點mongod,關閉journal可能會在異常關閉時丟失checkpoint之間的資料(那些尚未提交到磁碟資料檔案的資料);對於replica set架構,永續性的保證稍高,但仍然不能保證絕對的安全。
因為Journal日誌檔案是磁碟上連續分配的空間,MongoDB在執行時透過順序追加的方式記錄,透過順序IO來改善寫效能。同時,後臺會定時刷寫Journal日誌檔案以將寫操作持久化到資料檔案。
透過這種兩次寫的方式,當Mongodb因為一次非正常退出(比如崩潰),重啟mongod程式後會根據journal下的檔案來恢復資料以達到資料一致,防止資料丟失。同時,一次正常的退出時MongoDB會
刷寫並刪除journal目錄下所有檔案。
journal除了故障恢復的作用之外,還可以提高寫入的效能,透過批次提交(batch-commit)的方式減少IO次數,一般預設100ms重新整理一次到journal,可透過下面引數修改:
storage.journal.commitIntervalMs
值越低,重新整理輸出頻率越高,journal的永續性也就越高(故障意外情況下丟失的資料越少),但同時意味著更多的磁碟IO。
2.0以上版本預設開啟的,可以透過nojournal = true 或--nojournal關閉,但建議開啟。
Journal檔案是以“j._”開頭命名的,且是append only的,如果1個journal檔案滿了1G大小,mongodb就會新建立一個journal檔案來使用,一旦某個journal檔案所記載的寫操作都被使用過了,
mongodb就會把這個journal檔案刪除。通常在journal檔案所在的資料夾下,只會存在2~3個journal檔案,除非你使用mongodb每秒都寫入大量的資料。
使用 smallfiles 這個執行時選項可以將journal檔案大小減至128M大小。
三.資料檔案
每個db有1個.ns(namespace)和若干個資料檔案(.n)構成
資料檔案隨著資料的增多而增多,預設從64M開始,資料檔案每新增一次,大小為上一個資料檔案的2倍,上限為2GB。這樣的設計有利於防止資料量較小的資料庫浪費過多的空間,同時又能保證資料量較
大的資料庫有相應的空間使用。
MongoDB會使用預分配方式來保證寫入效能的穩定(可透過–noprealloc關閉,但不建議)。預分配在後臺進行。預分配使得MongoDB始終保持額外的空間和空餘的資料檔案,從而避免了資料增長過快而
帶來的分配磁碟空間引起的阻塞。
不支援MVCC
Version < 2.2 :
只支援程式級鎖,一個Mongod例項一個鎖。
2.2 ≤ Version < 2.8 :
支援庫級鎖,一個db一把鎖。
3.0.0 ≤ Version
支援 collection 級別的鎖。
記憶體
記憶體對映檔案
交由作業系統管理,不能
手動配置管理
無強制記憶體量要求
快取索引、熱資料等
二.Journal日誌
Journal日誌,是MongoDB的預寫日誌WAL(類似Mysql的Redo log)。
journal就是一個預寫事務日誌,來確保資料的永續性,wiredTiger每隔60秒(預設)或者待寫入的資料達到2G時,mongodb將對journal檔案提交一個checkpoint(檢測點,將記憶體中的資料變更flush到磁碟中的資料檔案中,並做一個標記點,表示此前的資料表示已經持久儲存在了資料檔案中,此後的資料變更存在於記憶體和journal日誌)。對於write操作,首先被持久寫入journal,然後在記憶體中儲存變更資料,條件滿足後提交一個新的檢測點,即檢測點之前的資料只是在journal中持久儲存,但並沒有在mongodb的資料檔案中持久化,延遲持久化可以提升磁碟效率,如果在提交checkpoint之前,mongodb異常退出,此後再次啟動可以根據journal日誌恢復資料。journal預設使用了snappy壓縮,檢測點建立後,此前的journal日誌即可清除。mongod可以禁用journal,這在一定程度上可以降低它帶來的開支;對於單點mongod,關閉journal可能會在異常關閉時丟失checkpoint之間的資料(那些尚未提交到磁碟資料檔案的資料);對於replica set架構,永續性的保證稍高,但仍然不能保證絕對的安全。
因為Journal日誌檔案是磁碟上連續分配的空間,MongoDB在執行時透過順序追加的方式記錄,透過順序IO來改善寫效能。同時,後臺會定時刷寫Journal日誌檔案以將寫操作持久化到資料檔案。
透過這種兩次寫的方式,當Mongodb因為一次非正常退出(比如崩潰),重啟mongod程式後會根據journal下的檔案來恢復資料以達到資料一致,防止資料丟失。同時,一次正常的退出時MongoDB會
刷寫並刪除journal目錄下所有檔案。
journal除了故障恢復的作用之外,還可以提高寫入的效能,透過批次提交(batch-commit)的方式減少IO次數,一般預設100ms重新整理一次到journal,可透過下面引數修改:
storage.journal.commitIntervalMs
值越低,重新整理輸出頻率越高,journal的永續性也就越高(故障意外情況下丟失的資料越少),但同時意味著更多的磁碟IO。
2.0以上版本預設開啟的,可以透過nojournal = true 或--nojournal關閉,但建議開啟。
Journal檔案是以“j._”開頭命名的,且是append only的,如果1個journal檔案滿了1G大小,mongodb就會新建立一個journal檔案來使用,一旦某個journal檔案所記載的寫操作都被使用過了,
mongodb就會把這個journal檔案刪除。通常在journal檔案所在的資料夾下,只會存在2~3個journal檔案,除非你使用mongodb每秒都寫入大量的資料。
使用 smallfiles 這個執行時選項可以將journal檔案大小減至128M大小。
三.資料檔案
每個db有1個.ns(namespace)和若干個資料檔案(.n)構成
資料檔案隨著資料的增多而增多,預設從64M開始,資料檔案每新增一次,大小為上一個資料檔案的2倍,上限為2GB。這樣的設計有利於防止資料量較小的資料庫浪費過多的空間,同時又能保證資料量較
大的資料庫有相應的空間使用。
MongoDB會使用預分配方式來保證寫入效能的穩定(可透過–noprealloc關閉,但不建議)。預分配在後臺進行。預分配使得MongoDB始終保持額外的空間和空餘的資料檔案,從而避免了資料增長過快而
帶來的分配磁碟空間引起的阻塞。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-1992470/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MongoDB--三、儲存引擎MongoDB儲存引擎
- BLACKHOLE儲存引擎總結儲存引擎
- 【Mysql 學習】memory儲存引擎MySql儲存引擎
- 【Mysql 學習】Mysql 儲存引擎MySql儲存引擎
- 【Mysql 學習】MyISAM儲存引擎(二)。MySql儲存引擎
- 【Mysql 學習】MyISAM儲存引擎(一)。MySql儲存引擎
- MongoDB的學習總結MongoDB
- MongoDB 儲存引擎與內部原理MongoDB儲存引擎
- Mongodb多儲存引擎支援機制MongoDB儲存引擎
- 【Mysql學習】MERGE儲存引擎(一)MySql儲存引擎
- 【Mysql 學習】MERGE儲存引擎(一)MySql儲存引擎
- MongoDB技術分享:WiredTiger儲存引擎MongoDB儲存引擎
- 總結MySQL儲存引擎MyISAM與InnoDB區別MySql儲存引擎
- Oracle學習總結--基礎部分(儲存與索引)Oracle索引
- MyISAM 儲存引擎,Innodb 儲存引擎儲存引擎
- MySQL儲存引擎之MyIsam和Innodb總結性梳理MySql儲存引擎
- MySQL兩種儲存引擎: MyISAM和InnoDB 簡單總結MySql儲存引擎
- mysql dba系統學習(20)mysql儲存引擎MyISAMMySql儲存引擎
- 重新學習Mysql資料庫3:Mysql儲存引擎與資料儲存原理MySql資料庫儲存引擎
- PostgreSQL儲存引擎之page結構SQL儲存引擎
- 儲存引擎儲存引擎
- 儲存學習
- MongoDB WiredTiger儲存引擎的優勢是什麼?MongoDB儲存引擎
- 資料獲取,解析,儲存等知識的學習總結
- mysql學習6:第三章MYSQL 體系結構與儲存引擎MySql儲存引擎
- mysql dba系統學習(20)mysql儲存引擎MyISAM薦MySql儲存引擎
- MySQLInnoDB儲存引擎(一):精談innodb的儲存結構MySql儲存引擎
- MongoDB文件儲存MongoDB
- MySQL體系結構與儲存引擎MySql儲存引擎
- PostgreSQL儲存引擎之heap tuple結構SQL儲存引擎
- MyRocks儲存引擎資料結構解析儲存引擎資料結構
- MySQL InnoDB儲存引擎體系結構MySql儲存引擎
- MySql體系結構和儲存引擎MySql儲存引擎
- 樹的學習——樹的儲存結構
- Java專案中MongoDb學習和使用總結JavaMongoDB
- bitcask儲存引擎儲存引擎
- MySQL 儲存引擎MySql儲存引擎
- Innodb儲存引擎儲存引擎