這篇文章很長,也很複雜,不要打開就關掉,收藏了等於會,耐下心來,認真閱讀!javascript
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
主要用於實現服務的高可用github
MongoDB的複製集主要具有以下特徵:面試
一個典型的複製集由3個以上具備投票權的節點構成,一個Primary接受寫入操做和選舉時投票,兩個Secondary複製Primary節點數據和選舉時投票。正則表達式
一個分片不超過3TB,儘可能保證在2TB。經常使用索引必須容納進內存。算法
須要多少個分片?mongodb
分片數量=max(所需存儲容量/單節點掛載容量, 工做集大小/單服務器內存容量0.6, 併發總量/單節點併發量0.7)數據庫
如何選擇片鍵?
mongodump -h HostName:Port -d DatabaseName -c CollectionName
使用--oplog
參數實現增量備份。複製從mongodump從開始執行到完成全部的oplog。會輸出到dump/oplog.bson
文件。
mongostore -h HostName:port -d DatabaseName -c CollectionName Filename.bson
使用--oplogReplay
參數實現增量恢復。經過—-oplogLimit
參數和--oplogFile
參數實現特定時間點的恢復。
在分片集羣的備份中,多個分片可能在發生數據遷移和均衡,致使備份的數據發生錯亂,能夠經過中止均衡器解決。
writeConcern參數:決定一個寫操做落到多少個節點上纔算成功。
用於追蹤變動,相似於觸發器,基於oplog實現,返回的_id可用於斷點恢復,有個cursor進行追蹤,推送majority條件的變動。
MongoDB的優點?
支持插件式存儲引擎,WiredTiger存儲引擎和in-memory存儲引擎。
MongoDB支持的數據類型:
什麼是mongod,默認參數有哪些?
MySQL和MongoDB的區別:
更新操做會馬上fsync到磁盤?
MongoDB支持的索引類型?
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?
仲裁節點不維護數據集。 仲裁節點的目的是經過響應其餘副本集節點的心跳和選舉請求來維護副本集中的仲裁。
複製集節點類型有哪些?
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承載更多的數據和併發
場景特色:數據增加致使性能低,分庫分表方案複雜
業界案例:頭條、網易、百度、東航、中行
從傳統的關係型數據庫遷移到MongoDB須要綜合考慮的幾個問題:
整體架構
模式設計
表結構整合爲JSON文檔
SQL語句/存儲過程/ORM層
原始SQL
存儲過程特性
ORM框架
數據遷移
數據遷移的幾個方式:
(1)數據庫導出導入,導出JSON或者CSV
(2)ETL批量遷移工具,Kettle、Talend
(3)實時同步工具,infomatica、Tapdata(會運行一個Agent),通常是解析日誌模式
(4)應用主動遷移
MongoDB做爲Spark的存儲方案,MongoDB相比HDFS更加細粒度存儲,而且支持結構化存儲。MongoDB支持索引機制,使得Spark的讀取更加快速,HDFS是一次寫,屢次讀,可是MongoDB適合Spark的讀寫混合場景。MongoDB是在線式存儲,毫秒級的SLA。
MongoDB能夠經過BI Connector實現與SQL的結合。BI Connector會自動產生DRDL映射文件,而後咱們根據映射文件來編寫SQL語句實現數據展現。
BI Connector是企業版的,而且是一個獨立的服務。
BI Connector暴露的是MySQL驅動構建的解釋器,而後做爲一個虛擬的MySQL服務。
容災級別 | 描述 | 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同步實現了毫秒級的拷貝。
因爲複製集只解決了讀取的問題,寫入仍是要在Primary上進行因此不可以保證幾個國家的用戶體驗。
全球多寫本質上是一個特殊的分片集羣。將集羣中的分片節點分區域部署。要實現全球分片多寫,那麼要實現如下三點條件:
針對要分片的數據集合,模型中增長一個區域字段。
給集羣中的每一個分片添加區域標籤。
sh.addShardTag("shard0", "Asia");
爲每一個區域指定屬於這個區域的分片塊範圍。
sh.addShardRange("tableName", {"location": "China"}, "Asia");
全球多寫的事務性問題:
當海外用戶訪問讀取數據時,但願是從海外本地讀取,所以須要設置readPreference:"nearest"
。
writeConcern:"majority"
。readPreference:"nearset"
就會保證從本地讀取就近的數據。writeConcern:"majority"
須要寫入大部分節點。固然,MongoDB也能夠在國內和海外向Oracle那樣同時部署兩套集羣,經過第三方工具實現同步,中間也須要處理數據衝突問題。常見的中間件有:Tapdata和MongoShake。這兩個第三方中間件也是基於oplog的。
tcp_keepalive_time
設置爲120秒,容忍網絡問題。MongoDB中的索引是特殊結構,索引存儲在易於遍歷的數據集合中,並且使用BTree結構。
建立索引
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()
MongoDB能夠在任何字段上建立索引,默認狀況下會在_id
字段建立索引,_id
索引時爲了防止客戶端具備相同的值建立的索引,該索引沒法刪除。在分片集羣中使用_id
索引。
將多個鍵組合到一塊兒,這樣能夠加速匹配多個鍵的查詢。
db.collection.createIndex( { <field1>: <type>, <field2>: <type2>, ... } )
MongoDB使用多鍵索引爲數組的每一個元素建立索引,多鍵索引能夠創建在字符串、數字、內嵌文檔類型的數組上。若是建立的字段包含數組的值,那麼MongoDB將會自動肯定是否建立索引。
db.coll.createIndex( { <field>: < 1 or -1 > } )
MongoDB機制提供了全文索引類型,支持在集合中搜索字符串。
db.collection.createIndex( { key: "text",key:"text" ..... } )
MongoDB提供權重以及通配符的建立方式。查詢方式多個字符串空格隔開,排除查詢使用「-」。每一個全文索引能夠經過設置權重來分配不一樣的搜索程度,默認權重爲1,對於文檔中的每一個索引字段,MongoDB將匹配數乘以權重並將結果相加。 使用此總和,MongoDB而後計算文檔的分數
$text
表達式就沒法使用hint()函數散列索引使用散列函數來計算索引字段值的散列值。 散列函數會摺疊嵌入的文檔並計算整個值的散列值,但不支持多鍵(即數組)索引。
db.collection.createIndex( { _id: "hashed" } )
散列索引支持使用散列分片鍵進行分片。 基於散列的分片使用字段的散列索引做爲分片鍵來分割整個分片羣集中的數據。
經過在命令行方式加入
--auth
參數或者在配置文件添加authorization: enabled
開啓安全選項。使用命令行客戶端操做:
mongo -uUsername -pPassword --authenticationDatabase DbName
MongoDB的Role創建在Action和Resource上,Action定義了一種動做,Resource表示某個動做能夠操做的資源。MongoDB內置權限角色繼承關係圖以下:
自定義角色和用戶分別可使用createRole()和createUser()。
MongoDB支持TLS/SSL來加密全部的網絡數據傳輸,無論是內部節點仍是客戶端到服務器。
審計日誌記錄到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"]}}'
用於瞭解MongoDB運行狀態的工具。
用於瞭解集合壓力的工具
MongoDB會記錄超過100ms的查詢,會將執行計劃輸出。
pip install mtools
經常使用指令:
https://github.com/rueckstiess/mtools
GridFS是MongoDB的一個子模塊,主要用於在MongoDB中存儲文件,至關於MongoDB內置的一個分佈式文件系統。本質上仍是講文件的數據分塊存儲在集合中,默認的文件集合分爲fs.files
和fs.chunks
。fs.files是存儲文件的基本信息,好比文件名,大小,上傳時間,MD5等。fs.chunks是存儲文件真正數據的地方,一個文件會被分割成多個chunk塊進行存儲,通常爲256KB/個。
GridFS的好處是你不用單獨去搭建一個文件系統,直接使用Mongodb自帶的便可,備份,分片都依賴MongoDB,維護起來也方便。