mongodb同时更新一条记录_MongoDB 存储和优化系列一
生活随笔
收集整理的這篇文章主要介紹了
mongodb同时更新一条记录_MongoDB 存储和优化系列一
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
因工作的需要開始接觸mongodb這個非關系型數據庫,下面就將從mongoDb的存儲機制和索引的使用倆方面來探究一下mongoDb的內部原理。
mongoDb在早期采用了MMAP存儲引擎機制來實現數據的存儲,直到mongoDb3.0 之后才引入了插件式的存儲機制來支持更多的存儲引擎,同時也升級MMAP到MMAP V1 ,并且MMAPV1作為默認的存儲引擎 ,但是用戶可以選擇其它的存儲引擎,例如 WiredTiger,InMemory 這些知名的插件存儲引擎,到MongoDb 3.2的時候默認的存儲引擎已經變更為Wired Tiger ,具體的架構如下圖:
存儲引擎的架構簡介- MMAPV1 存儲引擎是一種原始的存儲引擎,它是基于內存映射文件來實現的,它擅長使用大容量插入,讀取,更新工作負載,是出了名的耗內存,占資源,它會自動占有機器的全部可用內存來緩存數據,但是這個過程是動態的,當其它的進程要使用內存的時候,MMAPV1也會把Cache的內存分配給其它的進程 ,它采用的是操作系統的虛擬內存系統來管理自己的內存的
WT 存儲引擎 我們將從如下的7方面就行介紹
- 上面我們介紹的MMAP存儲引擎中所有的操作都是基于Collection級以上的互斥鎖機制,這樣的機制會使得整個數據庫的并發的性能下降,然而WT存儲引擎截然不同,在日常的使用中大多數對數據庫的更新操作都只會對集合中少量的Document進行更新,同時對多個Collection進行更新情況特別的少,對多個DataBase對更新則是更為罕見了,由此可見僅支持Collection級別是遠遠不夠的 ,相對于MMAPV1 ,WT采用了Document樂觀鎖機制。WT樂觀鎖機制與其它樂觀鎖實現機制大同小異,WT會在更新Document前記住即將被更新的所有Document當前版本號,并在更新前再次驗證當前的版本號,若當前版本號沒有發生改變,則說明該document在該原子事件中沒有被其它請求更新,可以順利寫入,并且修改版本號;如果版本號發生改變,則說明該document在更新發生之前已經被其它的請求更新,由此觸發一次寫沖突,不過在遇到寫沖突之后,WT會重試自動更新,但是這不代表WT對所有操作都采用如此寬松的的樂觀鎖機制,對于某些全局的操作,WT依然會在Collection級,Database級甚至是Instance級的互斥鎖機制,但是這樣的全局操作實際上很少發生,通常只在DBA維護的時候才觸發。
- 在checkpoint操作開始時,WT提供指定時間點的數據庫快照(Snapshot),該snapshot呈現的是內存中數據的一致性視圖,當向Disk寫入數據的時,WT將Snapshot中所有的數據以一致性的方式寫入到數據文件Disk File中,一旦checkpint創建成功,WT保證了內存中的數據和磁盤中的數據保持一致性,因此CheckPoint充當的是還原點。 當WT創建Checkpoint的時,Mongo將數據刷新到數據文件中,默認情況下,WT創建還原點是60s,或者是產生2GB的journal文件,WT創建checkpoint期間,上一個checkpoint還依然有效,這意味的如果Mongo在創建新的Checkpoint期間遇到錯誤而終止,只要重啟Mongo就能從上一個checkpoint中恢復過來。
- WT采用預寫日志的機制,在數據更新的時候,向將數據寫入到日志文件,然后在創建Checkpoint開始時,將日志文件中的記錄操作,刷新到數據文件,就是說通過,預寫日志和Checkpoint,將數據更新持久化到數據文件中,實現數據的一致性,WT日志文件會記錄從上一次Checkpoint操作的之后發生的所有數據更新,在Mongo系統奔潰時通過日志文件能夠還原到上次Checkpoint操作之后發生的數據更新。
- WT利用內存資源緩存倆部分數據,內部緩存,文件系統緩存,WT 內部緩存默認的使用量從1GB或60% of Ram,然而文件系統的緩存使用量不確定,Mongo 自動使用系統空閑內存,并且數據在文件系統緩存中壓縮存儲的。
- WT內部緩存的大小可以通過命令 -wiredtigercacheSizeDb來修改Mongo中WT緩存的大小,并且根據系統的RAM內存大小來計算合適的內存使用量
- 相比MMAPV1只是單純的將Bson數據直接存儲在磁盤上,WT則會在內存中的數據存儲到磁盤前做一次壓縮,這樣的處理非常好的節省了磁盤的空間,但也增加了CPU的負擔,目前WT采用來Snappy和前綴壓縮倆種算法,其中snappy是默認的用于所有的Collection 的壓縮算法,而前綴壓縮則是用于對索引的壓縮
- 當從mongodb中刪除Document和或者是Collection的時候,Mongodb不會自動的釋放磁盤的空間給操作系統,而是將在數據文件中維護一個Empty Records的列表,當數據重現插入時,Mongo將從Empty Records列表中分配新的存儲空間給新的Document,不需要開辟新的存儲空間,因此為了更有效的重用磁盤的空間,必須進行磁盤的碎片整理。WT中采用Compact命令來來移除Collection和索引的碎片,并將不實用的空間釋放。
- In Memory 存儲引擎
介紹完mongodb的存儲,我們在來看看mongodb的索引,mongodb中索引和其它的關系型數據庫一樣采用B-Tree的方式來存儲的,如下圖
B-Tree參考文檔如下
Mongodb存儲引擎的變化?www.jianshu.comhttps://docs.mongodb.com/manual/core/wiredtiger/?docs.mongodb.comWiredTiger Storage EngineWiredTiger Storage Engine?docs.mongodb.comhttps://docs.mongodb.com/manual/core/journaling/?docs.mongodb.comJournaling - MongoDB Manualhttps://docs.mongodb.com/manual/core/journaling/?docs.mongodb.com張友東:MongoDB 存儲引擎 mmapv1 原理解析?zhuanlan.zhihu.comhttps://docs.mongodb.com/manual/core/inmemory/?docs.mongodb.comIn-Memory Storage EngineIn-Memory Storage Engine?docs.mongodb.comhttps://docs.mongodb.com/manual/reference/command/compact/#dbcmd.compact?docs.mongodb.comcompact - MongoDB Manualhttps://docs.mongodb.com/manual/reference/command/compact/#dbcmd.compact?docs.mongodb.comMongoDB 存儲引擎 WiredTiger 原理解析?www.mongoing.comMongoDB 存儲引擎?mr-dai.github.ioMongoDB新存儲引擎WiredTiger實現(事務篇)?www.jianshu.com帶你深入理解有效的MongoDB索引 - 51CTO.COM?database.51cto.com總結
以上是生活随笔為你收集整理的mongodb同时更新一条记录_MongoDB 存储和优化系列一的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis-plus根据多个字段排序
- 下一篇: python超市管理系统_控制台超市系统