真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MongoDB中怎么實(shí)現(xiàn)分布式集群

本篇文章給大家分享的是有關(guān) MongoDB中怎么實(shí)現(xiàn)分布式集群,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、重慶小程序開發(fā)公司、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了龍川免費(fèi)建站歡迎大家使用!

集群概覽

mongodb 相關(guān)的進(jìn)程分為三類:

  • mongo 進(jìn)程 – 該進(jìn)程是 mongodb 提供的 shell 客戶端進(jìn)程,通過該客戶端可以發(fā)送命令并操作集群;

  • mongos 進(jìn)程 – mongodb 的路由進(jìn)程,負(fù)責(zé)與客戶端連接,轉(zhuǎn)發(fā)客戶端請(qǐng)求到后端集群,對(duì)客戶端屏蔽集群內(nèi)部結(jié)構(gòu);

  • mongod 進(jìn)程 – 提供數(shù)據(jù)讀寫的 mongodb 實(shí)例進(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 集群的節(jié)點(diǎn)分為三類:

  • mongos 路由節(jié)點(diǎn):處理客戶端的連接,扮演存取路由器的角色,將請(qǐng)求分發(fā)到正確的數(shù)據(jù)節(jié)點(diǎn)上,對(duì)客戶端屏蔽分布式的概念;

  • config 配置節(jié)點(diǎn):配置服務(wù),保存數(shù)據(jù)結(jié)構(gòu)的元數(shù)據(jù),比如每個(gè)分片上的數(shù)據(jù)范圍,數(shù)據(jù)塊列表等。配置節(jié)點(diǎn)也是 mongod 進(jìn)程,只是它存儲(chǔ)的數(shù)據(jù)是集群相關(guān)的元數(shù)據(jù);

  • shard 分片節(jié)點(diǎn):數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn),分片節(jié)點(diǎn)由若干個(gè)副本集組成,每個(gè)副本集存儲(chǔ)部分全體數(shù)據(jù),所有副本集的數(shù)據(jù)組成全體數(shù)據(jù),而副本集內(nèi)部節(jié)點(diǎn)存放相同的數(shù)據(jù),做數(shù)據(jù)備份與高可用。

還是拿銀行業(yè)務(wù)類比,當(dāng)客戶辦理保單保存業(yè)務(wù)時(shí),

  1. 柜臺(tái)服務(wù)員接受客戶的保單業(yè)務(wù)請(qǐng)求(mongos 路由節(jié)點(diǎn)接收客戶端的操作請(qǐng)求);

  2. 柜臺(tái)服務(wù)員查詢文件目錄系統(tǒng)查看該保單應(yīng)該保存到哪個(gè)倉庫(mongos 節(jié)點(diǎn)與 config 配置節(jié)點(diǎn)通信,查詢相關(guān)操作數(shù)據(jù)在哪個(gè)分片節(jié)點(diǎn));

  3. 知道哪個(gè)倉庫后,柜臺(tái)服務(wù)員將保單給倉庫管理員,倉庫管理員將保單放到指定倉庫中(mongos 節(jié)點(diǎn)將請(qǐng)求發(fā)送給數(shù)據(jù)所在分片節(jié)點(diǎn),分片節(jié)點(diǎn)進(jìn)行讀寫處理)。

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ù)。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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í)例。

MongoDB中怎么實(shí)現(xiàn)分布式集群

所以副本集是一個(gè)縱向概念,描述的是相同的數(shù)據(jù)存儲(chǔ)在多個(gè)節(jié)點(diǎn)上;而分片是一個(gè)橫向概念,描述的是全量數(shù)據(jù)被切成不同的片段,每個(gè)片段獨(dú)立存儲(chǔ)。這個(gè)片段就是分片,而分片通過副本集進(jìn)行存儲(chǔ)。

副本集

副本集包含三種角色:

  • 主節(jié)點(diǎn)(Primary)

  • 副節(jié)點(diǎn)(Secondary)

  • 仲裁節(jié)點(diǎn)(Arbiter)

一個(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è)問題:

  • 劃分規(guī)則也就是分片策略是什么?

  • 分片數(shù)據(jù)是如何存放的?

  • 數(shù)據(jù)量越來越大,分片如何動(dòng)態(tài)調(diào)整?

數(shù)據(jù)塊 Chunk

chunk 由多個(gè)文檔組成,一個(gè)分片中包含多個(gè) chunk。chunk 是分片間數(shù)據(jù)遷移的最小單位。實(shí)際上,文檔是通過分片策略計(jì)算出應(yīng)該存儲(chǔ)在哪個(gè) chunk,而 chunk 存放在分片上。

MongoDB中怎么實(shí)現(xiàn)分布式集群

如圖,假設(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è)意義:

  • 當(dāng)某個(gè) chunk 超過大小時(shí),會(huì)觸發(fā) chunk 分裂。

  • 當(dāng)分片間的 chunk 數(shù)不均衡時(shí),會(huì)觸發(fā) chunk 遷移。

