Mongodb學習整理之數據存儲引擎

從Mongodb4.0開始Mongodb加入了事務控制,那麼我們就來整理一下事務控制實現得益於什麼?在3.0之前Mongodb默認的存儲方式是MMAPv1,在3.0版本後加入了WiredTiger存儲引擎。在4.0之後棄用了存儲引擎MMAPv1,那麼這兩種存儲引擎之間有什麼區別呢?MMAPv1他的併發控制級別是(collection)級別的就是說他的鎖是加在集合上面的,就是說如果有人在寫這個集合那麼其他人就只能等待他釋放鎖。WiredTiger併發控制級別是(Document)級別的,就是說他的鎖是加在文檔級別的,粒度已經跟關係型數據庫差不多了,因爲我們說數據庫的有效鎖定是行級鎖,所以WiredTiger對高併發性能提高還是非常明顯的。下面是官網對這兩種引擎模型的說明。

For WiredTiger
Beginning with version 3.0, MongoDB ships with the WiredTiger storage engine.
For most read and write operations, WiredTiger uses optimistic concurrency control. WiredTiger uses only intent locks at the global, database and collection levels. When the storage engine detects conflicts between two operations, one will incur a write conflict causing MongoDB to transparently retry that operation.Some global operations, typically short lived operations involving multiple databases, still require a global “instance-wide” lock. Some other operations, such as dropping a collection, still require an exclusive database lock.
For MMAPv1
The MMAPv1 storage engine uses collection-level locking as of the 3.0 release series, an improvement on earlier versions in which the database lock was the finest-grain lock. Third-party storage engines may either use collection-level locking or implement their own finer-grained concurrency control.For example, if you have six collections in a database using the MMAPv1 storage engine and an operation takes a collection-level write
lock, the other five collections are still available for read and write operations. An exclusive database lock makes all six collections unavailable for the duration of the operation holding the lock.What is a storage engine?A storage engine is the part of a database that is responsible for managing how data is stored, both in memory and on disk. Many databases support multiple storage engines, where different engines perform better for specific workloads. For example, one storage engine might offer better performance for read-heavy workloads, and another might support a higher throughput for write operations.ou can have replica set members that use different storage engines.

下面開始我們所有的知識點的整理都是圍繞着WiredTiger存儲引擎整理的,對於WiredTiger,mongodb同時使用WiredTiger內部緩存和文件系統緩存。從MongoDB 3.4開始,默認wiredtiger內部緩存大小爲以下兩者中的較大值:50%(RAM-1 GB),或256兆字節。舉例來說,假如你的系統有4G的RAM,則wiredtiger內部緩存使用的內存大小是(4G-1G)*0.5=1.5G,如果你的系統總共有1.25G的RAM,按照剛纔的公司(1.25G-1G)*0.5=128M,結果小於256M,這是wiredtiger內部緩存大小是256M。如果想要詳細控制Mongodb的內存使用量的話可以使用參數storage.wiredTiger.engineConfig.cacheSizeGB爲nG,也就是根據情況設置幾個G或幾百M。

默認wiredtiger內部緩存大小值假定每臺計算機只有一個mongod實例。如果一臺機器包含多個MongoDB實例,那麼應該減少設置以適應其他MongoD實例。如果在無法訪問系統中所有可用RAM的容器(例如lxc、cgroups、docker等)中運行mongod,則必須將storage.wiredtiger.engineconfig.cachesizegb設置爲小於容器中可用RAM數量的值。確切數量取決於容器中運行的其他進程。有一點是需要重點關注的地方,wiredtiger存儲引擎在刪除文檔時維護數據文件中的空記錄列表。這個空間可以被wiredtiger重用,但是除非在非常特殊的情況下,否則不會返回到操作系統。

默認情況下,wiredtiger對所有集合使用快速塊壓縮,對所有索引使用前綴壓縮。壓縮默認值可以在全局級別配置,也可以在收集和索引創建期間按每個集合和每個索引設置。Wiredtiger內部緩存中的數據與磁盤格式使用不同的表示形式:文件系統緩存中的數據與磁盤格式相同,包括對數據文件進行壓縮的好處。操作系統使用文件系統緩存來減少磁盤I/O。wiredtiger內部緩存中加載的索引與磁盤格式具有不同的數據表示形式,但仍可以利用索引前綴壓縮來減少RAM使用。索引前綴壓縮將刪除索引字段中的常見前綴。wiredtiger內部緩存中的收集數據是未壓縮的,使用與磁盤格式不同的表示形式。塊壓縮可以節省大量的磁盤存儲空間,但數據必須解壓縮才能由服務器操作。通過文件系統緩存,MongoDB自動使用WiredTiger緩存或其他進程未使用的所有可用內存。

Checkpoints
從3.6版開始,mongodb將wiredtiger配置爲每隔60秒創建檢查點(即,將快照數據寫入磁盤)。在早期版本中,MongoDB將檢查點設置爲每隔60秒或在寫入2GB日誌數據時(以先發生者爲準)在wiredtiger中對用戶數據執行檢查。

Journal Data
MongoDB根據以下間隔或條件寫入磁盤:MongoDB每隔50毫秒將緩衝日誌數據同步到磁盤(從MongoDB 3.2開始)如果寫入操作包含j:true的寫入問題,wiredtiger將強制同步wiredtiger日誌文件。因爲MongoDB使用的日誌文件大小限制爲100MB,所以wiredtiger大約每100MB數據創建一個新的日誌文件。當wiredtiger創建新的日誌文件時,wiredtiger將同步上一個日誌文件。

目前,MongoDB使用的是內存映射存儲引擎,它會把磁盤IO操作轉換成內存操作,如果是讀操作,內存中的數據起到緩存的作用,如果是寫操作,內存還可以把隨機的寫操作轉換成順序的寫操作,總之可以大幅度提升性能。MongoDB並不干涉內存管理工作,而是把這些工作留給操作系統的虛擬緩存管理器去處理,這樣的好處是簡化了MongoDB的工作,但壞處是你沒有方法很方便的控制MongoDB佔多大內存,事實上MongoDB會佔用所有能用的內存,所以最好不要把別的服務和MongoDB放一起。 那麼Mongodb的內存具體設置多大合適呢?(內存 > 索引 + 熱數據)就是理想的一個狀態,所以如果業務量比較小的數據還是可以的,如果業務量真的是很大的話還是做數據分片吧,Mongodb的數據分片是非常容易的,不過可能會有一些成本。還有一點比較重要就是不要講Mongodb和其他一些對內存,硬盤等使用率比較高的應用部署在一個環境,如數據庫,redis等。

今天的總結就是這些了,Mongodb需要整理的知識還是很多,簡單的使用並不能讓你很好的理解一個產品的核心原來,官網是一個比較詳細的產品說明書,而想要深入理解還需要在實踐中不斷總結,思考,對比,當各種方案融合之後,出現了各種問提纔是我們真正提高的時候,如果只是初窺門徑,沒有任何生成中的問題檢驗是沒有任何意義的,真所謂實踐出真知,實踐是檢驗一切的真理,送給各位看客。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章