1. 程式人生 > 其它 >MongoDB體系架構

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⼀樣,⽀持內嵌的⽂檔物件和數組物件,但是BSONJSON沒有的⼀些資料型別,如DateBinary Data型別。 BSON可以做為⽹絡資料交換的⼀

種儲存形式,是⼀種schema-less的儲存形式,它的優點是靈活性⾼,但它的缺點是空間利⽤率不是很理想。{key:value,key2:value2} 這是⼀個BSON的例⼦,其中key是字串型別,後⾯的value值,它的型別⼀般是字元,double,Array,ISODate等型別。BSON有三個特點:輕量性、可遍歷性、⾼效性。

   MongoDBDocument 中 可以出現的資料型別,如下:

          

  以上資料均通過MongoDB提供的資料模型進行相應儲存,其中資料模型有內嵌和引用兩種。

  內嵌指的是把相關聯的資料儲存在同⼀個⽂檔結構之中。 MongoDB的⽂檔結構允許⼀個欄位或者⼀個

陣列內的值作為⼀個巢狀的⽂檔。通常以下三種情況下選擇使用內嵌資料模型:

    1. 資料物件之間有包含關係 ,⼀般是資料物件之間有⼀對多或者⼀對⼀的關係 。

    2. 需要經常⼀起讀取的資料。

    3. 有 map-reduce/aggregation 需求的資料放在⼀起,這些操作都只能操作單個 collection

  引⽤指通過儲存資料引⽤資訊來實現兩個不同⽂檔之間的關聯,應⽤程式可以通過解析這些資料引⽤來訪問相關資料。通常以下三種情況選擇引用資料模型:

    1. 當內嵌資料會導致很多資料的重複,並且讀效能的優勢⼜不⾜於覆蓋資料重複的弊端 。

    2. 需要表達⽐較複雜的多對多關係的時候 。

    3. ⼤型層次結果資料集 巢狀不要太深。

  那MongoDB內部具體是如何將資料儲存到硬碟和記憶體的呢?這就是儲存引擎的工作了——儲存引擎是MongoDB的核⼼元件,專門,負責管理資料如何儲存在硬碟和記憶體上。

  MongoDB⽀持的儲存引擎有好幾種,有MMAPv1,WiredTigerInMemoryInMemory儲存引擎⽤於將資料只儲存在記憶體中,只將少量的元資料(meta-data)和診斷⽇志(Diagnostic)儲存到硬碟⽂件中,由於不需要DiskIO操作,就能獲取所需的資料, InMemory儲存引擎⼤幅度降低了資料查詢的延遲(Latency)。從mongodb3.2開始預設的儲存引擎是WiredTiger,3.2版本之前的預設儲存引擎是MMAPv1mongodb4.x版本不再⽀持MMAPv1儲存引擎——整體而言其與MySQL儲存引擎的思想一樣。

  配置檔案中關於儲存引擎的相關配置如下圖:/etc/mongod.conf

           

   可參考下圖配置適合專案的儲存引擎: