一、概述
(1)版本歷程
0.x 起步節(jié)點
1.x 支持復制集和分片
2.x 更加豐富的數(shù)據(jù)庫功能
3.x 合并了一家專門做數(shù)據(jù)庫引擎的Wired Tiger公司,更加完善的周邊生態(tài)環(huán)境
4.x 支持分布式事務
MongoDB的正式版本都是偶數(shù)版本,x.x.x,主要版本(x.x)大約每年升級一次,小版本主要是修復問題,通常1-2個月發(fā)布一次。
MongoDB支持原生高可用:Application通過Driver連接到Primary節(jié)點,一個Primary節(jié)點連接多個Secondary節(jié)點。
MongoDB支持水平擴展,分片集群:Driver連接多個Mongos,Mongos連接多個Shard,每個Shard都是一個Primary和多個Secondary。

二、復制集
主要用于實現(xiàn)服務的高可用
(1)特征
MongoDB的復制集主要具備如下特征:
快速復制:數(shù)據(jù)寫入時將數(shù)據(jù)迅速復制到另一個節(jié)點。
故障轉移:在接受寫入的節(jié)點發(fā)生故障的時候自動選擇另一個新的節(jié)點代替。
其他作用:數(shù)據(jù)分發(fā)、讀寫分離、異地容災。
(2)MongoDB的數(shù)據(jù)復制原理
一個修改操作會被記錄到oplog,有一個線程監(jiān)聽oplog,如果有變動就會將這個變動應用到其他的數(shù)據(jù)庫上。
從節(jié)點在主節(jié)點上打開一個tailable游標,不斷獲取新加入的oplog,并在從庫上回放。
(3)節(jié)點間選舉
一個典型的復制集由3個以上具有投票權的節(jié)點構成,一個Primary接受寫入操作和選舉時投票,兩個Secondary復制Primary節(jié)點數(shù)據(jù)和選舉時投票。
具有投票權的節(jié)點兩兩發(fā)送心跳數(shù)據(jù),主節(jié)點5次沒有收到心跳被定義為失聯(lián)狀態(tài)。然后MongoDB基于Raft協(xié)議進行選舉。
Replica Set中最多50個節(jié)點,具有投票權的節(jié)點最多只有7個。
影響選舉的因素:整個集群必須有大多數(shù)節(jié)點存活。
被選舉為主節(jié)點的條件:
能夠與多數(shù)節(jié)點建立連接
具有較新的oplog
具有較高的優(yōu)先級(可以配置)
常用的配置選項:
是否具有投票權(v參數(shù)):有就會參與投票。
優(yōu)先級(priority參數(shù)):優(yōu)先級越高的節(jié)點越優(yōu)先稱為主節(jié)點。優(yōu)先級為0的節(jié)點無法成為主節(jié)點。
隱藏(hidden參數(shù)):復制數(shù)據(jù),但是對應用不可見。隱藏節(jié)點具有投票權,但是優(yōu)先級必須為0。
延遲(slaveDelay參數(shù)):復制N秒之前的數(shù)據(jù),報紙與主節(jié)點的時間差。
復制集的部署事項:主從數(shù)據(jù)庫配置一樣,硬件具有獨立性,軟件版本一致。
三、分片集群

(1)mongos路由節(jié)點
提供集群的單一入口
轉發(fā)應用端請求
選擇合適的數(shù)據(jù)節(jié)點進行讀寫
合并多個數(shù)據(jù)額節(jié)點的返回結果
無狀態(tài)
至少有兩個mongos節(jié)點
(2)config配置目錄節(jié)點
提供集群元數(shù)據(jù)的存儲,分片數(shù)據(jù)分布的映射
(3)數(shù)據(jù)節(jié)點
以復制集為單位
橫向擴展
最大1024個分片
分片之間數(shù)據(jù)不能重復
所有分片在一起才可以完成工作
(4)特點
對應用全透明,無須特殊處理
數(shù)據(jù)自動均衡
動態(tài)擴容,無須下線
提供三種分片方式
(5)分片集群的3中方式
基于范圍:片鍵范圍查詢性能好,優(yōu)化讀,數(shù)據(jù)分布可能不均勻,容易產(chǎn)生熱點。
基于Hash:數(shù)據(jù)分布均勻,寫優(yōu)化,范圍查詢效率低,適用于日志,物聯(lián)網(wǎng)高并發(fā)場景。
基于Zone:按照地域、時效等屬性分為多個Zone。一個集合(collection)中的所有的對象都被存放到一個塊(chunk)中,默認塊的大小是?64MB。當數(shù)據(jù)容量超過64 MB,才有可能實施一個遷移
(6)合理的架構
一個分片不超過3TB,盡量保證在2TB。常用索引必須容納進內存。
需要多少個分片?
分片數(shù)量=max(所需存儲容量/單節(jié)點掛載容量, 工作集大小/單服務器內存容量0.6, 并發(fā)總量/單節(jié)點并發(fā)量0.7)
如何選擇片鍵?
基數(shù),基數(shù)越大越好,比如百家姓要比年齡基數(shù)大。
寫分布,數(shù)據(jù)分布不均勻,比如學生的年齡。
定向性,mongos可以直接將數(shù)據(jù)定位。
四、災備與恢復
(1)備份
mongodump -h HostName:Port-dDatabaseName -c CollectionName
使用--oplog參數(shù)實現(xiàn)增量備份。復制從mongodump從開始執(zhí)行到完成所有的oplog。會輸出到dump/oplog.bson文件。
(2)恢復
mongostore -h HostName:port-dDatabaseName -c CollectionName Filename.bson
使用--oplogReplay參數(shù)實現(xiàn)增量恢復。通過—-oplogLimit參數(shù)和--oplogFile參數(shù)實現(xiàn)特定時間點的恢復。
在分片集群的備份中,多個分片可能在發(fā)生數(shù)據(jù)遷移和均衡,導致備份的數(shù)據(jù)發(fā)生錯亂,可以通過停止均衡器解決。
(3)備份方案
延遲節(jié)點備份
全量備份+OpLog增量備份
mongodump
復制數(shù)據(jù)文件
文件系統(tǒng)快照
五、事務支持
(1)寫事務
writeConcern參數(shù):決定一個寫操作落到多少個節(jié)點上才算成功。
w參數(shù):
1:默認,要求寫操作已經(jīng)傳播到獨立的mongo實例或者副本集的Primary成員。
0:不要求確認寫操作。
majority:要求寫操作已經(jīng)傳播到大多數(shù)具有存儲數(shù)據(jù)且具有投票權的成員。
j參數(shù):
true:寫操作落到journal算成功。
false:寫操作落到內存算成功。
(2)讀事務
從哪里讀?位置
由readPreference參數(shù)控制,取值如下:
Primary(默認):主節(jié)點,一般用戶下訂單。
PrimaryPrefered:主節(jié)點優(yōu)先,一般用戶查訂單。
Secondary:從節(jié)點,一般用于報表。
SecondaryPrefered:優(yōu)先從節(jié)點。
nearest:就近原則,由PingTime決定,一般用于上傳圖片分發(fā)到全球。
結合使用Tag定向某些節(jié)點:通過指定{"purpose": ""}實現(xiàn)。
什么樣的數(shù)據(jù)可以讀?隔離性
由readConcern參數(shù)控制,取值如下:
avaliable:讀取所有可用的數(shù)據(jù)。
local(默認):讀取所有可用并且屬于當前分片的數(shù)據(jù)。
majority:讀取大多數(shù)節(jié)點上提交完成的數(shù)據(jù),防止臟讀。
實現(xiàn)機制:節(jié)點使用MVCC機制維護多個版本,每個大多數(shù)節(jié)點確認過的版本數(shù)據(jù)作為一個快照,MongoDB通過維護多個快照實現(xiàn)鏈接不同的版本,快照維持在不再使用。
linearizable:線性化讀取文檔,保證之前所有寫入的,能夠保證出現(xiàn)網(wǎng)絡分區(qū)的時候讀取的安全,因為在讀取的時候會檢查所有節(jié)點。
snapshot:讀取最近快照中的數(shù)據(jù)。
如何安全的讀寫?
readConcern設置為majority
writeConcern設置為majority
(3)多文檔事務MongoDB的ACID
A=4.0版本的復制集多表多行,4.2版本的分片集群多表多行,1.0版本的單表單文檔。
C=writeConcern和readConcern。
I=readConcern。
D=Journal和Replication。
(4)ChangeStream
用于追蹤變更,類似于觸發(fā)器,基于oplog實現(xiàn),返回的_id可用于斷點恢復,有個cursor進行追蹤,推送majority條件的變更。
應用程序可以實時的了解數(shù)據(jù)的變化。
復制協(xié)議版本必須是1且使用WT存儲引擎。
只有副本集和Shard可用。
使用MongoDB Driver3.6,并且必須開啟3.6版本特性參數(shù)featureCompatibilityVersion。writeConcern必須配置。
ChangeStream與觸發(fā)器的異同點:
ChangeStream是異步的,基于事件回調機制。
ChangeStream每個客戶端都會生效一次。
ChangeStream支持斷點,觸發(fā)器只能事務回滾。
應用場景:
跨集群復制
微服務聯(lián)動
ChangeStream的中斷事件不能超過oplog的回收時間。
六、面試題
MongoDB的優(yōu)勢?
面向Collection和Document,以JSON格式保存數(shù)據(jù),支持二進制數(shù)據(jù)和大型對象。
高性能,支持Document嵌入,減少了數(shù)據(jù)庫上的IO操作,基于具有完整的索引支持,支持快速查詢。
高可用,復制集,提供自動故障轉移。
高可擴展,分片集群。
支持聚合管道和全文索引。
支持插件式存儲引擎,WiredTiger存儲引擎和in-memory存儲引擎。
MongoDB支持的數(shù)據(jù)類型:
類似于Java中的:String(UTF-8編碼才是合法的)、Integer、Double、Boolean、Arrays、Datetime。
特有的:ObjectId(用于存儲文檔ID,ObjectId基于分布式主鍵實現(xiàn)MongoDB分片也可用)、Min/Max Keys(將一個值與BSON元素最低值和最高值比較)、Code(JavaScript代碼)、Regular Expression(正則表達式)、Binary Data(二進制數(shù)據(jù))、Null(空值)、Object(內嵌的文檔)。
什么是mongod,默認參數(shù)有哪些?
mongod是處理MongoDB系統(tǒng)的主要進程,默認參數(shù)有--dbpath=/data/db,--port=27017
MySQL和MongoDB的區(qū)別:
MongoDB是非關系型數(shù)據(jù)庫
MySQL采用虛擬內存+持久化的方式
MySQL使用傳統(tǒng)的SQL語句方式
MongoDB常見的架構有副本集和分片集群,MySQL有MS、MHA、MMM等架構
MongoDB基于內存,將熱數(shù)據(jù)存儲在物理內存,從而實現(xiàn)數(shù)據(jù)告訴讀寫,MySQL每個存儲引擎都有自己的特點。
更新操作會立刻fsync到磁盤?
不會,磁盤寫操作默認延遲執(zhí)行,寫操作可能在2~3s內落到磁盤,可以通過syncPeriodSecs參數(shù)配置。
MongoDB支持的索引類型?
單字段索引
復合索引
多鍵索引
全文索引
Hash索引
通配符索引
2d sphere索引
MongoDB在A:{B,C}上建立索引,查詢A:{B,C}和A:{C,B}都會使用索引嗎?
由于MongoDB索引使用B-tree樹原理,只會在A:{B,C}上使用索引。
如果塊移動操作(moveChunk)失敗了,我需要手動清除部分轉移的文檔嗎?
不需要,移動操作是一致并且是確定的。一次失敗后,移動操作會不斷重試。當完成后,數(shù)據(jù)只會出現(xiàn)在新的分片里。
數(shù)據(jù)在什么時候才會擴展到多個分片里?
MongoDB 分片是基于區(qū)域(range)的。所以一個集合(collection)中的所有的對象都被存放到一個塊(chunk)中,默認塊的大小是 64Mb。當數(shù)據(jù)容量超過64 Mb,才有可能實施一個遷移,只有當存在不止一個塊的時候,才會有多個分片獲取數(shù)據(jù)的選項。
更新一個正在被遷移的塊(Chunk)上的文檔時會發(fā)生什么?
更新操作會立即發(fā)生在舊的塊(Chunk)上,然后更改才會在所有權轉移前復制到新的分片上。
如果一個分片(Shard)停止或很慢的時候,發(fā)起一個查詢會怎樣?
如果一個分片停止了,除非查詢設置了 “Partial” 選項,否則查詢會返回一個錯誤。如果一個分片響應很慢,MongoDB 會等待它的響應。
什么是Arbiter?
仲裁節(jié)點不維護數(shù)據(jù)集。 仲裁節(jié)點的目的是通過響應其他副本集節(jié)點的心跳和選舉請求來維護副本集中的仲裁。
復制集節(jié)點類型有哪些?
優(yōu)先級0型(Priority 0)節(jié)點
隱藏型(Hidden)節(jié)點
延遲型(Delayed)節(jié)點
投票型(Vote)節(jié)點以及不可投票節(jié)點
七、應用案例
(1)MongoDB典型的應用場景
MongoDB是OLTP數(shù)據(jù)庫,原則上MySQL和Oracle能做的事情,MongoDB也都可以。MongoDB具有原生的橫向擴展能力,靈活的模型支持,適合快速開發(fā)迭代,數(shù)據(jù)模型多變的場景,并且MongoDB使用了JSON數(shù)據(jù)結構,非常適合微服務領域。
基于功能的選擇:
MongoDB傳統(tǒng)關系型數(shù)據(jù)庫
億級以上的數(shù)據(jù)量支持Easy分庫分表
靈活的表結構Easy數(shù)據(jù)字典,關聯(lián)查詢
高并發(fā)讀EasyHard
高并發(fā)寫EasyHard
跨地區(qū)的集群EasyHard
數(shù)據(jù)分片Easy中間件
地址位置查詢完整支持PostGreSQL還可以,其他的很麻煩
聚合計算EasyGroupBY,復雜的SQL
異構數(shù)據(jù)Easy數(shù)據(jù)字典,關聯(lián)查詢
大、寬表Easy性能局限
基于場景的選擇:
移動端應用、小程序
場景特點:基于RESTful API,快速迭代,數(shù)據(jù)結構頻繁變化,大部分功能基于地理信息,爆發(fā)式的增長,高可用
業(yè)界案例:Keep(說實在的, 健身還不如專門請個私教單獨一對一),摩拜單車,ADP
電商的海量商品數(shù)據(jù)
場景特點:商品信息包羅萬象,數(shù)據(jù)庫模式設計困難
業(yè)界案例:京東商城,小紅書,GAP
內容管理:
場景特點:內容數(shù)據(jù)多樣,擴展困難
業(yè)界案例:Adobe AEM,SiteCore
物聯(lián)網(wǎng)IoT
場景特點:傳感器數(shù)據(jù)結構往往是半結構化數(shù)據(jù),傳感器實時采集的數(shù)據(jù)量巨大,容易增長到百億級別
業(yè)界案例:華為、Bosch、MindSphere
SaaS應用
場景特點:多租戶模式,需求多變,數(shù)據(jù)增長快
業(yè)界案例:ADP、Teambition
主機分流
場景特點:高性能查詢,實時同步機制
業(yè)界案例:金融行業(yè)
實時在線分析
場景特點:流數(shù)據(jù)計算,快速計算,秒級響應
業(yè)界案例:MongoDB緩存機制、MongoDB聚合框架、微分片架構
關系型遷移到MongoDB承載更多的數(shù)據(jù)和并發(fā)
場景特點:數(shù)據(jù)增長導致性能低,分庫分表方案復雜
業(yè)界案例:頭條、網(wǎng)易、百度、東航、中行
(2)MongoDB對接MySQL、Oracle
從傳統(tǒng)的關系型數(shù)據(jù)庫遷移到MongoDB需要綜合考慮的幾個問題:
總體架構
運維工具、腳本
權限設置
分布式
監(jiān)控
備份恢復
模式設計
表結構整合為JSON文檔
SQL語句/存儲過程/ORM層
原始SQL
存儲過程特性
ORM框架
數(shù)據(jù)遷移
數(shù)據(jù)遷移的幾個方式:
(1)數(shù)據(jù)庫導出導入,導出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實現(xiàn)與SQL的結合。BI Connector會自動產(chǎn)生DRDL映射文件,然后我們根據(jù)映射文件來編寫SQL語句實現(xiàn)數(shù)據(jù)展示。
BI Connector是企業(yè)版的,并且是一個獨立的服務。
BI Connector暴露的是MySQL驅動構建的解釋器,然后作為一個虛擬的MySQL服務。
(5)兩地三中心高級集群設計


