前言:
最近在看MongoDB相關知識,剛開始聽到MongoDB時,一臉懵圈,這是個啥子數據庫呀 。html
可是經過學習後,發現這個數據庫挺牛掰的呀;嘿嘿 。。。。java
下面就帶你們一塊兒聊聊這個數據庫 ,看看它到底有什麼牛掰之處 。數據庫
本文主線:
①、MongoDB 簡介緩存
②、MongoDB支持的功能有哪些?安全
③、MongoDB的存儲引擎簡述服務器
④、MongoDB知識擴展併發
MongoDB 簡介:
MongnDB是一個 分佈式文件存儲數據庫 (或叫文檔數據庫);app
MongoDB是一個介於 關係數據庫和非關係數據庫 之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫,最接近關係型數據庫的。分佈式
MongoDB的數據邏輯結構:
首先說下 MongoDB 的數據邏輯層次: 數據庫(database)、集合(collection)、文檔(document) 。函數
MongoDB數據邏輯層次的關係以下圖:
MongoDB與關係數據庫的數據邏輯結構比較:
經過上圖能夠知道MongoDB和關係數據庫之間的數據邏輯結構對應關係了吧,再來將關係對應一會兒:
數據庫 ------ 數據庫 、 Table表 ------ Collection集合 、 Row 行記錄 ------ Document 文檔
下面咱來聊聊上圖Document文檔中 { "name" : "lyl", "age" : 25} 看起來跟 JSON 格式同樣的數據究竟是個什麼東東?
MongoDB中文檔的數據存儲結構:
MongoDB的文件數據存儲結構是 BSON ;Bson是 Binary JSON 縮寫,是相似於JSON的文檔的二進制編碼序列化。
Bson的特色:
- 輕量性
- 可遍歷性
- 高效性
來再具體看看MongoDB的Bson格式文檔數據到底長神魔樣呢?
經過上圖咱們對MongoDB總體有了一個基本的瞭解,接下來咱們在簡單聊聊它到底有哪些功能呢?看看它到底支持了什麼 牛掰 的功能讓它一直這麼火。
MongoDB支持的功能:
咱先貼一張摘抄自網上的大圖:描述MongoDB的主要特性;
除了支持上文的特性外,MongoDB還支持不少強大的功能:
- BSON文檔模型:
- 動態的數據模式
- 使用高效的二進制數據存儲,包括大型對象(如視頻等)。
- 動態查詢
- 全文搜索
- 聚合操做:
- 聚合管道
- Map - Reduce
- 單一目的聚合方法
- 水平擴展(高擴展):
- 主從複製(搭建主從複製集羣)
- 數據分片(搭建數據分片集羣)
- 數據分片 + 主從複製 = 更增強大的集羣系統
- 高可用、支持故障恢復
- 支持大文件存儲GridFS
- 企業級安全
- 支持強大的索引:
- 單字段索引
- 複覈索引
- 多鍵索引
- 文本索引
- 通配符索引
- 地理位置索引
- 哈希索引
- 索引特性:
- TTL索引
- 惟一索引
- 部分索引
- 稀疏索引
- 索引交集
- 4.0版本支持多文檔事務,4.2版本支持分佈式事務
- 支持多種存儲引擎
- MMAP 存儲引擎
- MMAPV1 存儲引擎
- WiredTiger存儲引擎
- In-Memory 存儲引擎
注:上面只是列出的MongoDB主要支持的功能,想要了解具體的每項功能,能夠自行去查閱資料昂。
下面來聊聊MongoDB中十分重要的存儲引擎,由於存儲引擎是MongoDB負責管理數據的主要組件,而且像 事務、併發鎖、存儲數據的操做等 都是由存儲引擎支持的。
MongoDB的存儲引擎:
MongoDB支持多種存儲引擎,下面我們就簡單聊聊MongoDB的這幾種存儲引擎;
原生存儲引擎MMAP:
MMAP 全稱爲 Memory Mapped Storage Engine,即 內存映射存儲引擎 ,在 3.0版本以前 使用的 。
MMAP能夠把磁盤文件的一部分或所有內容直接映射到內存,這樣文件中的信息位置就會在內存中有對應的地址空間,這時對文件的讀寫能夠直接用指針來作,而不須要read/write函數了,但這並不表明將文件map到物理內存,只有訪問到這塊數據時纔會被操做系統以Page的方式換到物理內存。
在MongoDB的寫操做時,先將數據放在內存中,而後再經過順序IO將數據刷新保存到磁盤上,這樣會大大提高寫操做性能;而且MongoDB將內存管理工做交給操做系統的虛擬內存管理器來完成,這樣也大大簡化了MongoDB的工做 。
原生升級 MMAPV1 存儲引擎:
在 MongoDB3.0版本時 ,推出了 MMAPV1 存儲引擎,這是在原生存儲引擎基礎上更新升級的新存儲引擎 。
在 MMAPV1 存儲引擎中有一個很重要的日誌文件: journal預寫事務日誌 ,使用這個日誌文件保證數據的持久化,並保證在數據庫硬關閉時幫助數據庫恢復。
插入式 WiredTiger 存儲引擎:
WiredTiger是在 MongoDB3.0版本 引入的,而且在 MongoDB3.2版本 開始成爲MongoDB默認的存儲引擎。
相比較MMAPv1,WiredTiger存儲引擎功能更強大,並且具備更高的性能。
WiredTiger存儲引擎中也有 journal預寫事務日誌 ,用來保證數據持久化及數據庫故障時數據恢復 。
In-Memory 存儲引擎:
In-Memory存儲引擎將數據庫數據都存儲在 內存 中,只將少許的元數據和診斷日誌、臨時數據存儲到硬盤文件中,避免了磁盤I/O操做,查詢速度很快。
若是MongoDB使用 In-Memory 存儲引擎的話,是否是很相似於 Redis 內存數據庫呢。
存儲引擎之間的比較:
下面將經過在各方面比較下 MMAPV1 、WiredTiger 、In-Memory 這三種存儲引擎,更加清晰的明確多種存儲引擎之間的區別。
點擊看大圖:
注意:當各位大大閱讀本文時,請必定要結合本身使用的 MongoDB的版本 ,由於不一樣版本支持的功能多是不一樣的,確認好本身使用的版本是否支持想要的功能。
MongoDB 知識擴展:
爲何很吃內存?
在使用MongoDB數據庫的時候,發現安裝了MongoDB的服務器可用內存一直在減小,經過查找發現MongoDB在使用時一直在不斷的吃內存,MongoDB佔用的內存的愈來愈多。
爲何MongoDB這麼佔用內存呢?
下面簡單從兩方面說下:
- 經過上面的存儲引擎的描述能夠知道,例如 : WiredTiger存儲引擎的寫操做會先寫入Cache中,將數據保存在內存中,而後再經過機制將內存中的數據落盤,可是最終內存中的數據仍是會保留下來的,只是會將已經落盤的數據坐下標記。
- 當大量併發請求MongoDB數據庫時,它使用的內存也會上漲;由於在併發鏈接比較多時,會大量建立處理鏈接的線程,這些線程也會佔用內存的;除此以外,創建好鏈接後,處理鏈接中傳輸的數據包,這些數據包的存儲也須要佔用內存的;可是這種佔用的內存會在請求降低後,慢慢的將內存釋放的。
如何控制內存的使用:
下面簡單在兩方面聊下怎麼控制MongoDB對內存的使用,但願別再觸發服務器內存耗盡的告警了。
- 合理配置 WiredTiger cacheSizeGB 參數:
- 若是一臺機器上只部署 MongoDB,MongoDB可使用全部可用內存,則是用默認配置便可。
- 若是一臺機器上不止部署了MongoDB,還運行一些其餘的進程服務,則須要根據分給MongoDB的內存配額來配置 cacheSizeGB ,也可按配額的60%左右配置。
- 控制對MongoDB的併發請求數,進行合理的TCP鏈接數;
MongoDB的應用場景:
根據MongoDB的特性和支持的功能,簡單聊聊它適用的應用場景:
- 應用服務器日誌存儲。
- MongoDB的高性能足夠支撐關係型數據庫2-3倍以上的TPS/QPS;
- 磁盤數據壓縮存儲,在進行數據讀取時下降磁盤IO的次數,提高數據讀取性能;
- 支持功能強大的索引
- 動態的數據模式,不受表結構的限制;
- 地理位置信息存儲,經過地理位置索引,能夠方便、快速的查詢出具體的位置信息。
- 看成緩存數據庫,使用其In-Memory 存儲引擎;
- 網站實時數據處理;它很是適合實時的插入、更新與查詢,並具有網站實時數據存儲所需的複製及高度伸縮性。
------end
到此本文就結束了,本文只是和你們聊了聊MongoDB的基礎知識,細節部分都沒有具體描述,你們若是感興趣的能夠自行去查閱資料。
最後了,再和你們嘮叨下, 打算最近寫下MongoDB系列文章,系列文章題目都已經想好了,以下:
①、初聞MongoDB(一)、從零帶你瞭解MongoDB的前世此生
②、初識MongoDB(二)、數據庫安裝及可視化工具的安裝使用
③、相識MongoDB(三)、MongoDB經常使用的SQL語句和索引知識
④、相知MongoDB(四)、使用java鏈接和操做MongoDB數據庫
⑤、相愛MongoDB(五)、一文帶你瞭解MongoDB的實戰操做使用
♡ 點贊 + 評論 + 轉發 喲
您能夠VX搜索【木子雷】公衆號,堅持高質量原創java技術文章,福利多多喲!
還有你們若是想看系列後續的文章話,請多多點贊評論呀,大家的支持就是我不斷創做的動力!