MongoDB體系架構
前兩篇檔案初步介紹了MongoDB的安裝及使用。在MongoDB命令之基本操作 - 池塘裡洗澡的鴨子 - 部落格園 (cnblogs.com)中可以看到同MySQL一樣,MongoDB也是先建立資料庫之後在建立collections;然後在collections中Insert資料。那麼MongoDB內部資料如何分層儲存的呢?下面聊聊MongoDB整體的架構。
MongoDB 與 MySQL 中的架構相差不多,底層都使⽤了可插拔的儲存引擎以滿⾜⽤戶的不同需要。⽤戶可以根據程式的資料特徵選擇不同的儲存引擎,在最新版本的 MongoDB 中使⽤了 WiredTiger 作為預設的儲存引擎,WiredTiger 提供了不同粒度的併發控制和壓縮機制,能夠為不同種類的應⽤提供了最好的效能和儲存率。在儲存引擎上層的就是 MongoDB 的資料模型和查詢語⾔了,由於 MongoDB 對資料的儲存與 RDBMS 有較⼤的差異,所以它建立了⼀套不同的資料模型和查詢語⾔。
MongoDB整體層次結構如上圖示,MongoDB實力與Database,Database與Collecitons均是一對多關係。其內部儲存資料與關係型資料庫有明顯的差別——其儲存的是Document。
RDBMS中熟悉的row/column的術語在MongoDB中不再適用,取而代之是document/field等——其中document是BSON格式的文件。
什麼是BSON呢?BSON是⼀種類json的⼀種⼆進位制形式的儲存格式,簡稱Binary JSON,它和JSON⼀樣,⽀持內嵌的⽂檔物件和數組物件,但是BSON有JSON沒有的⼀些資料型別,如Date和Binary Data型別。 BSON可以做為⽹絡資料交換的⼀
MongoDB中Document 中 可以出現的資料型別,如下:
以上資料均通過MongoDB提供的資料模型進行相應儲存,其中資料模型有內嵌和引用兩種。
內嵌指的是把相關聯的資料儲存在同⼀個⽂檔結構之中。 MongoDB的⽂檔結構允許⼀個欄位或者⼀個
1. 資料物件之間有包含關係 ,⼀般是資料物件之間有⼀對多或者⼀對⼀的關係 。
2. 需要經常⼀起讀取的資料。
3. 有 map-reduce/aggregation 需求的資料放在⼀起,這些操作都只能操作單個 collection。
引⽤指通過儲存資料引⽤資訊來實現兩個不同⽂檔之間的關聯,應⽤程式可以通過解析這些資料引⽤來訪問相關資料。通常以下三種情況選擇引用資料模型:
1. 當內嵌資料會導致很多資料的重複,並且讀效能的優勢⼜不⾜於覆蓋資料重複的弊端 。
2. 需要表達⽐較複雜的多對多關係的時候 。
3. ⼤型層次結果資料集 巢狀不要太深。
那MongoDB內部具體是如何將資料儲存到硬碟和記憶體的呢?這就是儲存引擎的工作了——儲存引擎是MongoDB的核⼼元件,專門,負責管理資料如何儲存在硬碟和記憶體上。
MongoDB⽀持的儲存引擎有好幾種,有MMAPv1,WiredTiger和InMemory。 InMemory儲存引擎⽤於將資料只儲存在記憶體中,只將少量的元資料(meta-data)和診斷⽇志(Diagnostic)儲存到硬碟⽂件中,由於不需要Disk的IO操作,就能獲取所需的資料, InMemory儲存引擎⼤幅度降低了資料查詢的延遲(Latency)。從mongodb3.2開始預設的儲存引擎是WiredTiger,3.2版本之前的預設儲存引擎是MMAPv1, mongodb4.x版本不再⽀持MMAPv1儲存引擎——整體而言其與MySQL儲存引擎的思想一樣。
配置檔案中關於儲存引擎的相關配置如下圖:/etc/mongod.conf
可參考下圖配置適合專案的儲存引擎: