細說MongoDB

這篇文章很長,也很複雜,不要打開就關掉,收藏了等於會,耐下心來,認真閱讀!javascript

1、概述

細說MongoDB

(1)版本歷程

  • 0.x 起步節點
  • 1.x 支持複製集和分片
  • 2.x 更加豐富的數據庫功能
  • 3.x 合併了一家專門作數據庫引擎的Wired Tiger公司,更加完善的周邊生態環境
  • 4.x 支持分佈式事務

MongoDB的正式版本都是偶數版本,x.x.x,主要版本(x.x)大約每一年升級一次,小版本主要是修復問題,一般1-2個月發佈一次。java

MongoDB支持原生高可用:Application經過Driver鏈接到Primary節點,一個Primary節點鏈接多個Secondary節點。node

MongoDB支持水平擴展,分片集羣:Driver鏈接多個Mongos,Mongos鏈接多個Shard,每一個Shard都是一個Primary和多個Secondary。git

細說MongoDB

2、複製集

主要用於實現服務的高可用github

(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秒以前的數據,報紙與主節點的時間差
  • 複製集的部署事項:主從數據庫配置同樣,硬件具備獨立性,軟件版本一致。

3、分片集羣

細說MongoDB

(1)mongos路由節點

  • 提供集羣的單一入口
  • 轉發應用端請求
  • 選擇合適的數據節點進行讀寫
  • 合併多個數據額節點的返回結果
  • 無狀態
  • 至少有兩個mongos節點

(2)config配置目錄節點

  • 提供集羣元數據的存儲,分片數據分佈的映射

(3)數據節點

  • 以複製集爲單位
  • 橫向擴展
  • 最大1024個分片
  • 分片之間數據不能重複
  • 全部分片在一塊兒才能夠完成工做

(4)特色

  • 對應用全透明,無須特殊處理
  • 數據自動均衡
  • 動態擴容,無須下線
  • 提供三種分片方式

(5)分片集羣的3中方式

  • 基於範圍:片鍵範圍查詢性能好,優化讀,數據分佈可能不均勻,容易產生熱點。
  • 基於Hash:數據分佈均勻,寫優化,範圍查詢效率低,適用於日誌,物聯網高併發場景。
  • 基於Zone:按照地域、時效等屬性分爲多個Zone。一個集合(collection)中的全部的對象都被存放到一個塊(chunk)中,默認塊的大小是 64MB。當數據容量超過64 MB,纔有可能實施一個遷移

(6)合理的架構

  • 一個分片不超過3TB,儘可能保證在2TB。經常使用索引必須容納進內存。算法

  • 須要多少個分片?mongodb

    分片數量=max(所需存儲容量/單節點掛載容量, 工做集大小/單服務器內存容量0.6, 併發總量/單節點併發量0.7)數據庫

  • 如何選擇片鍵?

    • 基數,基數越大越好,好比百家姓要比年齡基數大。
    • 寫分佈,數據分佈不均勻,好比學生的年齡。
    • 定向性,mongos能夠直接將數據定位。

4、災備與恢復

(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
    • 複製數據文件
    • 文件系統快照

5、事務支持

(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版本特性參數featureCompatibilityVersionwriteConcern必須配置。
  • ChangeStream與觸發器的異同點:
    • ChangeStream是異步的,基於事件回調機制。
    • ChangeStream每一個客戶端都會生效一次。
    • ChangeStream支持斷點,觸發器只能事務回滾。
  • 應用場景:
    • 跨集羣複製
    • 微服務聯動
  • ChangeStream的中斷事件不能超過oplog的回收時間。

6、面試題

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)節點以及不可投票節點

7、應用案例

(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 雙中心雙活+異地熱備,當一個城市的兩個中心不可用時切換 秒級 分鐘級

細說MongoDB

網絡層解決方案

GSLB實現MongoDB負載均衡器的健康檢查,經過域名實現應用層的切換。

應用層解決方案

使用負載均衡技術,虛擬IP技術,使用同一個Session,使用同一套數據。

使用HAProxy或者Nginx做爲本地的SLB本地負載均衡器。

數據庫層解決方案

經過日誌同步或者存儲鏡像實現數據拷貝。

複製集跨中心2+2+1解決方案

2+2+1保證了主中心的高可用,oplog同步實現了毫秒級的拷貝。

(6)全球多寫

因爲複製集只解決了讀取的問題,寫入仍是要在Primary上進行因此不可以保證幾個國家的用戶體驗。

細說MongoDB

全球多寫本質上是一個特殊的分片集羣。將集羣中的分片節點分區域部署。要實現全球分片多寫,那麼要實現如下三點條件:

  • 針對要分片的數據集合,模型中增長一個區域字段

  • 給集羣中的每一個分片添加區域標籤

    sh.addShardTag("shard0", "Asia");
  • 爲每一個區域指定屬於這個區域的分片塊範圍

    sh.addShardRange("tableName", {"location": "China"}, "Asia");

全球多寫的事務性問題:

  • 當海外用戶訪問讀取數據時,但願是從海外本地讀取,所以須要設置readPreference:"nearest"

  • 當海外用戶下單,那麼須要寫到本地大部分節點纔算成功,在國內的海外數據等待oplog同步,所以須要設置writeConcern:"majority"
  • 當須要讀取全部區域的數據進行彙總時,只須要設置讀取本地主從節點爲:readPreference:"nearset"就會保證從本地讀取就近的數據。
  • 加入海外用戶在國內下單,那麼就會致使須要寫入遠程海外節點,由於配置了writeConcern:"majority"須要寫入大部分節點。

固然,MongoDB也能夠在國內和海外向Oracle那樣同時部署兩套集羣,經過第三方工具實現同步,中間也須要處理數據衝突問題。常見的中間件有:Tapdata和MongoShake這兩個第三方中間件也是基於oplog的

8、鏈接與開發注意事項

  • 鏈接到複製集: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,提升訪問效率。

9、索引管理

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" } )

散列索引支持使用散列分片鍵進行分片。 基於散列的分片使用字段的散列索引做爲分片鍵來分割整個分片羣集中的數據。

10、安全架構

經過在命令行方式加入--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內置權限角色繼承關係圖以下:

細說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"]}}'

11、性能優化

(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

12、GridFS

GridFS是MongoDB的一個子模塊,主要用於在MongoDB中存儲文件,至關於MongoDB內置的一個分佈式文件系統。本質上仍是講文件的數據分塊存儲在集合中,默認的文件集合分爲fs.filesfs.chunks。fs.files是存儲文件的基本信息,好比文件名,大小,上傳時間,MD5等。fs.chunks是存儲文件真正數據的地方,一個文件會被分割成多個chunk塊進行存儲,通常爲256KB/個

GridFS的好處是你不用單獨去搭建一個文件系統,直接使用Mongodb自帶的便可,備份,分片都依賴MongoDB,維護起來也方便。

相關文章
相關標籤/搜索