網(wǎng)絡層解決方案
GSLB實現(xiàn)MongoDB負載均衡器的健康檢查,通過域名實現(xiàn)應用層的切換。
應用層解決方案
使用負載均衡技術,虛擬IP技術,使用同一個Session,使用同一套數(shù)據(jù)。
使用HAProxy或者Nginx作為本地的SLB本地負載均衡器。
數(shù)據(jù)庫層解決方案
通過日志同步或者存儲鏡像實現(xiàn)數(shù)據(jù)拷貝。
復制集跨中心2+2+1解決方案
2+2+1保證了主中心的高可用,oplog同步實現(xiàn)了毫秒級的拷貝。
(6)全球多寫
由于復制集只解決了讀取的問題,寫入還是要在Primary上進行所以不能夠保證幾個國家的用戶體驗。

全球多寫本質上是一個特殊的分片集群。將集群中的分片節(jié)點分區(qū)域部署。要實現(xiàn)全球分片多寫,那么要實現(xiàn)以下三點條件:
針對要分片的數(shù)據(jù)集合,模型中增加一個區(qū)域字段。
給集群中的每個分片添加區(qū)域標簽。
sh.addShardTag("shard0","Asia");
為每個區(qū)域指定屬于這個區(qū)域的分片塊范圍。
sh.addShardRange("tableName", {"location":"China"},"Asia");
全球多寫的事務性問題:
當海外用戶訪問讀取數(shù)據(jù)時,希望是從海外本地讀取,因此需要設置readPreference:"nearest"。
當海外用戶下單,那么需要寫到本地大部分節(jié)點才算成功,在國內的海外數(shù)據(jù)等待oplog同步,因此需要設置writeConcern:"majority"。
當需要讀取所有區(qū)域的數(shù)據(jù)進行匯總時,只需要設置讀取本地主從節(jié)點為:readPreference:"nearset"就會保證從本地讀取就近的數(shù)據(jù)。
加入海外用戶在國內下單,那么就會導致需要寫入遠程海外節(jié)點,因為配置了writeConcern:"majority"需要寫入大部分節(jié)點。
當然,MongoDB也可以在國內和海外向Oracle那樣同時部署兩套集群,通過第三方工具實現(xiàn)同步,中間也需要處理數(shù)據(jù)沖突問題。常見的中間件有:Tapdata和MongoShake。這兩個第三方中間件也是基于oplog的。
八、連接與開發(fā)注意事項
連接到復制集:mongodb://node1,node2/dbname?[option]
連接到分片集:mongdb://mongos1,mongos2/dbname?[option]
支持域名解析:mongodb+srv://mongos或者node地址
mongos前不可以使用負載均衡器,因為mongos自帶LB
事務支持:
使用4.2兼容驅動。
事務在60秒內完成,否則會被取消。
涉及事務的分片不能使用仲裁節(jié)點。
事務會影響Chunk遷移效率。
正在遷移的Chunk可能造成事務失敗。
多文檔事務必須在Primary節(jié)點進行。
readConcern只應該在事務級別設置,不應該在每次讀寫上進行。
其他:
每一個查詢盡量對應一個索引。
盡量使用覆蓋索引。
使用projection來減少返回到Client的內容。
處理分頁避免使用count,只是用limit。
盡量控制在1000個更新文檔事務之內。
系統(tǒng)上線時的必要檢查:
禁用NUMA,否則在某些情況下可能導致突發(fā)的大量的SWAP交換。
禁用Transparent Huge Page,否則會影響數(shù)據(jù)庫效率。
tcp_keepalive_time設置為120秒,容忍網(wǎng)絡問題。
設置最大文件句柄打開數(shù)目。
關閉文件系統(tǒng)的atime,提高訪問效率。
九、索引管理
MongoDB中的索引是特殊結構,索引存儲在易于遍歷的數(shù)據(jù)集合中,而且使用BTree結構。
(1)創(chuàng)建索引要考慮的問題
每個索引至少需要8KB的空間
添加索引會對寫操作性能產(chǎn)生影響,因為每個集合在插入時也必須更新索引
索引處于Action狀態(tài)時,每個索引都會占用磁盤空間和內存
(2)索引的限制
索引名稱超度不可以超過128字段
復合索引不能超過32個屬性
每個集合不能超過64個索引
(3)索引管理
創(chuàng)建索引
db.collection.createIndex(<key>, <option>);

