一文帶你搞懂MongoDB分布式集群
Admin 2021-05-12 群英技術(shù)資訊 1195 次瀏覽
本文給大家介紹的關(guān)于MongoDB分布式集群的內(nèi)容,要想更好的運(yùn)用MongoDB,對(duì)MongoDB分布式集群的充分了解是有必要的,下面就跟隨小編深入了解MongoDB 分布式集群吧。
在分布式應(yīng)用系統(tǒng)中,mongodb 已經(jīng)成為 NoSQL 經(jīng)典數(shù)據(jù)庫。要想很好的使用 mongodb,僅僅知道如何使用它是不夠的。只有對(duì)其架構(gòu)原理等有了充分認(rèn)識(shí),才能在實(shí)際運(yùn)用中使其更好地服務(wù)于應(yīng)用,遇到問題知道怎么處理,而不是抓瞎抹黑。
集群概覽
mongodb 相關(guān)的進(jìn)程分為三類:
類比銀行服務(wù),mongo 進(jìn)程相當(dāng)于客戶,mongos 進(jìn)程是柜臺(tái)服務(wù)員,mongod 進(jìn)程是銀行后臺(tái)實(shí)際處理業(yè)務(wù)的人員或者流程??蛻糁恍枰凸衽_(tái)服務(wù)員溝通,告知辦什么業(yè)務(wù),柜臺(tái)服務(wù)員將業(yè)務(wù)轉(zhuǎn)往后臺(tái),后臺(tái)實(shí)際處理。
下圖是 mongodb 集群的一般拓?fù)浣Y(jié)構(gòu)。

如圖,mongodb 集群的節(jié)點(diǎn)分為三類:
還是拿銀行業(yè)務(wù)類比,當(dāng)客戶辦理保單保存業(yè)務(wù)時(shí),
mongos 路由服務(wù)
mongos 服務(wù)類似網(wǎng)關(guān),連接 mongodb 集群與應(yīng)用程序,對(duì)外屏蔽 mongodb 內(nèi)部結(jié)構(gòu),應(yīng)用程序只需要將請(qǐng)求發(fā)送給 mongos,而無需關(guān)心集群內(nèi)部副本分片等信息。
mongos 本身不保存數(shù)據(jù)與索引信息,它通過查詢 config 配置服務(wù)來獲取,所以可以考慮將 mongos 與應(yīng)用程序部署在同一臺(tái)服務(wù)器上,當(dāng)服務(wù)器宕機(jī)時(shí) mongos 也一起失效,防止出現(xiàn) mongos 閑置。
mongos 節(jié)點(diǎn)也可以是單個(gè)節(jié)點(diǎn),但為了高可用,一般部署多個(gè)節(jié)點(diǎn)。就像柜臺(tái)服務(wù)員一樣,可以有多個(gè),相互之間沒有主備關(guān)系,都可以獨(dú)立處理業(yè)務(wù)。
需要注意的是,在開啟分片的情況下,應(yīng)用程序應(yīng)該避免直接連接分片節(jié)點(diǎn)進(jìn)行數(shù)據(jù)修改,因?yàn)檫@種情況下很可能造成數(shù)據(jù)不一致等嚴(yán)重后果,而是通過 mongos 節(jié)點(diǎn)來操作。
config 配置服務(wù)
config 配置節(jié)點(diǎn)本質(zhì)也是一個(gè)副本集,副本集中存放集群的元數(shù)據(jù),如各個(gè)分片上的數(shù)據(jù)塊列表,數(shù)據(jù)范圍,身份驗(yàn)證等信息。如下,可以看到數(shù)據(jù)庫 config,數(shù)據(jù)庫中集合保存了集群的重要元數(shù)據(jù)。
mongos> use config; switched to db config mongos> show collections; changelog chunks collections databases lockpings locks migrations mongos shards tags transactions version
一般情況下,用戶不應(yīng)該直接變更 config 的數(shù)據(jù),否則很可能造成嚴(yán)重后果。
shard 分片服務(wù)
分布式存儲(chǔ)要解決的是兩個(gè)問題:
隨著業(yè)務(wù)不斷發(fā)展,數(shù)據(jù)量越來越大,單機(jī)存儲(chǔ)受限于物理?xiàng)l件,必然要通過增加服務(wù)器來支持不斷增大的數(shù)據(jù)。所以分布式下,不可能全部數(shù)據(jù)存儲(chǔ)在一個(gè)節(jié)點(diǎn)上,必然是將數(shù)據(jù)劃分,部分?jǐn)?shù)據(jù)放到這個(gè)節(jié)點(diǎn),另外部分?jǐn)?shù)據(jù)放到另外的節(jié)點(diǎn)上。也就是數(shù)據(jù)的伸縮性。
考慮高可用。如果同一份數(shù)據(jù)只存在一個(gè)節(jié)點(diǎn)上,當(dāng)這個(gè)節(jié)點(diǎn)發(fā)生異常時(shí),數(shù)據(jù)不可用。這就要求分布式下同一份數(shù)據(jù)需要存儲(chǔ)在多個(gè)節(jié)點(diǎn)上,以達(dá)高可用效果。
在 mongodb 集群中,數(shù)據(jù)的伸縮性通過分片集來實(shí)現(xiàn),高可用通過副本集來實(shí)現(xiàn)。
如圖,全部數(shù)據(jù)為1-6,將其劃分為3部分,1-2為一個(gè)分片,3-4為一個(gè)分片,5-6為一個(gè)分片。每個(gè)分片存儲(chǔ)在不同的節(jié)點(diǎn)上。而每個(gè)分片有3個(gè)副本,組成副本集,每個(gè)副本都是獨(dú)立的 mongod 實(shí)例。

所以副本集是一個(gè)縱向概念,描述的是相同的數(shù)據(jù)存儲(chǔ)在多個(gè)節(jié)點(diǎn)上;而分片是一個(gè)橫向概念,描述的是全量數(shù)據(jù)被切成不同的片段,每個(gè)片段獨(dú)立存儲(chǔ)。這個(gè)片段就是分片,而分片通過副本集進(jìn)行存儲(chǔ)。
副本集
副本集包含三種角色:
一個(gè)副本集由一個(gè)主節(jié)點(diǎn),多個(gè)副節(jié)點(diǎn),0或多個(gè)仲裁節(jié)點(diǎn)組成。
主節(jié)點(diǎn)與副節(jié)點(diǎn)是數(shù)據(jù)節(jié)點(diǎn)。主節(jié)點(diǎn)提供數(shù)據(jù)的寫操作,數(shù)據(jù)寫到主節(jié)點(diǎn)后,會(huì)通過同步機(jī)制同步到副節(jié)點(diǎn)上。默認(rèn)讀操作也由主節(jié)點(diǎn)提供,但是可以手動(dòng)設(shè)置 read preference,優(yōu)先從副節(jié)點(diǎn)讀取。
仲裁節(jié)點(diǎn)不是數(shù)據(jù)節(jié)點(diǎn),不存儲(chǔ)數(shù)據(jù),也不提供讀寫操作。仲裁節(jié)點(diǎn)是作為投票者存在,當(dāng)主節(jié)點(diǎn)異常需要進(jìn)行切換時(shí),仲裁節(jié)點(diǎn)有投票權(quán),但沒有被投票權(quán)。仲裁節(jié)點(diǎn)可以在資源有限的情況下,依然支持故障恢復(fù)。比如只有2個(gè)節(jié)點(diǎn)的硬盤資源,在這種情況下可以增加一個(gè)不占存儲(chǔ)的仲裁節(jié)點(diǎn),組成“一主一副一仲裁”的副本集架構(gòu),當(dāng)主節(jié)點(diǎn)宕掉時(shí),副節(jié)點(diǎn)能夠自動(dòng)切換。
節(jié)點(diǎn)間通過“心跳”進(jìn)行溝通,以此知道彼此的狀態(tài)。當(dāng)主節(jié)點(diǎn)異常不可用時(shí),從其他有被投票權(quán)的節(jié)點(diǎn)中投票選出一個(gè)升級(jí)為主節(jié)點(diǎn),繼續(xù)保持服務(wù)高可用。這里投票采取“大多數(shù)”原則,即需要多于總節(jié)點(diǎn)數(shù)一半的節(jié)點(diǎn)同意,才能被選舉成主節(jié)點(diǎn)。也因此不建議采用偶數(shù)個(gè)節(jié)點(diǎn)組成副本集,因?yàn)榕紨?shù)情況下,如果發(fā)生半數(shù)節(jié)點(diǎn)網(wǎng)絡(luò)隔離,隔離的半數(shù)節(jié)點(diǎn)達(dá)不到“大多數(shù)”的要求,無法選舉產(chǎn)生新的主節(jié)點(diǎn)。
通過 rs.status() 可以查看副本集,參考《教你快速搭建 mongodb 集群》
分片集
分片就是將全部數(shù)據(jù)根據(jù)一定規(guī)則劃分成沒有交集的數(shù)據(jù)子集,每個(gè)子集就是一個(gè)分片,不同分片存放在不同節(jié)點(diǎn)上。這里有幾個(gè)問題:
數(shù)據(jù)塊 Chunk
chunk 由多個(gè)文檔組成,一個(gè)分片中包含多個(gè) chunk。chunk 是分片間數(shù)據(jù)遷移的最小單位。實(shí)際上,文檔是通過分片策略計(jì)算出應(yīng)該存儲(chǔ)在哪個(gè) chunk,而 chunk 存放在分片上。

如圖,假設(shè)按照文檔的 x 字段值來進(jìn)行分片,根據(jù)不同取值范圍存放在不同的數(shù)據(jù)塊,如25-175在 chunk 3上。
把書比作 mongodb 中的文檔,書柜比作數(shù)據(jù)塊,房間比作分片。每本書根據(jù)一定規(guī)則放到某書柜上,房間中有很多書柜。當(dāng)某個(gè)房間的書柜太多,就需要以書柜為單位,遷移到相對(duì)比較寬松的房間。
chunk 的大小默認(rèn)為 64MB,也可以自定義。chunk 的存在有兩個(gè)意義:
chunk 遷移由 mongodb 的平衡器來操作,默認(rèn)平衡器是開啟的,是運(yùn)行在后臺(tái)的一個(gè)進(jìn)程,也可以手動(dòng)關(guān)閉。
可以通過下面命令來查看平衡器狀態(tài):
sh.getBalancerState()
chunk 的大小對(duì)集群的影響:
所以要自定義數(shù)據(jù)塊大小時(shí),一定要考慮完備,否則將大大影響集群與應(yīng)用程序的性能。
片鍵 Shard Key
mongodb 集群不會(huì)自動(dòng)將數(shù)據(jù)進(jìn)行分片,需要客戶端告知 mongodb 哪些數(shù)據(jù)需要進(jìn)行分片,分片的規(guī)則是什么。
某個(gè)數(shù)據(jù)庫啟用分片:
mongos> sh.enableSharding(<database>)
設(shè)置集合的分片規(guī)則:
mongos> sh.shardCollection(<database.collection>,<key>,<unique>,<options>) # unique 與 options 為可選參數(shù)
例如,將數(shù)據(jù)庫 mustone 開啟分片,并設(shè)置庫中 myuser 集合的文檔根據(jù) _id 字段的散列值來進(jìn)行劃分分片。
sh.enableSharding("mustone")
sh.shardCollection("mustone.myuser",{_id: "hashed"})
這里劃分規(guī)則體現(xiàn)在 上, 定義了分片策略,分片策略由片鍵 Shard Key 與分片算法組成。片鍵就是文檔的某一個(gè)字段,也可以是復(fù)合字段。分片算法分為兩種:
每個(gè)數(shù)據(jù)庫會(huì)分配一個(gè) primary shard,初始化的 chunk 或者沒有開啟分片的集合都默認(rèn)放在這個(gè) primary shard 上。
分片策略的選擇至關(guān)重要,等數(shù)據(jù)量大了再更改分片策略將會(huì)很麻煩。分片策略的原則:
需要說明的是,mongodb 分片集群雖然比較完備,但是存在一些限制,如備份相對(duì)困難,分片集合無法做關(guān)聯(lián)查詢等。所以要根據(jù)實(shí)際業(yè)務(wù)來評(píng)估,如果副本集已經(jīng)夠用了,不一定要進(jìn)行分片存取。
以上就是關(guān)于MongoDB分布式集群的介紹,希望對(duì)大家學(xué)習(xí)和理解MongoDB分布式集群有幫助,想要了解更多MongoDB的使用技巧大家能夠關(guān)注其他相關(guān)文章。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:[email protected]進(jìn)行舉報(bào),并提供相關(guān)證據(jù),查實(shí)之后,將立刻刪除涉嫌侵權(quán)內(nèi)容。
猜你喜歡
文本主要給大家分享的是mongodb監(jiān)控工具mongostat的使用,很多人可能對(duì)于mongostat怎么使用及命令有哪些不是很熟悉,因此分享給大家做參考,下面一起來了解一下吧。
mongodb有三種集群搭建方式:Replica Set(副本集)、Sharding(分片)、Master-Slaver(主備)。
MongoDB數(shù)據(jù)庫刪除文檔的三種方法:1、remove()方法;2、deleteOne()方法;3、deleteMany()方法,其中deleteOne()方法和deleteMany()方法都是官方推薦刪除文檔的方法。
文本主要和大家分享的是關(guān)于MongoDB數(shù)據(jù)庫用戶管理的內(nèi)容,對(duì)于新手學(xué)習(xí)MongoDB具有一定的借鑒價(jià)值,感興趣的朋友就跟隨小編一起來學(xué)習(xí)吧。
mongodb如何隨機(jī)獲取一條記錄?對(duì)于這個(gè)問題是不是很多小伙伴們覺得困惑呢?今天小編就將為大家解開這個(gè)疑惑,下面我們就去看看mongodb隨機(jī)獲取一條記錄的方法。
推薦內(nèi)容
成為群英會(huì)員,開啟智能安全云計(jì)算之旅
立即注冊(cè)關(guān)注或聯(lián)系群英網(wǎng)絡(luò)
7x24小時(shí)售前:400-678-4567
7x24小時(shí)售后:0668-2555666
24小時(shí)QQ客服
群英微信公眾號(hào)
CNNIC域名投訴舉報(bào)處理平臺(tái)
服務(wù)電話:010-58813000
服務(wù)郵箱:[email protected]
投訴與建議:0668-2555555
Copyright ? QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版權(quán)所有
增值電信經(jīng)營許可證 : B1.B2-20140078 ICP核準(zhǔn)(ICP備案)粵ICP備09006778號(hào) 域名注冊(cè)商資質(zhì) 粵 D3.1-20240008