標籤:改進 組織 turtle 檔案大小 不同的 std 層級 map 最新
上一篇博文介紹了MongoDB的MMAPv1儲存引擎,本文接著介紹MongoDB另一個儲存引擎——WiredTiger,WiredTiger是在MongoDB3.0版本引入的,並且在MongoDB3.2版本開始成為MongoDB預設的儲存引擎。相比較MMAPv1,WiredTiger功能更強大,而且具有更高的效能。
相對於MMAPv1,WiredTiger進行了一系列改進:
1. 檔案空間分配方式改進
MMAPv1儲存引擎是在資料庫層級分配檔案的,將每個資料庫中所有的集合和索引都混合儲存在資料庫檔案中,即使刪除了某個集合或索引,其佔用的磁碟空間也很難及時自動回收。WiredTIger則在集合和索引層級分配檔案,將每個資料庫中所有的集合和索引都儲存在單獨的檔案中,集合或索引刪除後,其對應檔案即可刪除,磁碟空間回收方便。
WiredTiger的一些資料檔案:
mongod.lock:用於防止多個進程串連同一個WiredTiger資料庫
.wt檔案:儲存各個集合的資料,每個檔案100MB
WiredTiger.wt:用於儲存所有集合的中繼資料資訊
WiredTiger.turtle:用於儲存WiredTiger.wt的中繼資料資訊
journal檔案夾:用於儲存記錄檔(Write ahead log)
2. 文檔層級的並發控制
WiredTiger儲存引擎使用文檔層級鎖,同一時刻多個寫操作可以修改同一個集合中不同的文檔,但不能修改同一個文檔。這使得WiredTiger儲存引擎的並發處理能力比MMAPv1更好。
3. 通過檢查點和預寫記錄檔實現資料持久化
按照MongoDB預設的配置,WiredTiger的寫操作會先寫入Cache(BTree結構),當Cache大小達到128KB時便將其持久化到預寫記錄檔檔案(Write ahead log)。WiredTiger每60s或記錄檔大小達到2GB時會做一次檢查點Checkpoint,產生指定時間點的資料庫快照集(記憶體中資料的一致性視圖),將快照中的所有資料以一致性方式持久化到資料檔案中,保證資料檔案和記憶體資料是一致的。Wiredtiger串連初始化時,首先將資料恢複至最新的快照狀態,然後根據預寫記錄檔檔案恢複資料,以保證儲存可靠性。
4. 記憶體使用量上限可配置
使用WiredTiger儲存引擎時,MongoDB資料緩衝分兩部分:內部緩衝和檔案系統快取。內部緩衝大小可以使用--wiredTigerCacheSizeGB參數來設定,預設值為:1GB或RAM的60%到1GB之間,取兩值中較大者。檔案系統快取大小則不固定,MongoDB自動使用系統閒置記憶體,且資料在檔案系統快取中是壓縮儲存的。
5. 資料壓縮
使用WiredTiger儲存引擎時,資料庫的集合與索引、記錄檔都是壓縮儲存的,節省了磁碟空間。WiredTiger預設情況下,集合資料使用塊壓縮演算法,索引資料則使用首碼壓縮演算法。這使得資料佔用磁碟空間少,讀寫速度快,花費I/O時間少。
集合中資料比較少時,壓縮和無壓縮的寫效能相單,無壓縮讀效能反而比壓縮讀效能好。當集合資料很多時,壓縮的讀寫效能則都要比無壓縮的讀寫效能好。
一篇剖析WiredTiger資料群組織結構的文章:http://mini.eastday.com/mobile/160630190233714.html。
MongoDB儲存引擎(中)——WiredTiger