chunk 遷移由 mongodb 的平衡器來操作,默認(rèn)平衡器是開啟的,是運(yùn)行在后臺(tái)的一個(gè)進(jìn)程,也可以手動(dòng)關(guān)閉。

可以通過下面命令來查看平衡器狀態(tài):

1

sh.getBalancerState()

chunk 的大小對(duì)集群的影響:

  • 比較小時(shí),chunk 數(shù)比較多,數(shù)據(jù)分布比較均勻,但會(huì)引起頻繁的數(shù)據(jù)塊分裂與遷移;

  • 比較大時(shí),chunk 數(shù)比較少,數(shù)據(jù)容易分散不均勻,遷移時(shí)網(wǎng)絡(luò)傳輸量大。

所以要自定義數(shù)據(jù)塊大小時(shí),一定要考慮完備,否則將大大影響集群與應(yīng)用程序的性能。

片鍵 Shard Key

mongodb 集群不會(huì)自動(dòng)將數(shù)據(jù)進(jìn)行分片,需要客戶端告知 mongodb 哪些數(shù)據(jù)需要進(jìn)行分片,分片的規(guī)則是什么。

某個(gè)數(shù)據(jù)庫啟用分片:

1

mongos> sh.enableSharding()

設(shè)置集合的分片規(guī)則:

1

2

mongos> sh.shardCollection(,,,)

# unique 與 options 為可選參數(shù)

例如,將數(shù)據(jù)庫 mustone 開啟分片,并設(shè)置庫中 myuser 集合的文檔根據(jù) _id 字段的散列值來進(jìn)行劃分分片。

1

2

sh.enableSharding("mustone")

sh.shardCollection("mustone.myuser",{_id: "hashed"})

這里劃分規(guī)則體現(xiàn)在 上, 定義了分片策略,分片策略由片鍵 Shard Key 與分片算法組成。片鍵就是文檔的某一個(gè)字段,也可以是復(fù)合字段。分片算法分為兩種:

  • 基于范圍。如 設(shè)置為 id:1 表示基于字段 id 的升序進(jìn)行分片,id:-1 表示基于字段 id 的倒序進(jìn)行分片,字段 id 就是 shard key(片鍵)。當(dāng)集合中文檔為空時(shí),設(shè)置分片后,會(huì)初始化單個(gè) chunk,chunk 的范圍為(-∞,+∞)。當(dāng)不斷往其中插入數(shù)據(jù)到達(dá) chunk 大小上限后,會(huì)進(jìn)行 chunk 分裂與必要遷移。

  • 基于hash。如上面的栗子, 設(shè)置為 _id:”hashed”,表示根據(jù)字段 _id 的哈希來分片,此時(shí)片鍵為 _id。初始化時(shí)會(huì)根據(jù)分片節(jié)點(diǎn)數(shù)初始化若干個(gè) chunk,如3個(gè)分片節(jié)點(diǎn)會(huì)初始化6個(gè) chunk,每個(gè) shard 2個(gè) chunk。

每個(gè)數(shù)據(jù)庫會(huì)分配一個(gè) primary shard,初始化的 chunk 或者沒有開啟分片的集合都默認(rèn)放在這個(gè) primary shard 上。

分片策略的選擇至關(guān)重要,等數(shù)據(jù)量大了再更改分片策略將會(huì)很麻煩。分片策略的原則:

  1. 均勻分布原則。分片的目標(biāo)就是讓數(shù)據(jù)在各個(gè)分片上均勻分布,數(shù)據(jù)的存取壓力也分解到各個(gè)分片上。比如以自增長(zhǎng)的 id 升序?yàn)槠I,會(huì)導(dǎo)致新數(shù)據(jù)永遠(yuǎn)都寫在最后的 chunk 上,且 chunk 分裂與遷移也會(huì)落在該 chunk 所在分片上,造成該分片壓力過大。

  2. 大基數(shù)原則。集合的片鍵可能包含的不同值的個(gè)數(shù),稱為基數(shù)?;鶖?shù)越大,數(shù)據(jù)就能劃分得更細(xì)?;鶖?shù)越小,chunk 的個(gè)數(shù)就有限。比如性別,只有男女,如果作為片鍵,最多兩個(gè) chunk,等數(shù)據(jù)越來越大后,便無法橫向擴(kuò)展。

  3. 就近原則。盡可能讓一次查詢的數(shù)據(jù)分布在同一個(gè) chunk 上,這樣提升磁盤讀取性能。避免毫無意義的隨機(jī)片鍵,雖然分布均勻了,但每次查詢都要跨多個(gè) chunk 才能完成,效率低下。

以上就是 MongoDB中怎么實(shí)現(xiàn)分布式集群,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


分享文章:MongoDB中怎么實(shí)現(xiàn)分布式集群
轉(zhuǎn)載來源:http://weahome.cn/article/giejop.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部