今天淩晨,我熬夜看完了整場國足對陣伊朗的亞洲杯八分之一決賽,最後的比分是國足0:3告負,無緣8強。結果确實不盡人意,其實每個中國球迷心裡都知道,這場比賽兇多吉少,但為啥還是想看,因為一顆不死的心,因為希望有奇迹的發生。因為我心中有國足隊長鄭智。想看這位真愛足球的國足老隊長踢完國家隊的這最後一場比賽。整場比賽的三個丢球現在再去抱怨是由于後衛的低級失誤所導緻的,已經變得很索然無味了。 我們要敢于承認差距,敢于接受錯誤與批評。有些事兒想要成功,并不是簡簡單單通過花錢請一個高水準的教練就能解決的。像我們這些做技術的兄弟們也一樣,做好技術是一條漫長而又艱辛的道路。怎麼了解什麼叫技術呢?“技”:就是我們所學習的專業知識;“術“:就是要把所學習知識到發揚出去,讓更多的人受益。今天選擇給大家介紹一下MongoDB的核心Wired Tiger插件式存儲引擎。也宣告我的個人公衆号”我不叫那誰”正式成立。未來會與大家一起學習主流技術,後續會陸續更新MySQL,PG,MongoDB,python,go,hadoop等學習文章。(有兄弟抱怨我說,老分享MySQL和MongoDB的文章,能不能分享點PG,python等相關知識,放心各位老鐵,下次就會更新!)
Wired Tiger存儲引擎架構模型圖如下:

MongoDB從3.0開始引入了WiredTiger存儲引擎,但對于原來的MMAP V1(3.0版本預設)也有改動。
但WiredTiger無論是從鎖的粒度(庫級别鎖提升為文檔級别鎖)通過MVCC實作文檔級别的并發控制,允許多個用戶端請求同時更新一個集合記憶體的多個文檔,再也不需要在排隊等待庫級别的寫鎖。這在提升資料庫讀寫性能的同時,也大大提高了系統的并發處理能力。
還有在存儲方式上(WiredTiger在集合和索引級别配置設定檔案,資料庫中的所有集合和索引均存儲在單獨的檔案中,集合或者索引删除後,
對應的存儲檔案随即删除。友善回收磁盤空間)、還支援磁盤資料壓縮也大大節約了磁盤使用成本。
是以從3.2版本起把WiredTiger作為預設的存儲引擎。到此4.0版本支援多文檔事務,4.2要支援分片級别的事務。
既然說到支援事務,那麼就必須滿足事務的ACID特性和應該有的事務隔離級别。WiredTiger支援快照型的事務隔離級别(snapshot)
什麼是事務的snapshot?這裡給大家簡單聊一些,其實就是事務開始或者進行操作之前對整個wired tiger存儲引擎内部正在執行或者将要執行的事務進行一次快照,
儲存當時整個引擎所有事務的狀态,确定哪些事務是自己可見的,哪些事務是不可見。然後通過MVCC來實作事務的沖突檢測。如圖所示;
每個事務開始操作,都會記錄它所操作的該條記錄的版本号資訊。事務a更新完之後,會把事務标号加1。然而這時的事務b就需要在加1的基礎上去更新新的資料,來實作沖突檢測。
Wired Tiger對記憶體的管理;
wiredTiger對記憶體使用會分為兩大部分,一部分是内部記憶體,另外一部分是檔案系統的緩存。如下圖
内部記憶體可以預設值是實體記憶體的50%(忽略記憶體小于1G的情況)。那麼剩下來的記憶體交由檔案系統使用,對于wired tiger資料儲存是壓縮完之後的狀态。是以資料從磁盤讀到記憶體,是需要經曆如下圖;資料所呈現的格式是不一樣的。MongoDB會把經常使用到的資料放到IC中,
WiredTiger會通過檔案系統緩存,自動使用其他所有的空閑記憶體,
放在檔案系統緩存裡面的資料,與磁盤上的資料格式一緻,可以有效減少磁盤I/O。
cache結構梳理圖:
資料在記憶體中是以btree的結構形式進行存儲,會通過wired tiger塊管理器把資料先讀取到IC中,然後更新它之後,頁會變成髒頁。最後再次調用塊管理器,MongoDB内部預設60s會把髒data刷到磁盤。
以上就是我對于Wired Tiger的了解分析。
我們做技術的兄弟們,很不容易,每天面臨各種各樣的挑戰與生活壓力帶給我們的心酸與痛楚。想要成功,自己的基本功還是要過硬。希望國足的失利能帶給你我一些深刻的反思與未來成功的啟示。