查看索引
db.collection.getIndexs();
刪除索引
db.collection.dropIndexs();
db.collection.dropIndex();
查看創(chuàng)建過程和終止
db.currentOp();
db.killOp();
使用情況
// 獲取索引訪問信息$indexStats// 返回查詢計劃explain()// 控制索引, 強制MongoDB使用特定索引進行查詢hint()
(4)單值索引
MongoDB可以在任何字段上創(chuàng)建索引,默認情況下會在_id字段創(chuàng)建索引,_id索引時為了防止客戶端具有相同的值創(chuàng)建的索引,該索引無法刪除。在分片集群中使用_id索引。
(5)復合索引
將多個鍵組合到一起,這樣可以加速匹配多個鍵的查詢。
無法創(chuàng)建具有Hash索引的復合索引
復合字段的索引是有順序的
復合索引支持前綴匹配查詢
db.collection.createIndex( { <field1>: <type>, <field2>: <type2>, ... } )
(6)多鍵索引
MongoDB使用多鍵索引為數(shù)組的每個元素創(chuàng)建索引,多鍵索引可以建立在字符串、數(shù)字、內嵌文檔類型的數(shù)組上。如果創(chuàng)建的字段包含數(shù)組的值,那么MongoDB將會自動確定是否創(chuàng)建索引。
db.coll.createIndex( { :<1or-1>} )
(7)全文索引
MongoDB機制提供了全文索引類型,支持在集合中搜索字符串。
db.collection.createIndex( {key:"text",key:"text"..... } )
MongoDB提供權重以及通配符的創(chuàng)建方式。查詢方式多個字符串空格隔開,排除查詢使用“-”。每個全文索引可以通過設置權重來分配不同的搜索程度,默認權重為1,對于文檔中的每個索引字段,MongoDB將匹配數(shù)乘以權重并將結果相加。 使用此總和,MongoDB然后計算文檔的分數(shù)
每個集合最多只有一個全文索引
如果查詢使用$text表達式就無法使用hint()函數(shù)
(8)Hash索引
散列索引使用散列函數(shù)來計算索引字段值的散列值。?散列函數(shù)會折疊嵌入的文檔并計算整個值的散列值,但不支持多鍵(即數(shù)組)索引。
db.collection.createIndex( {_id:"hashed"} )
散列索引支持使用散列分片鍵進行分片。 基于散列的分片使用字段的散列索引作為分片鍵來分割整個分片群集中的數(shù)據(jù)。
十、安全架構
通過在命令行方式加入--auth參數(shù)或者在配置文件添加authorization: enabled開啟安全選項。
使用命令行客戶端操作:mongo -uUsername -pPassword --authenticationDatabase DbName
(1)MongoDB支持的安全策略
用戶名密碼
證書
LDAP,企業(yè)版
Kerberos,企業(yè)版
(2)針對集群節(jié)點之間的認證
KeyFile,統(tǒng)一將Key拷貝到不同的節(jié)點,隨機的字符串
X.509,基于證書的模式,通過內部或者外部的CA服務器頒發(fā),每個節(jié)點都有不同的證書
(3)MongoDB支持的用戶權限
MongoDB的Role建立在Action和Resource上,Action定義了一種動作,Resource表示某個動作可以操作的資源。MongoDB內置權限角色繼承關系圖如下:

