Linux服務(wù)器后端開(kāi)發(fā)之MongoDB高手進(jìn)階指南

一蚁滋、概述

(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)也方便蔗彤。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末川梅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子然遏,更是在濱河造成了極大的恐慌贫途,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件待侵,死亡現(xiàn)場(chǎng)離奇詭異丢早,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)怨酝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)傀缩,“玉大人,你說(shuō)我怎么就攤上這事农猬∩募瑁” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵斤葱,是天一觀的道長(zhǎng)慷垮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)揍堕,這世上最難降的妖魔是什么料身? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮衩茸,結(jié)果婚禮上芹血,老公的妹妹穿的比我還像新娘。我一直安慰自己楞慈,他們只是感情好幔烛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著抖部,像睡著了一般说贝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上慎颗,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天乡恕,我揣著相機(jī)與錄音,去河邊找鬼俯萎。 笑死傲宜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的夫啊。 我是一名探鬼主播函卒,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼撇眯!你這毒婦竟也來(lái)了报嵌?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤熊榛,失蹤者是張志新(化名)和其女友劉穎锚国,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體玄坦,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡血筑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年绘沉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豺总。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡车伞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出喻喳,到底是詐尸還是另有隱情另玖,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布沸枯,位于F島的核電站日矫,受9級(jí)特大地震影響赂弓,放射性物質(zhì)發(fā)生泄漏绑榴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一盈魁、第九天 我趴在偏房一處隱蔽的房頂上張望翔怎。 院中可真熱鬧,春花似錦杨耙、人聲如沸赤套。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)容握。三九已至,卻和暖如春车柠,著一層夾襖步出監(jiān)牢的瞬間剔氏,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工竹祷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谈跛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓塑陵,卻偏偏與公主長(zhǎng)得像感憾,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子令花,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 復(fù)制集 mongodb在集群環(huán)境中阻桅,通過(guò)復(fù)制的形式對(duì)數(shù)據(jù)進(jìn)行冗余。mongodb復(fù)制集有Primary兼都、Secon...
    奕_然閱讀 1,965評(píng)論 0 2
  • 本文包括以下幾個(gè)方面: –安全措施 – 部署架構(gòu) – 系統(tǒng)優(yōu)化 – 索引設(shè)計(jì) – 備份監(jiān)控 – 模式設(shè)計(jì) – 程序...
    張偉科閱讀 3,969評(píng)論 0 9
  • NoSql數(shù)據(jù)庫(kù)優(yōu)缺點(diǎn) 在優(yōu)勢(shì)方面主要體現(xiàn)在下面幾點(diǎn): 簡(jiǎn)單的擴(kuò)展 快速的讀寫(xiě) 低廉的成本 靈活的數(shù)據(jù)模型 在不足...
    dreamer_lk閱讀 2,710評(píng)論 0 6
  • 1嫂沉、MongoDB復(fù)制集(副本集)簡(jiǎn)介 復(fù)制集模式(replicaSet mode),也叫副本集模式俯抖,指兩個(gè)及以上...
    夢(mèng)想VR閱讀 2,114評(píng)論 0 1
  • 今天用深度學(xué)習(xí)的方法输瓜,用買(mǎi)的一個(gè)筆記本,以30分鐘為單位,來(lái)記錄事情尤揣,計(jì)劃的事情和實(shí)際做的事情有一些差距搔啊,整體上控...
    貝子晨閱讀 118評(píng)論 0 0