一蚁滋、概述
(1)版本歷程
0.x 起步節(jié)點(diǎn)
1.x 支持復(fù)制集和分片
2.x 更加豐富的數(shù)據(jù)庫(kù)功能
3.x 合并了一家專門(mén)做數(shù)據(jù)庫(kù)引擎的Wired Tiger公司,更加完善的周邊生態(tài)環(huán)境
4.x 支持分布式事務(wù)
MongoDB的正式版本都是偶數(shù)版本赵讯,x.x.x,主要版本(x.x)大約每年升級(jí)一次,小版本主要是修復(fù)問(wèn)題,通常1-2個(gè)月發(fā)布一次。
MongoDB支持原生高可用:Application通過(guò)Driver連接到Primary節(jié)點(diǎn)鹿驼,一個(gè)Primary節(jié)點(diǎn)連接多個(gè)Secondary節(jié)點(diǎn)欲低。
MongoDB支持水平擴(kuò)展,分片集群:Driver連接多個(gè)Mongos畜晰,Mongos連接多個(gè)Shard砾莱,每個(gè)Shard都是一個(gè)Primary和多個(gè)Secondary。
二凄鼻、復(fù)制集
主要用于實(shí)現(xiàn)服務(wù)的高可用
(1)特征
MongoDB的復(fù)制集主要具備如下特征:
快速?gòu)?fù)制:數(shù)據(jù)寫(xiě)入時(shí)將數(shù)據(jù)迅速?gòu)?fù)制到另一個(gè)節(jié)點(diǎn)腊瑟。
故障轉(zhuǎn)移:在接受寫(xiě)入的節(jié)點(diǎn)發(fā)生故障的時(shí)候自動(dòng)選擇另一個(gè)新的節(jié)點(diǎn)代替。
其他作用:數(shù)據(jù)分發(fā)块蚌、讀寫(xiě)分離闰非、異地容災(zāi)。
(2)MongoDB的數(shù)據(jù)復(fù)制原理
一個(gè)修改操作會(huì)被記錄到oplog峭范,有一個(gè)線程監(jiān)聽(tīng)oplog财松,如果有變動(dòng)就會(huì)將這個(gè)變動(dòng)應(yīng)用到其他的數(shù)據(jù)庫(kù)上。
從節(jié)點(diǎn)在主節(jié)點(diǎn)上打開(kāi)一個(gè)tailable游標(biāo)纱控,不斷獲取新加入的oplog辆毡,并在從庫(kù)上回放。
(3)節(jié)點(diǎn)間選舉
一個(gè)典型的復(fù)制集由3個(gè)以上具有投票權(quán)的節(jié)點(diǎn)構(gòu)成甜害,一個(gè)Primary接受寫(xiě)入操作和選舉時(shí)投票舶掖,兩個(gè)Secondary復(fù)制Primary節(jié)點(diǎn)數(shù)據(jù)和選舉時(shí)投票。
具有投票權(quán)的節(jié)點(diǎn)兩兩發(fā)送心跳數(shù)據(jù)尔店,主節(jié)點(diǎn)5次沒(méi)有收到心跳被定義為失聯(lián)狀態(tài)眨攘。然后MongoDB基于Raft協(xié)議進(jìn)行選舉。
Replica Set中最多50個(gè)節(jié)點(diǎn)嚣州,具有投票權(quán)的節(jié)點(diǎn)最多只有7個(gè)期犬。
影響選舉的因素:整個(gè)集群必須有大多數(shù)節(jié)點(diǎn)存活。
被選舉為主節(jié)點(diǎn)的條件:
能夠與多數(shù)節(jié)點(diǎn)建立連接
具有較新的oplog
具有較高的優(yōu)先級(jí)(可以配置)
常用的配置選項(xiàng):
是否具有投票權(quán)(v參數(shù)):有就會(huì)參與投票避诽。
優(yōu)先級(jí)(priority參數(shù)):優(yōu)先級(jí)越高的節(jié)點(diǎn)越優(yōu)先稱為主節(jié)點(diǎn)龟虎。優(yōu)先級(jí)為0的節(jié)點(diǎn)無(wú)法成為主節(jié)點(diǎn)。
隱藏(hidden參數(shù)):復(fù)制數(shù)據(jù)沙庐,但是對(duì)應(yīng)用不可見(jiàn)鲤妥。隱藏節(jié)點(diǎn)具有投票權(quán)佳吞,但是優(yōu)先級(jí)必須為0。
延遲(slaveDelay參數(shù)):復(fù)制N秒之前的數(shù)據(jù)棉安,報(bào)紙與主節(jié)點(diǎn)的時(shí)間差底扳。
復(fù)制集的部署事項(xiàng):主從數(shù)據(jù)庫(kù)配置一樣,硬件具有獨(dú)立性贡耽,軟件版本一致衷模。
三、分片集群
(1)mongos路由節(jié)點(diǎn)
提供集群的單一入口
轉(zhuǎn)發(fā)應(yīng)用端請(qǐng)求
選擇合適的數(shù)據(jù)節(jié)點(diǎn)進(jìn)行讀寫(xiě)
合并多個(gè)數(shù)據(jù)額節(jié)點(diǎn)的返回結(jié)果
無(wú)狀態(tài)
至少有兩個(gè)mongos節(jié)點(diǎn)
(2)config配置目錄節(jié)點(diǎn)
提供集群元數(shù)據(jù)的存儲(chǔ)蒲赂,分片數(shù)據(jù)分布的映射
(3)數(shù)據(jù)節(jié)點(diǎn)
以復(fù)制集為單位
橫向擴(kuò)展
最大1024個(gè)分片
分片之間數(shù)據(jù)不能重復(fù)
所有分片在一起才可以完成工作
(4)特點(diǎn)
對(duì)應(yīng)用全透明阱冶,無(wú)須特殊處理
數(shù)據(jù)自動(dòng)均衡
動(dòng)態(tài)擴(kuò)容,無(wú)須下線
提供三種分片方式
(5)分片集群的3中方式
基于范圍:片鍵范圍查詢性能好滥嘴,優(yōu)化讀木蹬,數(shù)據(jù)分布可能不均勻,容易產(chǎn)生熱點(diǎn)若皱。
基于Hash:數(shù)據(jù)分布均勻镊叁,寫(xiě)優(yōu)化,范圍查詢效率低走触,適用于日志晦譬,物聯(lián)網(wǎng)高并發(fā)場(chǎng)景。
基于Zone:按照地域互广、時(shí)效等屬性分為多個(gè)Zone蛔添。一個(gè)集合(collection)中的所有的對(duì)象都被存放到一個(gè)塊(chunk)中,默認(rèn)塊的大小是?64MB。當(dāng)數(shù)據(jù)容量超過(guò)64 MB兜辞,才有可能實(shí)施一個(gè)遷移
(6)合理的架構(gòu)
一個(gè)分片不超過(guò)3TB迎瞧,盡量保證在2TB。常用索引必須容納進(jìn)內(nèi)存逸吵。
需要多少個(gè)分片凶硅?
分片數(shù)量=max(所需存儲(chǔ)容量/單節(jié)點(diǎn)掛載容量, 工作集大小/單服務(wù)器內(nèi)存容量0.6, 并發(fā)總量/單節(jié)點(diǎn)并發(fā)量0.7)
如何選擇片鍵?
基數(shù)扫皱,基數(shù)越大越好足绅,比如百家姓要比年齡基數(shù)大。
寫(xiě)分布韩脑,數(shù)據(jù)分布不均勻氢妈,比如學(xué)生的年齡。
定向性段多,mongos可以直接將數(shù)據(jù)定位首量。
四、災(zāi)備與恢復(fù)
(1)備份
mongodump -h HostName:Port-dDatabaseName -c CollectionName
使用--oplog參數(shù)實(shí)現(xiàn)增量備份。復(fù)制從mongodump從開(kāi)始執(zhí)行到完成所有的oplog加缘。會(huì)輸出到dump/oplog.bson文件鸭叙。
(2)恢復(fù)
mongostore -h HostName:port-dDatabaseName -c CollectionName Filename.bson
使用--oplogReplay參數(shù)實(shí)現(xiàn)增量恢復(fù)。通過(guò)—-oplogLimit參數(shù)和--oplogFile參數(shù)實(shí)現(xiàn)特定時(shí)間點(diǎn)的恢復(fù)拣宏。
在分片集群的備份中沈贝,多個(gè)分片可能在發(fā)生數(shù)據(jù)遷移和均衡,導(dǎo)致備份的數(shù)據(jù)發(fā)生錯(cuò)亂勋乾,可以通過(guò)停止均衡器解決宋下。
(3)備份方案
延遲節(jié)點(diǎn)備份
全量備份+OpLog增量備份
mongodump
復(fù)制數(shù)據(jù)文件
文件系統(tǒng)快照
五、事務(wù)支持
(1)寫(xiě)事務(wù)
writeConcern參數(shù):決定一個(gè)寫(xiě)操作落到多少個(gè)節(jié)點(diǎn)上才算成功辑莫。
w參數(shù):
1:默認(rèn)学歧,要求寫(xiě)操作已經(jīng)傳播到獨(dú)立的mongo實(shí)例或者副本集的Primary成員。
0:不要求確認(rèn)寫(xiě)操作摆昧。
majority:要求寫(xiě)操作已經(jīng)傳播到大多數(shù)具有存儲(chǔ)數(shù)據(jù)且具有投票權(quán)的成員撩满。
j參數(shù):
true:寫(xiě)操作落到journal算成功蜒程。
false:寫(xiě)操作落到內(nèi)存算成功绅你。
(2)讀事務(wù)
從哪里讀?位置
由readPreference參數(shù)控制昭躺,取值如下:
Primary(默認(rèn)):主節(jié)點(diǎn)忌锯,一般用戶下訂單。
PrimaryPrefered:主節(jié)點(diǎn)優(yōu)先领炫,一般用戶查訂單偶垮。
Secondary:從節(jié)點(diǎn),一般用于報(bào)表帝洪。
SecondaryPrefered:優(yōu)先從節(jié)點(diǎn)似舵。
nearest:就近原則,由PingTime決定葱峡,一般用于上傳圖片分發(fā)到全球砚哗。
結(jié)合使用Tag定向某些節(jié)點(diǎn):通過(guò)指定{"purpose": ""}實(shí)現(xiàn)。
什么樣的數(shù)據(jù)可以讀砰奕?隔離性
由readConcern參數(shù)控制蛛芥,取值如下:
avaliable:讀取所有可用的數(shù)據(jù)。
local(默認(rèn)):讀取所有可用并且屬于當(dāng)前分片的數(shù)據(jù)军援。
majority:讀取大多數(shù)節(jié)點(diǎn)上提交完成的數(shù)據(jù)仅淑,防止臟讀。
實(shí)現(xiàn)機(jī)制:節(jié)點(diǎn)使用MVCC機(jī)制維護(hù)多個(gè)版本胸哥,每個(gè)大多數(shù)節(jié)點(diǎn)確認(rèn)過(guò)的版本數(shù)據(jù)作為一個(gè)快照涯竟,MongoDB通過(guò)維護(hù)多個(gè)快照實(shí)現(xiàn)鏈接不同的版本,快照維持在不再使用。
linearizable:線性化讀取文檔昆禽,保證之前所有寫(xiě)入的蝗蛙,能夠保證出現(xiàn)網(wǎng)絡(luò)分區(qū)的時(shí)候讀取的安全,因?yàn)樵谧x取的時(shí)候會(huì)檢查所有節(jié)點(diǎn)醉鳖。
snapshot:讀取最近快照中的數(shù)據(jù)捡硅。
如何安全的讀寫(xiě)?
readConcern設(shè)置為majority
writeConcern設(shè)置為majority
(3)多文檔事務(wù)MongoDB的ACID
A=4.0版本的復(fù)制集多表多行盗棵,4.2版本的分片集群多表多行壮韭,1.0版本的單表單文檔。
C=writeConcern和readConcern纹因。
I=readConcern喷屋。
D=Journal和Replication。
(4)ChangeStream
用于追蹤變更瞭恰,類似于觸發(fā)器屯曹,基于oplog實(shí)現(xiàn),返回的_id可用于斷點(diǎn)恢復(fù)惊畏,有個(gè)cursor進(jìn)行追蹤恶耽,推送majority條件的變更。
應(yīng)用程序可以實(shí)時(shí)的了解數(shù)據(jù)的變化颜启。
復(fù)制協(xié)議版本必須是1且使用WT存儲(chǔ)引擎偷俭。
只有副本集和Shard可用。
使用MongoDB Driver3.6缰盏,并且必須開(kāi)啟3.6版本特性參數(shù)featureCompatibilityVersion涌萤。writeConcern必須配置。
ChangeStream與觸發(fā)器的異同點(diǎn):
ChangeStream是異步的口猜,基于事件回調(diào)機(jī)制负溪。
ChangeStream每個(gè)客戶端都會(huì)生效一次。
ChangeStream支持斷點(diǎn)济炎,觸發(fā)器只能事務(wù)回滾川抡。
應(yīng)用場(chǎng)景:
跨集群復(fù)制
微服務(wù)聯(lián)動(dòng)
ChangeStream的中斷事件不能超過(guò)oplog的回收時(shí)間。
六冻辩、面試題
MongoDB的優(yōu)勢(shì)猖腕?
面向Collection和Document,以JSON格式保存數(shù)據(jù)恨闪,支持二進(jìn)制數(shù)據(jù)和大型對(duì)象倘感。
高性能,支持Document嵌入咙咽,減少了數(shù)據(jù)庫(kù)上的IO操作老玛,基于具有完整的索引支持,支持快速查詢。
高可用蜡豹,復(fù)制集麸粮,提供自動(dòng)故障轉(zhuǎn)移。
高可擴(kuò)展镜廉,分片集群弄诲。
支持聚合管道和全文索引。
支持插件式存儲(chǔ)引擎娇唯,WiredTiger存儲(chǔ)引擎和in-memory存儲(chǔ)引擎齐遵。
MongoDB支持的數(shù)據(jù)類型:
類似于Java中的:String(UTF-8編碼才是合法的)、Integer塔插、Double梗摇、Boolean、Arrays想许、Datetime伶授。
特有的:ObjectId(用于存儲(chǔ)文檔ID,ObjectId基于分布式主鍵實(shí)現(xiàn)MongoDB分片也可用)流纹、Min/Max Keys(將一個(gè)值與BSON元素最低值和最高值比較)糜烹、Code(JavaScript代碼)、Regular Expression(正則表達(dá)式)捧颅、Binary Data(二進(jìn)制數(shù)據(jù))景图、Null(空值)较雕、Object(內(nèi)嵌的文檔)碉哑。
什么是mongod,默認(rèn)參數(shù)有哪些亮蒋?
mongod是處理MongoDB系統(tǒng)的主要進(jìn)程扣典,默認(rèn)參數(shù)有--dbpath=/data/db,--port=27017
MySQL和MongoDB的區(qū)別:
MongoDB是非關(guān)系型數(shù)據(jù)庫(kù)
MySQL采用虛擬內(nèi)存+持久化的方式
MySQL使用傳統(tǒng)的SQL語(yǔ)句方式
MongoDB常見(jiàn)的架構(gòu)有副本集和分片集群慎玖,MySQL有MS贮尖、MHA、MMM等架構(gòu)
MongoDB基于內(nèi)存趁怔,將熱數(shù)據(jù)存儲(chǔ)在物理內(nèi)存湿硝,從而實(shí)現(xiàn)數(shù)據(jù)告訴讀寫(xiě),MySQL每個(gè)存儲(chǔ)引擎都有自己的特點(diǎn)润努。
更新操作會(huì)立刻fsync到磁盤(pán)?
不會(huì)关斜,磁盤(pán)寫(xiě)操作默認(rèn)延遲執(zhí)行,寫(xiě)操作可能在2~3s內(nèi)落到磁盤(pán)铺浇,可以通過(guò)syncPeriodSecs參數(shù)配置痢畜。
MongoDB支持的索引類型?
單字段索引
復(fù)合索引
多鍵索引
全文索引
Hash索引
通配符索引
2d sphere索引
MongoDB在A:{B,C}上建立索引,查詢A:{B,C}和A:{C,B}都會(huì)使用索引嗎丁稀?
由于MongoDB索引使用B-tree樹(shù)原理吼拥,只會(huì)在A:{B,C}上使用索引。
如果塊移動(dòng)操作(moveChunk)失敗了线衫,我需要手動(dòng)清除部分轉(zhuǎn)移的文檔嗎?
不需要凿可,移動(dòng)操作是一致并且是確定的。一次失敗后授账,移動(dòng)操作會(huì)不斷重試矿酵。當(dāng)完成后,數(shù)據(jù)只會(huì)出現(xiàn)在新的分片里矗积。
數(shù)據(jù)在什么時(shí)候才會(huì)擴(kuò)展到多個(gè)分片里?
MongoDB 分片是基于區(qū)域(range)的全肮。所以一個(gè)集合(collection)中的所有的對(duì)象都被存放到一個(gè)塊(chunk)中,默認(rèn)塊的大小是 64Mb。當(dāng)數(shù)據(jù)容量超過(guò)64 Mb棘捣,才有可能實(shí)施一個(gè)遷移辜腺,只有當(dāng)存在不止一個(gè)塊的時(shí)候,才會(huì)有多個(gè)分片獲取數(shù)據(jù)的選項(xiàng)乍恐。
更新一個(gè)正在被遷移的塊(Chunk)上的文檔時(shí)會(huì)發(fā)生什么评疗?
更新操作會(huì)立即發(fā)生在舊的塊(Chunk)上,然后更改才會(huì)在所有權(quán)轉(zhuǎn)移前復(fù)制到新的分片上茵烈。
如果一個(gè)分片(Shard)停止或很慢的時(shí)候百匆,發(fā)起一個(gè)查詢會(huì)怎樣?
如果一個(gè)分片停止了呜投,除非查詢?cè)O(shè)置了 “Partial” 選項(xiàng)加匈,否則查詢會(huì)返回一個(gè)錯(cuò)誤。如果一個(gè)分片響應(yīng)很慢仑荐,MongoDB 會(huì)等待它的響應(yīng)雕拼。
什么是Arbiter?
仲裁節(jié)點(diǎn)不維護(hù)數(shù)據(jù)集粘招。 仲裁節(jié)點(diǎn)的目的是通過(guò)響應(yīng)其他副本集節(jié)點(diǎn)的心跳和選舉請(qǐng)求來(lái)維護(hù)副本集中的仲裁啥寇。
復(fù)制集節(jié)點(diǎn)類型有哪些?
優(yōu)先級(jí)0型(Priority 0)節(jié)點(diǎn)
隱藏型(Hidden)節(jié)點(diǎn)
延遲型(Delayed)節(jié)點(diǎn)
投票型(Vote)節(jié)點(diǎn)以及不可投票節(jié)點(diǎn)
七洒扎、應(yīng)用案例
(1)MongoDB典型的應(yīng)用場(chǎng)景
MongoDB是OLTP數(shù)據(jù)庫(kù)辑甜,原則上MySQL和Oracle能做的事情,MongoDB也都可以袍冷。MongoDB具有原生的橫向擴(kuò)展能力磷醋,靈活的模型支持,適合快速開(kāi)發(fā)迭代难裆,數(shù)據(jù)模型多變的場(chǎng)景子檀,并且MongoDB使用了JSON數(shù)據(jù)結(jié)構(gòu)镊掖,非常適合微服務(wù)領(lǐng)域。
基于功能的選擇:
MongoDB傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)
億級(jí)以上的數(shù)據(jù)量支持Easy分庫(kù)分表
靈活的表結(jié)構(gòu)Easy數(shù)據(jù)字典褂痰,關(guān)聯(lián)查詢
高并發(fā)讀EasyHard
高并發(fā)寫(xiě)EasyHard
跨地區(qū)的集群EasyHard
數(shù)據(jù)分片Easy中間件
地址位置查詢完整支持PostGreSQL還可以亩进,其他的很麻煩
聚合計(jì)算EasyGroupBY,復(fù)雜的SQL
異構(gòu)數(shù)據(jù)Easy數(shù)據(jù)字典缩歪,關(guān)聯(lián)查詢
大归薛、寬表Easy性能局限
基于場(chǎng)景的選擇:
移動(dòng)端應(yīng)用、小程序
場(chǎng)景特點(diǎn):基于RESTful API匪蝙,快速迭代主籍,數(shù)據(jù)結(jié)構(gòu)頻繁變化,大部分功能基于地理信息逛球,爆發(fā)式的增長(zhǎng)千元,高可用
業(yè)界案例:Keep(說(shuō)實(shí)在的, 健身還不如專門(mén)請(qǐng)個(gè)私教單獨(dú)一對(duì)一),摩拜單車(chē)颤绕,ADP
電商的海量商品數(shù)據(jù)
場(chǎng)景特點(diǎn):商品信息包羅萬(wàn)象幸海,數(shù)據(jù)庫(kù)模式設(shè)計(jì)困難
業(yè)界案例:京東商城,小紅書(shū)奥务,GAP
內(nèi)容管理:
場(chǎng)景特點(diǎn):內(nèi)容數(shù)據(jù)多樣物独,擴(kuò)展困難
業(yè)界案例:Adobe AEM,SiteCore
物聯(lián)網(wǎng)IoT
場(chǎng)景特點(diǎn):傳感器數(shù)據(jù)結(jié)構(gòu)往往是半結(jié)構(gòu)化數(shù)據(jù)氯葬,傳感器實(shí)時(shí)采集的數(shù)據(jù)量巨大挡篓,容易增長(zhǎng)到百億級(jí)別
業(yè)界案例:華為、Bosch帚称、MindSphere
SaaS應(yīng)用
場(chǎng)景特點(diǎn):多租戶模式官研,需求多變,數(shù)據(jù)增長(zhǎng)快
業(yè)界案例:ADP世杀、Teambition
主機(jī)分流
場(chǎng)景特點(diǎn):高性能查詢阀参,實(shí)時(shí)同步機(jī)制
業(yè)界案例:金融行業(yè)
實(shí)時(shí)在線分析
場(chǎng)景特點(diǎn):流數(shù)據(jù)計(jì)算肝集,快速計(jì)算瞻坝,秒級(jí)響應(yīng)
業(yè)界案例:MongoDB緩存機(jī)制、MongoDB聚合框架杏瞻、微分片架構(gòu)
關(guān)系型遷移到MongoDB承載更多的數(shù)據(jù)和并發(fā)
場(chǎng)景特點(diǎn):數(shù)據(jù)增長(zhǎng)導(dǎo)致性能低所刀,分庫(kù)分表方案復(fù)雜
業(yè)界案例:頭條、網(wǎng)易捞挥、百度浮创、東航、中行
(2)MongoDB對(duì)接MySQL砌函、Oracle
從傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)遷移到MongoDB需要綜合考慮的幾個(gè)問(wèn)題:
總體架構(gòu)
運(yùn)維工具斩披、腳本
權(quán)限設(shè)置
分布式
監(jiān)控
備份恢復(fù)
模式設(shè)計(jì)
表結(jié)構(gòu)整合為JSON文檔
SQL語(yǔ)句/存儲(chǔ)過(guò)程/ORM層
原始SQL
存儲(chǔ)過(guò)程特性
ORM框架
數(shù)據(jù)遷移
數(shù)據(jù)遷移的幾個(gè)方式:
(1)數(shù)據(jù)庫(kù)導(dǎo)出導(dǎo)入溜族,導(dǎo)出JSON或者CSV
(2)ETL批量遷移工具,Kettle垦沉、Talend
(3)實(shí)時(shí)同步工具煌抒,infomatica、Tapdata(會(huì)運(yùn)行一個(gè)Agent)厕倍,一般是解析日志模式
(4)應(yīng)用主動(dòng)遷移
(3)MongoDB與Spark
MongoDB作為Spark的存儲(chǔ)方案寡壮,MongoDB相比HDFS更加細(xì)粒度存儲(chǔ),并且支持結(jié)構(gòu)化存儲(chǔ)讹弯。MongoDB支持索引機(jī)制况既,使得Spark的讀取更加快速,HDFS是一次寫(xiě)组民,多次讀棒仍,但是MongoDB適合Spark的讀寫(xiě)混合場(chǎng)景。MongoDB是在線式存儲(chǔ)臭胜,毫秒級(jí)的SLA降狠。
(4)可視化與ETL
MongoDB可以通過(guò)BI Connector實(shí)現(xiàn)與SQL的結(jié)合。BI Connector會(huì)自動(dòng)產(chǎn)生DRDL映射文件庇楞,然后我們根據(jù)映射文件來(lái)編寫(xiě)SQL語(yǔ)句實(shí)現(xiàn)數(shù)據(jù)展示榜配。
BI Connector是企業(yè)版的,并且是一個(gè)獨(dú)立的服務(wù)吕晌。
BI Connector暴露的是MySQL驅(qū)動(dòng)構(gòu)建的解釋器蛋褥,然后作為一個(gè)虛擬的MySQL服務(wù)。
(5)兩地三中心高級(jí)集群設(shè)計(jì)
網(wǎng)絡(luò)層解決方案
GSLB實(shí)現(xiàn)MongoDB負(fù)載均衡器的健康檢查睛驳,通過(guò)域名實(shí)現(xiàn)應(yīng)用層的切換烙心。
應(yīng)用層解決方案
使用負(fù)載均衡技術(shù),虛擬IP技術(shù)乏沸,使用同一個(gè)Session淫茵,使用同一套數(shù)據(jù)。
使用HAProxy或者Nginx作為本地的SLB本地負(fù)載均衡器蹬跃。
數(shù)據(jù)庫(kù)層解決方案
通過(guò)日志同步或者存儲(chǔ)鏡像實(shí)現(xiàn)數(shù)據(jù)拷貝匙瘪。
復(fù)制集跨中心2+2+1解決方案
2+2+1保證了主中心的高可用,oplog同步實(shí)現(xiàn)了毫秒級(jí)的拷貝蝶缀。
(6)全球多寫(xiě)
由于復(fù)制集只解決了讀取的問(wèn)題丹喻,寫(xiě)入還是要在Primary上進(jìn)行所以不能夠保證幾個(gè)國(guó)家的用戶體驗(yàn)。
全球多寫(xiě)本質(zhì)上是一個(gè)特殊的分片集群翁都。將集群中的分片節(jié)點(diǎn)分區(qū)域部署碍论。要實(shí)現(xiàn)全球分片多寫(xiě),那么要實(shí)現(xiàn)以下三點(diǎn)條件:
針對(duì)要分片的數(shù)據(jù)集合柄慰,模型中增加一個(gè)區(qū)域字段鳍悠。
給集群中的每個(gè)分片添加區(qū)域標(biāo)簽税娜。
sh.addShardTag("shard0","Asia");
為每個(gè)區(qū)域指定屬于這個(gè)區(qū)域的分片塊范圍。
sh.addShardRange("tableName", {"location":"China"},"Asia");
全球多寫(xiě)的事務(wù)性問(wèn)題:
當(dāng)海外用戶訪問(wèn)讀取數(shù)據(jù)時(shí)藏研,希望是從海外本地讀取巧涧,因此需要設(shè)置readPreference:"nearest"。
當(dāng)海外用戶下單遥倦,那么需要寫(xiě)到本地大部分節(jié)點(diǎn)才算成功谤绳,在國(guó)內(nèi)的海外數(shù)據(jù)等待oplog同步,因此需要設(shè)置writeConcern:"majority"袒哥。
當(dāng)需要讀取所有區(qū)域的數(shù)據(jù)進(jìn)行匯總時(shí)缩筛,只需要設(shè)置讀取本地主從節(jié)點(diǎn)為:readPreference:"nearset"就會(huì)保證從本地讀取就近的數(shù)據(jù)。
加入海外用戶在國(guó)內(nèi)下單堡称,那么就會(huì)導(dǎo)致需要寫(xiě)入遠(yuǎn)程海外節(jié)點(diǎn)瞎抛,因?yàn)榕渲昧藈riteConcern:"majority"需要寫(xiě)入大部分節(jié)點(diǎn)。
當(dāng)然却紧,MongoDB也可以在國(guó)內(nèi)和海外向Oracle那樣同時(shí)部署兩套集群桐臊,通過(guò)第三方工具實(shí)現(xiàn)同步,中間也需要處理數(shù)據(jù)沖突問(wèn)題晓殊。常見(jiàn)的中間件有:Tapdata和MongoShake断凶。這兩個(gè)第三方中間件也是基于oplog的。
八巫俺、連接與開(kāi)發(fā)注意事項(xiàng)
連接到復(fù)制集:mongodb://node1,node2/dbname?[option]
連接到分片集:mongdb://mongos1,mongos2/dbname?[option]
支持域名解析:mongodb+srv://mongos或者node地址
mongos前不可以使用負(fù)載均衡器认烁,因?yàn)閙ongos自帶LB
事務(wù)支持:
使用4.2兼容驅(qū)動(dòng)。
事務(wù)在60秒內(nèi)完成介汹,否則會(huì)被取消硕噩。
涉及事務(wù)的分片不能使用仲裁節(jié)點(diǎn)余佛。
事務(wù)會(huì)影響Chunk遷移效率还绘。
正在遷移的Chunk可能造成事務(wù)失敗捌刮。
多文檔事務(wù)必須在Primary節(jié)點(diǎn)進(jìn)行。
readConcern只應(yīng)該在事務(wù)級(jí)別設(shè)置叹卷,不應(yīng)該在每次讀寫(xiě)上進(jìn)行撼港。
其他:
每一個(gè)查詢盡量對(duì)應(yīng)一個(gè)索引。
盡量使用覆蓋索引豪娜。
使用projection來(lái)減少返回到Client的內(nèi)容餐胀。
處理分頁(yè)避免使用count,只是用limit瘤载。
盡量控制在1000個(gè)更新文檔事務(wù)之內(nèi)。
系統(tǒng)上線時(shí)的必要檢查:
禁用NUMA卖擅,否則在某些情況下可能導(dǎo)致突發(fā)的大量的SWAP交換鸣奔。
禁用Transparent Huge Page墨技,否則會(huì)影響數(shù)據(jù)庫(kù)效率。
tcp_keepalive_time設(shè)置為120秒挎狸,容忍網(wǎng)絡(luò)問(wèn)題扣汪。
設(shè)置最大文件句柄打開(kāi)數(shù)目。
關(guān)閉文件系統(tǒng)的atime锨匆,提高訪問(wèn)效率崭别。
九、索引管理
MongoDB中的索引是特殊結(jié)構(gòu)恐锣,索引存儲(chǔ)在易于遍歷的數(shù)據(jù)集合中茅主,而且使用BTree結(jié)構(gòu)。
(1)創(chuàng)建索引要考慮的問(wèn)題
每個(gè)索引至少需要8KB的空間
添加索引會(huì)對(duì)寫(xiě)操作性能產(chǎn)生影響土榴,因?yàn)槊總€(gè)集合在插入時(shí)也必須更新索引
索引處于Action狀態(tài)時(shí)诀姚,每個(gè)索引都會(huì)占用磁盤(pán)空間和內(nèi)存
(2)索引的限制
索引名稱超度不可以超過(guò)128字段
復(fù)合索引不能超過(guò)32個(gè)屬性
每個(gè)集合不能超過(guò)64個(gè)索引
(3)索引管理
創(chuàng)建索引
db.collection.createIndex(<key>, <option>);
查看索引
db.collection.getIndexs();
刪除索引
db.collection.dropIndexs();
db.collection.dropIndex();
查看創(chuàng)建過(guò)程和終止
db.currentOp();
db.killOp();
使用情況
// 獲取索引訪問(wèn)信息$indexStats// 返回查詢計(jì)劃explain()// 控制索引, 強(qiáng)制MongoDB使用特定索引進(jìn)行查詢hint()
(4)單值索引
MongoDB可以在任何字段上創(chuàng)建索引,默認(rèn)情況下會(huì)在_id字段創(chuàng)建索引玷禽,_id索引時(shí)為了防止客戶端具有相同的值創(chuàng)建的索引赫段,該索引無(wú)法刪除。在分片集群中使用_id索引矢赁。
(5)復(fù)合索引
將多個(gè)鍵組合到一起糯笙,這樣可以加速匹配多個(gè)鍵的查詢。
無(wú)法創(chuàng)建具有Hash索引的復(fù)合索引
復(fù)合字段的索引是有順序的
復(fù)合索引支持前綴匹配查詢
db.collection.createIndex( { <field1>: <type>, <field2>: <type2>, ... } )
(6)多鍵索引
MongoDB使用多鍵索引為數(shù)組的每個(gè)元素創(chuàng)建索引撩银,多鍵索引可以建立在字符串炬丸、數(shù)字、內(nèi)嵌文檔類型的數(shù)組上蜒蕾。如果創(chuàng)建的字段包含數(shù)組的值稠炬,那么MongoDB將會(huì)自動(dòng)確定是否創(chuàng)建索引。
db.coll.createIndex( { :<1or-1>} )
(7)全文索引
MongoDB機(jī)制提供了全文索引類型咪啡,支持在集合中搜索字符串首启。
db.collection.createIndex( {key:"text",key:"text"..... } )
MongoDB提供權(quán)重以及通配符的創(chuàng)建方式撤摸。查詢方式多個(gè)字符串空格隔開(kāi)毅桃,排除查詢使用“-”。每個(gè)全文索引可以通過(guò)設(shè)置權(quán)重來(lái)分配不同的搜索程度准夷,默認(rèn)權(quán)重為1钥飞,對(duì)于文檔中的每個(gè)索引字段,MongoDB將匹配數(shù)乘以權(quán)重并將結(jié)果相加衫嵌。 使用此總和读宙,MongoDB然后計(jì)算文檔的分?jǐn)?shù)
每個(gè)集合最多只有一個(gè)全文索引
如果查詢使用$text表達(dá)式就無(wú)法使用hint()函數(shù)
(8)Hash索引
散列索引使用散列函數(shù)來(lái)計(jì)算索引字段值的散列值。?散列函數(shù)會(huì)折疊嵌入的文檔并計(jì)算整個(gè)值的散列值楔绞,但不支持多鍵(即數(shù)組)索引结闸。
db.collection.createIndex( {_id:"hashed"} )
散列索引支持使用散列分片鍵進(jìn)行分片唇兑。 基于散列的分片使用字段的散列索引作為分片鍵來(lái)分割整個(gè)分片群集中的數(shù)據(jù)。
十桦锄、安全架構(gòu)
通過(guò)在命令行方式加入--auth參數(shù)或者在配置文件添加authorization: enabled開(kāi)啟安全選項(xiàng)扎附。
使用命令行客戶端操作:mongo -uUsername -pPassword --authenticationDatabase DbName
(1)MongoDB支持的安全策略
用戶名密碼
證書(shū)
LDAP,企業(yè)版
Kerberos结耀,企業(yè)版
(2)針對(duì)集群節(jié)點(diǎn)之間的認(rèn)證
KeyFile留夜,統(tǒng)一將Key拷貝到不同的節(jié)點(diǎn),隨機(jī)的字符串
X.509图甜,基于證書(shū)的模式碍粥,通過(guò)內(nèi)部或者外部的CA服務(wù)器頒發(fā),每個(gè)節(jié)點(diǎn)都有不同的證書(shū)
(3)MongoDB支持的用戶權(quán)限
MongoDB的Role建立在Action和Resource上具则,Action定義了一種動(dòng)作即纲,Resource表示某個(gè)動(dòng)作可以操作的資源。MongoDB內(nèi)置權(quán)限角色繼承關(guān)系圖如下:
自定義角色和用戶分別可以使用createRole()和createUser()博肋。
(4)傳輸加密
MongoDB支持TLS/SSL來(lái)加密所有的網(wǎng)絡(luò)數(shù)據(jù)傳輸低斋,不管是內(nèi)部節(jié)點(diǎn)還是客戶端到服務(wù)器。
(5)落盤(pán)加密(企業(yè)版)
生成master key匪凡,這是一個(gè)用來(lái)加密數(shù)據(jù)庫(kù)的key膊畴。每一個(gè)數(shù)據(jù)庫(kù)都對(duì)應(yīng)不同的key。
當(dāng)落盤(pán)時(shí)病游,基于不同數(shù)據(jù)庫(kù)的key進(jìn)行數(shù)據(jù)加密唇跨。
key的管理通過(guò)使用KMIP協(xié)議的秘鑰管理服務(wù)器完成。MongoDB也支持文件的方式進(jìn)行管理衬衬。
(6)字段加密
MongoDB支持字段級(jí)別的加密买猖。
當(dāng)向加密的數(shù)據(jù)發(fā)送請(qǐng)求的時(shí)候,MongoDB的驅(qū)動(dòng)直接聯(lián)系秘鑰管理器滋尉,獲取秘鑰玉控,然后根據(jù)查詢條件直接去數(shù)據(jù)庫(kù)查詢,將獲取的加密數(shù)據(jù)拉取過(guò)來(lái)然后使用秘鑰解密返回明文數(shù)據(jù)狮惜。數(shù)據(jù)的加密解密都發(fā)生在MongoDB的驅(qū)動(dòng)程序高诺。
(7)審計(jì)(企業(yè)版)
記錄格式為JSON
可以記錄到本地文件或者syslog
記錄的內(nèi)容有:DDL、DML碾篡、用戶認(rèn)證
審計(jì)日志記錄到syslog:
--auditDestination syslog
審計(jì)日志記錄到指定文件:
--auditDestination file --auditFormat JSON --auditPath /path/to/auditLog.json
對(duì)刪除進(jìn)行審計(jì):
--auditDestination file --auditFormat JSON --auditPath /path/to/auditLog.json --auditFilter'{atype: {$in: ["dropCollection"]}}'
十一虱而、性能優(yōu)化
(1)mongostat
用于了解MongoDB運(yùn)行狀態(tài)的工具。
insert开泽、query牡拇、update、delete:最近一秒鐘有多少個(gè)操作
getmore:針對(duì)游標(biāo)操作,最近一秒鐘的操作
command:創(chuàng)建索引等操作诅迷,最近一秒鐘的執(zhí)行個(gè)數(shù)
dirty:超過(guò)20%的時(shí)候可能會(huì)阻塞新請(qǐng)求佩番,因?yàn)檫@個(gè)參數(shù)表示還沒(méi)有刷盤(pán)數(shù)據(jù)占比
used:超過(guò)95%的時(shí)候可能會(huì)阻塞新請(qǐng)求众旗,由于MongoDB基于內(nèi)存緩存機(jī)制罢杉,當(dāng)緩存超過(guò)80%時(shí),就會(huì)執(zhí)行LRU算法
qrw贡歧、arw:表示排隊(duì)的請(qǐng)求
conn:表示當(dāng)前連接數(shù)
(2)mongotop
用于了解集合壓力的工具
ns:集合
total:總時(shí)間耗時(shí)
read:讀時(shí)間耗時(shí)
write:寫(xiě)時(shí)間耗時(shí)
(3)mongod日志
MongoDB會(huì)記錄超過(guò)100ms的查詢滩租,會(huì)將執(zhí)行計(jì)劃輸出。
(4)mtools
pip install mtools
常用指令:
mplotqueries LogFile:將所有的慢查詢通過(guò)圖標(biāo)展示利朵。
mloginfo —queries LogFile:總結(jié)所有慢查詢模式和出現(xiàn)的次數(shù)律想,消耗時(shí)間等。
十二绍弟、GridFS
GridFS是MongoDB的一個(gè)子模塊技即,主要用于在MongoDB中存儲(chǔ)文件,相當(dāng)于MongoDB內(nèi)置的一個(gè)分布式文件系統(tǒng)樟遣。本質(zhì)上還是講文件的數(shù)據(jù)分塊存儲(chǔ)在集合中而叼,默認(rèn)的文件集合分為fs.files和fs.chunks。fs.files是存儲(chǔ)文件的基本信息豹悬,比如文件名葵陵,大小,上傳時(shí)間瞻佛,MD5等脱篙。fs.chunks是存儲(chǔ)文件真正數(shù)據(jù)的地方,一個(gè)文件會(huì)被分割成多個(gè)chunk塊進(jìn)行存儲(chǔ)伤柄,一般為256KB/個(gè)绊困。
GridFS的好處是你不用單獨(dú)去搭建一個(gè)文件系統(tǒng),直接使用Mongodb自帶的即可适刀,備份秤朗,分片都依賴MongoDB,維護(hù)起來(lái)也方便蔗彤。