您好,登錄后才能下訂單哦!
一、概述
MongoDB的正式版本都是偶數版本,x.x.x,主要版本(x.x)大約每年升級一次,小版本主要是修復問題,通常1-2個月發布一次。
MongoDB支持原生高可用:Application通過Driver連接到Primary節點,一個Primary節點連接多個Secondary節點。
MongoDB支持水平擴展,分片集群:Driver連接多個Mongos,Mongos連接多個Shard,每個Shard都是一個Primary和多個Secondary。
主要用于實現服務的高可用
MongoDB的復制集主要具備如下特征:
一個典型的復制集由3個以上具有投票權的節點構成,一個Primary接受寫入操作和選舉時投票,兩個Secondary復制Primary節點數據和選舉時投票。
一個分片不超過3TB,盡量保證在2TB。常用索引必須容納進內存。
需要多少個分片?
分片數量=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,維護起來也方便。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。