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有三個特點:輕量性、可遍歷性、⾼效性。

  BSON的優點是靈活性⾼,⽐關系型數據庫存儲更⽅便。⽐如關系型數據庫中處理⽤戶、訂單等數據要建⽴對應的表,還要建⽴它們之間的關聯關系。但是BSON就不⼀樣了,可以直接把⼀條數據和這條數據對應的數據都存⼊⼀個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

           

   可參考下圖配置適合項目的存儲引擎:

          

 

   

 

 

 

    



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM