一、概述
(1)版本歷程
- 0.x 起步節點
- 1.x 支持複製集和分片
- 2.x 更加豐富的數據庫功能
- 3.x 合併了一家專門做數據庫引擎的Wired Tiger公司,更加完善的周邊生態環境
- 4.x 支持分佈式事務
MongoDB的正式版本都是偶數版本,x.x.x,主要版本(x.x)大約每年升級一次,小版本主要是修復問題,通常1-2個月發佈一次。
MongoDB支持原生高可用:Application通過Driver連接到Primary節點,一個Primary節點連接多個Secondary節點。
MongoDB支持水平擴展,分片集羣:Driver連接多個Mongos,Mongos連接多個Shard,每個Shard都是一個Primary和多個Secondary。
二、複製集
主要用於實現服務的高可用
(1)特徵
MongoDB的複製集主要具備如下特徵:
- 快速複製:數據寫入時將數據迅速複製到另一個節點。
- 故障轉移:在接受寫入的節點發生故障的時候自動選擇另一個新的節點代替。
- 其他作用:數據分發、讀寫分離、異地容災。
(2)MongoDB的數據複製原理
- 一個修改操作會被記錄到oplog,有一個線程監聽oplog,如果有變動就會將這個變動應用到其他的數據庫上。
- 從節點在主節點上打開一個tailable遊標,不斷獲取新加入的oplog,並在從庫上回放。
(3)節點間選舉
-
一個典型的複製集由3個以上具有投票權的節點構成,一個Primary接受寫入操作和選舉時投票,兩個Secondary複製Primary節點數據和選舉時投票。
- 具有投票權的節點兩兩發送心跳數據,主節點5次沒有收到心跳被定義爲失聯狀態。然後MongoDB基於Raft協議進行選舉。
- Replica Set中最多50個節點,具有投票權的節點最多隻有7個。
- 影響選舉的因素:整個集羣必須有大多數節點存活。
- 被選舉爲主節點的條件:
- 能夠與多數節點建立連接
- 具有較新的oplog
- 具有較高的優先級(可以配置)
- 常用的配置選項:
- 是否具有投票權(v參數):有就會參與投票。
- 優先級(priority參數):優先級越高的節點越優先稱爲主節點。優先級爲0的節點無法成爲主節點。
- 隱藏(hidden參數):複製數據,但是對應用不可見。隱藏節點具有投票權,但是優先級必須爲0。
- 延遲(slaveDelay參數):複製N秒之前的數據,報紙與主節點的時間差。
- 複製集的部署事項:主從數據庫配置一樣,硬件具有獨立性,軟件版本一致。
三、分片集羣
(1)mongos路由節點
- 提供集羣的單一入口
- 轉發應用端請求
- 選擇合適的數據節點進行讀寫
- 合併多個數據額節點的返回結果
- 無狀態
- 至少有兩個mongos節點
(2)config配置目錄節點
- 提供集羣元數據的存儲,分片數據分佈的映射
(3)數據節點
- 以複製集爲單位
- 橫向擴展
- 最大1024個分片
- 分片之間數據不能重複
- 所有分片在一起纔可以完成工作
(4)特點
- 對應用全透明,無須特殊處理
- 數據自動均衡
- 動態擴容,無須下線
- 提供三種分片方式
(5)分片集羣的3中方式
- 基於範圍:片鍵範圍查詢性能好,優化讀,數據分佈可能不均勻,容易產生熱點。
- 基於Hash:數據分佈均勻,寫優化,範圍查詢效率低,適用於日誌,物聯網高併發場景。
- 基於Zone:按照地域、時效等屬性分爲多個Zone。一個集合(collection)中的所有的對象都被存放到一個塊(chunk)中,默認塊的大小是 64MB。當數據容量超過64 MB,纔有可能實施一個遷移
(6)合理的架構
-
一個分片不超過3TB,儘量保證在2TB。常用索引必須容納進內存。
-
需要多少個分片?
分片數量=max(所需存儲容量/單節點掛載容量, 工作集大小/單服務器內存容量0.6, 併發總量/單節點併發量0.7)
-
如何選擇片鍵?
- 基數,基數越大越好,比如百家姓要比年齡基數大。
- 寫分佈,數據分佈不均勻,比如學生的年齡。
- 定向性,mongos可以直接將數據定位。
四、災備與恢復
(1)備份
mongodump -h HostName:Port -d DatabaseName -c CollectionName
使用--oplog
參數實現增量備份。複製從mongodump從開始執行到完成所有的oplog。會輸出到dump/oplog.bson
文件。
(2)恢復
mongostore -h HostName:port -d DatabaseName -c CollectionName Filename.bson
使用--oplogReplay
參數實現增量恢復。通過—-oplogLimit
參數和--oplogFile
參數實現特定時間點的恢復。
在分片集羣的備份中,多個分片可能在發生數據遷移和均衡,導致備份的數據發生錯亂,可以通過停止均衡器解決。
(3)備份方案
- 延遲節點備份
- 全量備份+OpLog增量備份
- mongodump
- 複製數據文件
- 文件系統快照
五、事務支持
(1)寫事務
writeConcern參數:決定一個寫操作落到多少個節點上纔算成功。
- w參數:
- 1:默認,要求寫操作已經傳播到獨立的mongo實例或者副本集的Primary成員。
- 0:不要求確認寫操作。
- majority:要求寫操作已經傳播到大多數具有存儲數據且具有投票權的成員。
- j參數:
- true:寫操作落到journal算成功。
- false:寫操作落到內存算成功。
(2)讀事務
- 從哪裏讀?位置
- 由readPreference參數控制,取值如下:
- Primary(默認):主節點,一般用戶下訂單。
- PrimaryPrefered:主節點優先,一般用戶查訂單。
- Secondary:從節點,一般用於報表。
- SecondaryPrefered:優先從節點。
- nearest:就近原則,由PingTime決定,一般用於上傳圖片分發到全球。
- 結合使用Tag定向某些節點:通過指定{"purpose": ""}實現。
- 什麼樣的數據可以讀?隔離性
- 由readConcern參數控制,取值如下:
- avaliable:讀取所有可用的數據。
- local(默認):讀取所有可用並且屬於當前分片的數據。
- majority:讀取大多數節點上提交完成的數據,防止髒讀。
- 實現機制:節點使用MVCC機制維護多個版本,每個大多數節點確認過的版本數據作爲一個快照,MongoDB通過維護多個快照實現鏈接不同的版本,快照維持在不再使用。
- linearizable:線性化讀取文檔,保證之前所有寫入的,能夠保證出現網絡分區的時候讀取的安全,因爲在讀取的時候會檢查所有節點。
- snapshot:讀取最近快照中的數據。
- 如何安全的讀寫?
- readConcern設置爲majority
- writeConcern設置爲majority
(3)多文檔事務MongoDB的ACID
- A=4.0版本的複製集多表多行,4.2版本的分片集羣多表多行,1.0版本的單表單文檔。
- C=writeConcern和readConcern。
- I=readConcern。
- D=Journal和Replication。
(4)ChangeStream
用於追蹤變更,類似於觸發器,基於oplog實現,返回的_id可用於斷點恢復,有個cursor進行追蹤,推送majority條件的變更。
- 應用程序可以實時的瞭解數據的變化。
- 複製協議版本必須是1且使用WT存儲引擎。
- 只有副本集和Shard可用。
- 使用MongoDB Driver3.6,並且必須開啓3.6版本特性參數featureCompatibilityVersion。writeConcern必須配置。
- ChangeStream與觸發器的異同點:
- ChangeStream是異步的,基於事件回調機制。
- ChangeStream每個客戶端都會生效一次。
- ChangeStream支持斷點,觸發器只能事務回滾。
- 應用場景:
- 跨集羣複製
- 微服務聯動
- ChangeStream的中斷事件不能超過oplog的回收時間。
六、面試題
MongoDB的優勢?
- 面向Collection和Document,以JSON格式保存數據,支持二進制數據和大型對象。
- 高性能,支持Document嵌入,減少了數據庫上的IO操作,基於具有完整的索引支持,支持快速查詢。
- 高可用,複製集,提供自動故障轉移。
- 高可擴展,分片集羣。
- 支持聚合管道和全文索引。
-
支持插件式存儲引擎,WiredTiger存儲引擎和in-memory存儲引擎。
-
MongoDB支持的數據類型:
- 類似於Java中的:String(UTF-8編碼纔是合法的)、Integer、Double、Boolean、Arrays、Datetime。
- 特有的:ObjectId(用於存儲文檔ID,ObjectId基於分佈式主鍵實現MongoDB分片也可用)、Min/Max Keys(將一個值與BSON元素最低值和最高值比較)、Code(JavaScript代碼)、Regular Expression(正則表達式)、Binary Data(二進制數據)、Null(空值)、Object(內嵌的文檔)。
什麼是mongod,默認參數有哪些?
- mongod是處理MongoDB系統的主要進程,默認參數有--dbpath=/data/db,--port=27017
MySQL和MongoDB的區別:
- MongoDB是非關係型數據庫
- MySQL採用虛擬內存+持久化的方式
- MySQL使用傳統的SQL語句方式
- MongoDB常見的架構有副本集和分片集羣,MySQL有MS、MHA、MMM等架構
- MongoDB基於內存,將熱數據存儲在物理內存,從而實現數據告訴讀寫,MySQL每個存儲引擎都有自己的特點。
更新操作會立刻fsync到磁盤?
- 不會,磁盤寫操作默認延遲執行,寫操作可能在2~3s內落到磁盤,可以通過syncPeriodSecs參數配置。
MongoDB支持的索引類型?
- 單字段索引
- 複合索引
- 多鍵索引
- 全文索引
- Hash索引
- 通配符索引
- 2d sphere索引
MongoDB在A:{B,C}上建立索引,查詢A:{B,C}和A:{C,B}都會使用索引嗎?
由於MongoDB索引使用B-tree樹原理,只會在A:{B,C}上使用索引。
如果塊移動操作(moveChunk)失敗了,我需要手動清除部分轉移的文檔嗎?
不需要,移動操作是一致並且是確定的。一次失敗後,移動操作會不斷重試。當完成後,數據只會出現在新的分片裏。
數據在什麼時候纔會擴展到多個分片裏?
MongoDB 分片是基於區域(range)的。所以一個集合(collection)中的所有的對象都被存放到一個塊(chunk)中,默認塊的大小是 64Mb。當數據容量超過64 Mb,纔有可能實施一個遷移,只有當存在不止一個塊的時候,纔會有多個分片獲取數據的選項。
更新一個正在被遷移的塊(Chunk)上的文檔時會發生什麼?
更新操作會立即發生在舊的塊(Chunk)上,然後更改纔會在所有權轉移前複製到新的分片上。
如果一個分片(Shard)停止或很慢的時候,發起一個查詢會怎樣?
如果一個分片停止了,除非查詢設置了 “Partial” 選項,否則查詢會返回一個錯誤。如果一個分片響應很慢,MongoDB 會等待它的響應。
什麼是Arbiter?
仲裁節點不維護數據集。 仲裁節點的目的是通過響應其他副本集節點的心跳和選舉請求來維護副本集中的仲裁。
複製集節點類型有哪些?
- 優先級0型(Priority 0)節點
- 隱藏型(Hidden)節點
- 延遲型(Delayed)節點
- 投票型(Vote)節點以及不可投票節點
七、應用案例
(1)MongoDB典型的應用場景
MongoDB是OLTP數據庫,原則上MySQL和Oracle能做的事情,MongoDB也都可以。MongoDB具有原生的橫向擴展能力,靈活的模型支持,適合快速開發迭代,數據模型多變的場景,並且MongoDB使用了JSON數據結構,非常適合微服務領域。
基於功能的選擇:
MongoDB | 傳統關係型數據庫 | |
---|---|---|
億級以上的數據量支持 | Easy | 分庫分表 |
靈活的表結構 | Easy | 數據字典,關聯查詢 |
高併發讀 | Easy | Hard |
高併發寫 | Easy | Hard |
跨地區的集羣 | Easy | Hard |
數據分片 | Easy | 中間件 |
地址位置查詢 | 完整支持 | PostGreSQL還可以,其他的很麻煩 |
聚合計算 | Easy | GroupBY,複雜的SQL |
異構數據 | Easy | 數據字典,關聯查詢 |
大、寬表 | Easy | 性能侷限 |
基於場景的選擇:
-
移動端應用、小程序
場景特點:基於RESTful API,快速迭代,數據結構頻繁變化,大部分功能基於地理信息,爆發式的增長,高可用
業界案例:Keep(說實在的, 健身還不如專門請個私教單獨一對一),摩拜單車,ADP
-
電商的海量商品數據
場景特點:商品信息包羅萬象,數據庫模式設計困難
業界案例:京東商城,小紅書,GAP
-
內容管理:
場景特點:內容數據多樣,擴展困難
業界案例:Adobe AEM,SiteCore
-
物聯網IoT
場景特點:傳感器數據結構往往是半結構化數據,傳感器實時採集的數據量巨大,容易增長到百億級別
業界案例:華爲、Bosch、MindSphere
-
SaaS應用
場景特點:多租戶模式,需求多變,數據增長快
業界案例:ADP、Teambition
-
主機分流
場景特點:高性能查詢,實時同步機制
業界案例:金融行業
-
實時在線分析
場景特點:流數據計算,快速計算,秒級響應
業界案例:MongoDB緩存機制、MongoDB聚合框架、微分片架構
-
關係型遷移到MongoDB承載更多的數據和併發
場景特點:數據增長導致性能低,分庫分表方案複雜
業界案例:頭條、網易、百度、東航、中行
(2)MongoDB對接MySQL、Oracle
從傳統的關係型數據庫遷移到MongoDB需要綜合考慮的幾個問題:
-
總體架構
- 運維工具、腳本
- 權限設置
- 分佈式
- 監控
- 備份恢復
-
模式設計
表結構整合爲JSON文檔
-
SQL語句/存儲過程/ORM層
原始SQL
存儲過程特性
ORM框架
-
數據遷移
數據遷移的幾個方式:
(1)數據庫導出導入,導出JSON或者CSV
(2)ETL批量遷移工具,Kettle、Talend
(3)實時同步工具,infomatica、Tapdata(會運行一個Agent),一般是解析日誌模式
(4)應用主動遷移
(3)MongoDB與Spark
MongoDB作爲Spark的存儲方案,MongoDB相比HDFS更加細粒度存儲,並且支持結構化存儲。MongoDB支持索引機制,使得Spark的讀取更加快速,HDFS是一次寫,多次讀,但是MongoDB適合Spark的讀寫混合場景。MongoDB是在線式存儲,毫秒級的SLA。
(4)可視化與ETL
MongoDB可以通過BI Connector實現與SQL的結合。BI Connector會自動產生DRDL映射文件,然後我們根據映射文件來編寫SQL語句實現數據展示。
BI Connector是企業版的,並且是一個獨立的服務。
BI Connector暴露的是MySQL驅動構建的解釋器,然後作爲一個虛擬的MySQL服務。
(5)兩地三中心高級集羣設計
容災級別 | 描述 | RPO | RTO |
---|---|---|---|
Level0 | 無災備源,只有本地的數據備份 | 24小時 | 4小時 |
Level1 | 本地備份+異地保存,將關鍵數據保存並送到異地 | 24小時 | 8小時 |
Level2 | 雙中心主備,通過網絡建立熱點備份 | 秒級 | 數分鐘到半小時 |
Level3 | 雙中心雙活,互相進行數據備份 | 秒級 | 秒級 |
Level4 | 雙中心雙活+異地熱備,當一個城市的兩個中心不可用時切換 | 秒級 | 分鐘級 |
網絡層解決方案
GSLB實現MongoDB負載均衡器的健康檢查,通過域名實現應用層的切換。
應用層解決方案
使用負載均衡技術,虛擬IP技術,使用同一個Session,使用同一套數據。
使用HAProxy或者Nginx作爲本地的SLB本地負載均衡器。
數據庫層解決方案
通過日誌同步或者存儲鏡像實現數據拷貝。
複製集跨中心2+2+1解決方案
2+2+1保證了主中心的高可用,oplog同步實現了毫秒級的拷貝。
(6)全球多寫
由於複製集只解決了讀取的問題,寫入還是要在Primary上進行所以不能夠保證幾個國家的用戶體驗。
全球多寫本質上是一個特殊的分片集羣。將集羣中的分片節點分區域部署。要實現全球分片多寫,那麼要實現以下三點條件:
-
針對要分片的數據集合,模型中增加一個區域字段。
-
給集羣中的每個分片添加區域標籤。
sh.addShardTag("shard0", "Asia");
-
爲每個區域指定屬於這個區域的分片塊範圍。
sh.addShardRange("tableName", {"location": "China"}, "Asia");
全球多寫的事務性問題:
-
當海外用戶訪問讀取數據時,希望是從海外本地讀取,因此需要設置
readPreference:"nearest"
。 - 當海外用戶下單,那麼需要寫到本地大部分節點纔算成功,在國內的海外數據等待oplog同步,因此需要設置
writeConcern:"majority"
。 - 當需要讀取所有區域的數據進行彙總時,只需要設置讀取本地主從節點爲:
readPreference:"nearset"
就會保證從本地讀取就近的數據。 - 加入海外用戶在國內下單,那麼就會導致需要寫入遠程海外節點,因爲配置了
writeConcern:"majority"
需要寫入大部分節點。
當然,MongoDB也可以在國內和海外向Oracle那樣同時部署兩套集羣,通過第三方工具實現同步,中間也需要處理數據衝突問題。常見的中間件有:Tapdata和MongoShake。這兩個第三方中間件也是基於oplog的。
八、連接與開發注意事項
- 連接到複製集:mongodb://node1,node2/dbname?[option]
- 連接到分片集:mongdb://mongos1,mongos2/dbname?[option]
- 支持域名解析:mongodb+srv://mongos或者node地址
- mongos前不可以使用負載均衡器,因爲mongos自帶LB
- 事務支持:
- 使用4.2兼容驅動。
- 事務在60秒內完成,否則會被取消。
- 涉及事務的分片不能使用仲裁節點。
- 事務會影響Chunk遷移效率。
- 正在遷移的Chunk可能造成事務失敗。
- 多文檔事務必須在Primary節點進行。
- readConcern只應該在事務級別設置,不應該在每次讀寫上進行。
- 其他:
- 每一個查詢儘量對應一個索引。
- 儘量使用覆蓋索引。
- 使用projection來減少返回到Client的內容。
- 處理分頁避免使用count,只是用limit。
- 儘量控制在1000個更新文檔事務之內。
- 系統上線時的必要檢查:
- 禁用NUMA,否則在某些情況下可能導致突發的大量的SWAP交換。
- 禁用Transparent Huge Page,否則會影響數據庫效率。
tcp_keepalive_time
設置爲120秒,容忍網絡問題。- 設置最大文件句柄打開數目。
- 關閉文件系統的atime,提高訪問效率。
九、索引管理
MongoDB中的索引是特殊結構,索引存儲在易於遍歷的數據集合中,而且使用BTree結構。
(1)創建索引要考慮的問題
- 每個索引至少需要8KB的空間
- 添加索引會對寫操作性能產生影響,因爲每個集合在插入時也必須更新索引
- 索引處於Action狀態時,每個索引都會佔用磁盤空間和內存
(2)索引的限制
- 索引名稱超度不可以超過128字段
- 複合索引不能超過32個屬性
- 每個集合不能超過64個索引
(3)索引管理
-
創建索引
db.collection.createIndex(<key>, <option>);
參數 數據類型 描述 background Boolean 創建索引會阻塞數據庫操作,可以指定爲後臺操作。 unique Boolean 是否建立唯一索引 name String 索引的名稱 dropDups Boolean 3.0版本廢棄,建立索引時是否刪除重複記錄 sparse Boolean 對文檔中不存在的字段數據不建立索引 expireAfterSeconds Integer 秒,設定索引的TTL v Index version 索引的版本號 weight Document 索引權重值,數值在1-99999之間 default_language String 對於文本類型的索引,決定了分詞器規則,默認爲英語 language_override String 對於文本類型的索引,指定了包含在文檔中的字段名 -
查看索引
db.collection.getIndexs();
-
刪除索引
db.collection.dropIndexs(); db.collection.dropIndex();
-
查看創建過程和終止
db.currentOp(); db.killOp();
-
使用情況
// 獲取索引訪問信息 $indexStats // 返回查詢計劃 explain() // 控制索引, 強制MongoDB使用特定索引進行查詢 hint()
(4)單值索引
MongoDB可以在任何字段上創建索引,默認情況下會在_id
字段創建索引,_id
索引時爲了防止客戶端具有相同的值創建的索引,該索引無法刪除。在分片集羣中使用_id
索引。
(5)複合索引
將多個鍵組合到一起,這樣可以加速匹配多個鍵的查詢。
- 無法創建具有Hash索引的複合索引
- 複合字段的索引是有順序的
- 複合索引支持前綴匹配查詢
db.collection.createIndex( { <field1>: <type>, <field2>: <type2>, ... } )
(6)多鍵索引
MongoDB使用多鍵索引爲數組的每個元素創建索引,多鍵索引可以建立在字符串、數字、內嵌文檔類型的數組上。如果創建的字段包含數組的值,那麼MongoDB將會自動確定是否創建索引。
db.coll.createIndex( { <field>: < 1 or -1 > } )
(7)全文索引
MongoDB機制提供了全文索引類型,支持在集合中搜索字符串。
db.collection.createIndex( { key: "text",key:"text" ..... } )
MongoDB提供權重以及通配符的創建方式。查詢方式多個字符串空格隔開,排除查詢使用“-”。每個全文索引可以通過設置權重來分配不同的搜索程度,默認權重爲1,對於文檔中的每個索引字段,MongoDB將匹配數乘以權重並將結果相加。 使用此總和,MongoDB然後計算文檔的分數
- 每個集合最多隻有一個全文索引
- 如果查詢使用
$text
表達式就無法使用hint()函數
(8)Hash索引
散列索引使用散列函數來計算索引字段值的散列值。 散列函數會摺疊嵌入的文檔並計算整個值的散列值,但不支持多鍵(即數組)索引。
db.collection.createIndex( { _id: "hashed" } )
散列索引支持使用散列分片鍵進行分片。 基於散列的分片使用字段的散列索引作爲分片鍵來分割整個分片羣集中的數據。
十、安全架構
通過在命令行方式加入
--auth
參數或者在配置文件添加authorization: enabled
開啓安全選項。使用命令行客戶端操作:
mongo -uUsername -pPassword --authenticationDatabase DbName
(1)MongoDB支持的安全策略
- 用戶名密碼
- 證書
- LDAP,企業版
- Kerberos,企業版
(2)針對集羣節點之間的認證
- KeyFile,統一將Key拷貝到不同的節點,隨機的字符串
- X.509,基於證書的模式,通過內部或者外部的CA服務器頒發,每個節點都有不同的證書
(3)MongoDB支持的用戶權限
MongoDB的Role建立在Action和Resource上,Action定義了一種動作,Resource表示某個動作可以操作的資源。MongoDB內置權限角色繼承關係圖如下:
自定義角色和用戶分別可以使用createRole()和createUser()。
(4)傳輸加密
MongoDB支持TLS/SSL來加密所有的網絡數據傳輸,不管是內部節點還是客戶端到服務器。
(5)落盤加密(企業版)
- 生成master key,這是一個用來加密數據庫的key。每一個數據庫都對應不同的key。
- 當落盤時,基於不同數據庫的key進行數據加密。
- key的管理通過使用KMIP協議的祕鑰管理服務器完成。MongoDB也支持文件的方式進行管理。
(6)字段加密
- MongoDB支持字段級別的加密。
- 當向加密的數據發送請求的時候,MongoDB的驅動直接聯繫祕鑰管理器,獲取祕鑰,然後根據查詢條件直接去數據庫查詢,將獲取的加密數據拉取過來然後使用祕鑰解密返回明文數據。數據的加密解密都發生在MongoDB的驅動程序。
(7)審計(企業版)
- 記錄格式爲JSON
- 可以記錄到本地文件或者syslog
- 記錄的內容有:DDL、DML、用戶認證
審計日誌記錄到syslog:
--auditDestination syslog
審計日誌記錄到指定文件:
--auditDestination file --auditFormat JSON --auditPath /path/to/auditLog.json
對刪除進行審計:
--auditDestination file --auditFormat JSON --auditPath /path/to/auditLog.json --auditFilter '{atype: {$in: ["dropCollection"]}}'
十一、性能優化
(1)mongostat
用於瞭解MongoDB運行狀態的工具。
- insert、query、update、delete:最近一秒鐘有多少個操作
- getmore:針對遊標操作,最近一秒鐘的操作
- command:創建索引等操作,最近一秒鐘的執行個數
- dirty:超過20%的時候可能會阻塞新請求,因爲這個參數表示還沒有刷盤數據佔比
- used:超過95%的時候可能會阻塞新請求,由於MongoDB基於內存緩存機制,當緩存超過80%時,就會執行LRU算法
- qrw、arw:表示排隊的請求
- conn:表示當前連接數
(2)mongotop
用於瞭解集合壓力的工具
- ns:集合
- total:總時間耗時
- read:讀時間耗時
- write:寫時間耗時
(3)mongod日誌
MongoDB會記錄超過100ms的查詢,會將執行計劃輸出。
(4)mtools
pip install mtools
常用指令:
- mplotqueries LogFile:將所有的慢查詢通過圖標展示。
- mloginfo —queries LogFile:總結所有慢查詢模式和出現的次數,消耗時間等。
https://github.com/rueckstiess/mtools
十二、GridFS
GridFS是MongoDB的一個子模塊,主要用於在MongoDB中存儲文件,相當於MongoDB內置的一個分佈式文件系統。本質上還是講文件的數據分塊存儲在集合中,默認的文件集合分爲fs.files
和fs.chunks
。fs.files是存儲文件的基本信息,比如文件名,大小,上傳時間,MD5等。fs.chunks是存儲文件真正數據的地方,一個文件會被分割成多個chunk塊進行存儲,一般爲256KB/個。
GridFS的好處是你不用單獨去搭建一個文件系統,直接使用Mongodb自帶的即可,備份,分片都依賴MongoDB,維護起來也方便。