自定義角色和用戶分別可以使用createRole()和createUser()。
(4)傳輸加密
MongoDB支持TLS/SSL來加密所有的網(wǎng)絡數(shù)據(jù)傳輸,不管是內部節(jié)點還是客戶端到服務器。
(5)落盤加密(企業(yè)版)
生成master key,這是一個用來加密數(shù)據(jù)庫的key。每一個數(shù)據(jù)庫都對應不同的key。
當落盤時,基于不同數(shù)據(jù)庫的key進行數(shù)據(jù)加密。
key的管理通過使用KMIP協(xié)議的秘鑰管理服務器完成。MongoDB也支持文件的方式進行管理。
(6)字段加密
MongoDB支持字段級別的加密。
當向加密的數(shù)據(jù)發(fā)送請求的時候,MongoDB的驅動直接聯(lián)系秘鑰管理器,獲取秘鑰,然后根據(jù)查詢條件直接去數(shù)據(jù)庫查詢,將獲取的加密數(shù)據(jù)拉取過來然后使用秘鑰解密返回明文數(shù)據(jù)。數(shù)據(jù)的加密解密都發(fā)生在MongoDB的驅動程序。
(7)審計(企業(yè)版)
記錄格式為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"]}}'
十一、性能優(yōu)化
(1)mongostat
用于了解MongoDB運行狀態(tài)的工具。
insert、query、update、delete:最近一秒鐘有多少個操作
getmore:針對游標操作,最近一秒鐘的操作
command:創(chuàng)建索引等操作,最近一秒鐘的執(zhí)行個數(shù)
dirty:超過20%的時候可能會阻塞新請求,因為這個參數(shù)表示還沒有刷盤數(shù)據(jù)占比
used:超過95%的時候可能會阻塞新請求,由于MongoDB基于內存緩存機制,當緩存超過80%時,就會執(zhí)行LRU算法
qrw、arw:表示排隊的請求
conn:表示當前連接數(shù)
(2)mongotop
用于了解集合壓力的工具
ns:集合
total:總時間耗時
read:讀時間耗時
write:寫時間耗時
(3)mongod日志
MongoDB會記錄超過100ms的查詢,會將執(zhí)行計劃輸出。
(4)mtools
pip install mtools
常用指令:
mplotqueries LogFile:將所有的慢查詢通過圖標展示。
mloginfo —queries LogFile:總結所有慢查詢模式和出現(xiàn)的次數(shù),消耗時間等。
十二、GridFS
GridFS是MongoDB的一個子模塊,主要用于在MongoDB中存儲文件,相當于MongoDB內置的一個分布式文件系統(tǒng)。本質上還是講文件的數(shù)據(jù)分塊存儲在集合中,默認的文件集合分為fs.files和fs.chunks。fs.files是存儲文件的基本信息,比如文件名,大小,上傳時間,MD5等。fs.chunks是存儲文件真正數(shù)據(jù)的地方,一個文件會被分割成多個chunk塊進行存儲,一般為256KB/個。
GridFS的好處是你不用單獨去搭建一個文件系統(tǒng),直接使用Mongodb自帶的即可,備份,分片都依賴MongoDB,維護起來也方便。