結(jié)合開源項(xiàng)目了解分布式系統(tǒng)原理(2)

1.redis集群


redis集群架構(gòu)圖

數(shù)據(jù)分片規(guī)則:

Redis Cluster使用的時(shí)hash slot算法通過采用固定節(jié)點(diǎn)數(shù)量和可配置映射節(jié)點(diǎn),來避免取模的不靈活性和一致性哈希的部分影響备燃。

Redis Cluster將所有數(shù)據(jù)按照hash slot算法分布到16384[0-16383]個(gè)哈希槽上面,哈希槽分布在各節(jié)點(diǎn)上猛拴,各節(jié)點(diǎn)維護(hù)自己的哈希槽桩皿。

redis slot分配

高可用


master1節(jié)點(diǎn)故障后颂郎,slave1_2被選為master薪铜。如果master2掛掉众弓,因?yàn)闆]有slave,整個(gè)集群就故障了隔箍。

副本數(shù)據(jù)一致性

redis cluster有多種復(fù)制方式,但都不保證嚴(yán)格的數(shù)據(jù)一致性脚乡。
比如:當(dāng)正好有個(gè)write command傳入給master A,A存儲(chǔ)后回應(yīng)客戶端OK(還來不及slave同步),極短的時(shí)間內(nèi)該master down,它的一個(gè)slave 被選舉為master,但是該new master根本不知道剛剛的write command的事情蜒滩。

擴(kuò)容

每個(gè)master把一部分槽和數(shù)據(jù)遷移到新的節(jié)點(diǎn)node04

2.mongodb shard集群

MongoDB分片(Sharding)技術(shù)

  分片(sharding)是MongoDB用來將大型集合分割到不同服務(wù)器(或者說一個(gè)集群)上所采用的方法滨达。盡管分片起源于關(guān)系型數(shù)據(jù)庫分區(qū),但MongoDB分片完全又是另一回事俯艰。

  和MySQL分區(qū)方案相比捡遍,MongoDB的最大區(qū)別在于它幾乎能自動(dòng)完成所有事情,只要告訴MongoDB要分配數(shù)據(jù)竹握,它就能自動(dòng)維護(hù)數(shù)據(jù)在不同服務(wù)器之間的均衡画株。

2.1 MongoDB分片介紹

2.1.1 分片的目的

  高數(shù)據(jù)量和吞吐量的數(shù)據(jù)庫應(yīng)用會(huì)對(duì)單機(jī)的性能造成較大壓力,大的查詢量會(huì)將單機(jī)的CPU耗盡,大的數(shù)據(jù)量對(duì)單機(jī)的存儲(chǔ)壓力較大,最終會(huì)耗盡系統(tǒng)的內(nèi)存而將壓力轉(zhuǎn)移到磁盤IO上。

  為了解決這些問題,有兩個(gè)基本的方法: 垂直擴(kuò)展和水平擴(kuò)展啦辐。

垂直擴(kuò)展:增加更多的CPU和存儲(chǔ)資源來擴(kuò)展容量谓传。

水平擴(kuò)展:將數(shù)據(jù)集分布在多個(gè)服務(wù)器上。水平擴(kuò)展即分片芹关。

2.1.2 分片設(shè)計(jì)思想

  分片為應(yīng)對(duì)高吞吐量與大數(shù)據(jù)量提供了方法续挟。使用分片減少了每個(gè)分片需要處理的請(qǐng)求數(shù),因此侥衬,通過水平擴(kuò)展诗祸,集群可以提高自己的存儲(chǔ)容量和吞吐量。舉例來說轴总,當(dāng)插入一條數(shù)據(jù)時(shí)直颅,應(yīng)用只需要訪問存儲(chǔ)這條數(shù)據(jù)的分片.

  使用分片減少了每個(gè)分片存儲(chǔ)的數(shù)據(jù)。

  例如怀樟,如果數(shù)據(jù)庫1tb的數(shù)據(jù)集际乘,并有4個(gè)分片,然后每個(gè)分片可能僅持有256 GB的數(shù)據(jù)漂佩。如果有40個(gè)分片脖含,那么每個(gè)切分可能只有25GB的數(shù)據(jù)。

2.1.3 分片機(jī)制提供了如下三種優(yōu)勢(shì)

1.對(duì)集群進(jìn)行抽象投蝉,讓集群“不可見”

  MongoDB自帶了一個(gè)叫做mongos的專有路由進(jìn)程养葵。mongos就是掌握統(tǒng)一路口的路由器,其會(huì)將客戶端發(fā)來的請(qǐng)求準(zhǔn)確無誤的路由到集群中的一個(gè)或者一組服務(wù)器上瘩缆,同時(shí)會(huì)把接收到的響應(yīng)拼裝起來發(fā)回到客戶端关拒。

2.保證集群總是可讀寫

  MongoDB通過多種途徑來確保集群的可用性和可靠性。將MongoDB的分片和復(fù)制功能結(jié)合使用庸娱,在確保數(shù)據(jù)分片到多臺(tái)服務(wù)器的同時(shí)着绊,也確保了每分?jǐn)?shù)據(jù)都有相應(yīng)的備份,這樣就可以確保有服務(wù)器換掉時(shí)熟尉,其他的從庫可以立即接替壞掉的部分繼續(xù)工作归露。

3.使集群易于擴(kuò)展

  當(dāng)系統(tǒng)需要更多的空間和資源的時(shí)候,MongoDB使我們可以按需方便的擴(kuò)充系統(tǒng)容量斤儿。

2.1.4 分片集群架構(gòu)

組件說明

Config Server存儲(chǔ)集群所有節(jié)點(diǎn)剧包、分片數(shù)據(jù)路由信息恐锦。默認(rèn)需要配置3個(gè)Config Server節(jié)點(diǎn)。

Mongos提供對(duì)外應(yīng)用訪問疆液,所有操作均通過mongos執(zhí)行一铅。一般有多個(gè)mongos節(jié)點(diǎn)。數(shù)據(jù)遷移和數(shù)據(jù)自動(dòng)平衡堕油。

Mongod存儲(chǔ)應(yīng)用數(shù)據(jù)記錄潘飘。一般有多個(gè)Mongod節(jié)點(diǎn),達(dá)到數(shù)據(jù)分片目的掉缺。

分片集群的構(gòu)造

?(1)mongos :數(shù)據(jù)路由卜录,和客戶端打交道的模塊。mongos本身沒有任何數(shù)據(jù)攀圈,他也不知道該怎么處理這數(shù)據(jù)暴凑,去找config server

(2)config server:所有存、取數(shù)據(jù)的方式赘来,所有shard節(jié)點(diǎn)的信息现喳,分片功能的一些配置信息∪剑可以理解為真實(shí)數(shù)據(jù)的元數(shù)據(jù)嗦篱。

?(3)shard:真正的數(shù)據(jù)存儲(chǔ)位置,以chunk為單位存數(shù)據(jù)幌缝。

  Mongos本身并不持久化數(shù)據(jù)灸促,Sharded cluster所有的元數(shù)據(jù)都會(huì)存儲(chǔ)到Config Server,而用戶的數(shù)據(jù)會(huì)議分散存儲(chǔ)到各個(gè)shard涵卵。Mongos啟動(dòng)后浴栽,會(huì)從配置服務(wù)器加載元數(shù)據(jù),開始提供服務(wù)轿偎,將用戶的請(qǐng)求正確路由到對(duì)應(yīng)的碎片典鸡。

Mongos的路由功能

  當(dāng)數(shù)據(jù)寫入時(shí),MongoDB Cluster根據(jù)分片鍵設(shè)計(jì)寫入數(shù)據(jù)坏晦。

  當(dāng)外部語句發(fā)起數(shù)據(jù)查詢時(shí)萝玷,MongoDB根據(jù)數(shù)據(jù)分布自動(dòng)路由至指定節(jié)點(diǎn)返回?cái)?shù)據(jù)。

2.2 集群中數(shù)據(jù)分布

2.2.1 Chunk是什么

  在一個(gè)shard server內(nèi)部昆婿,MongoDB還是會(huì)把數(shù)據(jù)分為chunks球碉,每個(gè)chunk代表這個(gè)shard server內(nèi)部一部分?jǐn)?shù)據(jù)。chunk的產(chǎn)生仓蛆,會(huì)有以下兩個(gè)用途:

Splitting當(dāng)一個(gè)chunk的大小超過配置中的chunk size時(shí)睁冬,MongoDB的后臺(tái)進(jìn)程會(huì)把這個(gè)chunk切分成更小的chunk,從而避免chunk過大的情況

Balancing在MongoDB中多律,balancer是一個(gè)后臺(tái)進(jìn)程痴突,負(fù)責(zé)chunk的遷移搂蜓,從而均衡各個(gè)shard server的負(fù)載狼荞,系統(tǒng)初始1個(gè)chunk辽装,chunk size默認(rèn)值64M,生產(chǎn)庫上選擇適合業(yè)務(wù)的chunk size是最好的。ongoDB會(huì)自動(dòng)拆分和遷移chunks相味。

分片集群的數(shù)據(jù)分布(shard節(jié)點(diǎn))

(1)使用chunk來存儲(chǔ)數(shù)據(jù)

(2)進(jìn)群搭建完成之后拾积,默認(rèn)開啟一個(gè)chunk,大小是64M丰涉,

(3)存儲(chǔ)需求超過64M拓巧,chunk會(huì)進(jìn)行分裂,如果單位時(shí)間存儲(chǔ)需求很大一死,設(shè)置更大的chunk

(4)chunk會(huì)被自動(dòng)均衡遷移肛度。

2.2.2 chunksize的選擇

  適合業(yè)務(wù)的chunksize是最好的。

  chunk的分裂和遷移非常消耗IO資源投慈;chunk分裂的時(shí)機(jī):在插入和更新承耿,讀數(shù)據(jù)不會(huì)分裂。

chunksize的選擇:

  小的chunksize:數(shù)據(jù)均衡是遷移速度快伪煤,數(shù)據(jù)分布更均勻加袋。數(shù)據(jù)分裂頻繁,路由節(jié)點(diǎn)消耗更多資源抱既。大的chunksize:數(shù)據(jù)分裂少职烧。數(shù)據(jù)塊移動(dòng)集中消耗IO資源。通常100-200M

2.2.3 chunk分裂及遷移

  隨著數(shù)據(jù)的增長防泵,其中的數(shù)據(jù)大小超過了配置的chunk size蚀之,默認(rèn)是64M,則這個(gè)chunk就會(huì)分裂成兩個(gè)捷泞。數(shù)據(jù)的增長會(huì)讓chunk分裂得越來越多足删。

  這時(shí)候,各個(gè)shard 上的chunk數(shù)量就會(huì)不平衡肚邢。這時(shí)候壹堰,mongos中的一個(gè)組件balancer? 就會(huì)執(zhí)行自動(dòng)平衡。把chunk從chunk數(shù)量最多的shard節(jié)點(diǎn)挪動(dòng)到數(shù)量最少的節(jié)點(diǎn)骡湖。

chunkSize?對(duì)分裂及遷移的影響

  MongoDB 默認(rèn)的 chunkSize 為64MB贱纠,如無特殊需求,建議保持默認(rèn)值响蕴;chunkSize 會(huì)直接影響到 chunk 分裂谆焊、遷移的行為。

  chunkSize 越小浦夷,chunk 分裂及遷移越多辖试,數(shù)據(jù)分布越均衡辜王;反之,chunkSize 越大罐孝,chunk 分裂及遷移會(huì)更少呐馆,但可能導(dǎo)致數(shù)據(jù)分布不均。

  chunkSize 太小莲兢,容易出現(xiàn) jumbo chunk(即shardKey 的某個(gè)取值出現(xiàn)頻率很高汹来,這些文檔只能放到一個(gè) chunk 里,無法再分裂)而無法遷移改艇;chunkSize 越大收班,則可能出現(xiàn) chunk 內(nèi)文檔數(shù)太多(chunk 內(nèi)文檔數(shù)不能超過 250000 )而無法遷移。

  chunk 自動(dòng)分裂只會(huì)在數(shù)據(jù)寫入時(shí)觸發(fā)谒兄,所以如果將 chunkSize 改小摔桦,系統(tǒng)需要一定的時(shí)間來將 chunk 分裂到指定的大小。

  chunk 只會(huì)分裂承疲,不會(huì)合并邻耕,所以即使將 chunkSize 改大,現(xiàn)有的 chunk 數(shù)量不會(huì)減少纪隙,但 chunk 大小會(huì)隨著寫入不斷增長赊豌,直到達(dá)到目標(biāo)大小。

2.3 數(shù)據(jù)區(qū)分

2.3.1 分片鍵shard key

  MongoDB中數(shù)據(jù)的分片是绵咱、以集合為基本單位的碘饼,集合中的數(shù)據(jù)通過片鍵(Shard key)被分成多部分。其實(shí)片鍵就是在集合中選一個(gè)鍵悲伶,用該鍵的值作為數(shù)據(jù)拆分的依據(jù)艾恼。

  所以一個(gè)好的片鍵對(duì)分片至關(guān)重要。片鍵必須是一個(gè)索引麸锉,通過sh.shardCollection加會(huì)自動(dòng)創(chuàng)建索引(前提是此集合不存在的情況下)钠绍。一個(gè)自增的片鍵對(duì)寫入和數(shù)據(jù)均勻分布就不是很好,因?yàn)樽栽龅钠I總會(huì)在一個(gè)分片上寫入花沉,后續(xù)達(dá)到某個(gè)閥值可能會(huì)寫到別的分片柳爽。但是按照片鍵查詢會(huì)非常高效。

  隨機(jī)片鍵對(duì)數(shù)據(jù)的均勻分布效果很好碱屁。注意盡量避免在多個(gè)分片上進(jìn)行查詢磷脯。在所有分片上查詢,mongos會(huì)對(duì)結(jié)果進(jìn)行歸并排序娩脾。

  對(duì)集合進(jìn)行分片時(shí)赵誓,你需要選擇一個(gè)片鍵,片鍵是每條記錄都必須包含的,且建立了索引的單個(gè)字段或復(fù)合字段俩功,MongoDB按照片鍵將數(shù)據(jù)劃分到不同的數(shù)據(jù)塊中幻枉,并將數(shù)據(jù)塊均衡地分布到所有分片中。

  為了按照片鍵劃分?jǐn)?shù)據(jù)塊诡蜓,MongoDB使用基于范圍的分片方式或者 基于哈希的分片方式熬甫。

注意:

分片鍵是不可變。

分片鍵必須有索引万牺。

分片鍵大小限制512bytes罗珍。

分片鍵用于路由查詢洽腺。

MongoDB不接受已進(jìn)行collection級(jí)分片的collection上插入無分片

鍵的文檔(也不支持空值插入)

2.3.2 以范圍為基礎(chǔ)的分片Sharded Cluster

  Sharded Cluster支持將單個(gè)集合的數(shù)據(jù)分散存儲(chǔ)在多shard上脚粟,用戶可以指定根據(jù)集合內(nèi)文檔的某個(gè)字段即shard key來進(jìn)行范圍分片(range sharding)。

  對(duì)于基于范圍的分片蘸朋,MongoDB按照片鍵的范圍把數(shù)據(jù)分成不同部分核无。

  假設(shè)有一個(gè)數(shù)字的片鍵:想象一個(gè)從負(fù)無窮到正無窮的直線,每一個(gè)片鍵的值都在直線上畫了一個(gè)點(diǎn)藕坯。MongoDB把這條直線劃分為更短的不重疊的片段团南,并稱之為數(shù)據(jù)塊,每個(gè)數(shù)據(jù)塊包含了片鍵在一定范圍內(nèi)的數(shù)據(jù)炼彪。在使用片鍵做范圍劃分的系統(tǒng)中吐根,擁有”相近”片鍵的文檔很可能存儲(chǔ)在同一個(gè)數(shù)據(jù)塊中,因此也會(huì)存儲(chǔ)在同一個(gè)分片中辐马。

2.3.3 基于哈希的分片

  分片過程中利用哈希索引作為分片的單個(gè)鍵拷橘,且哈希分片的片鍵只能使用一個(gè)字段,而基于哈希片鍵最大的好處就是保證數(shù)據(jù)在各個(gè)節(jié)點(diǎn)分布基本均勻喜爷。

  對(duì)于基于哈希的分片冗疮,MongoDB計(jì)算一個(gè)字段的哈希值,并用這個(gè)哈希值來創(chuàng)建數(shù)據(jù)塊檩帐。在使用基于哈希分片的系統(tǒng)中术幔,擁有”相近”片鍵的文檔很可能不會(huì)存儲(chǔ)在同一個(gè)數(shù)據(jù)塊中,因此數(shù)據(jù)的分離性更好一些湃密。

  Hash分片與范圍分片互補(bǔ)诅挑,能將文檔隨機(jī)的分散到各個(gè)chunk,充分的擴(kuò)展寫能力泛源,彌補(bǔ)了范圍分片的不足拔妥,但不能高效的服務(wù)范圍查詢,所有的范圍查詢要分發(fā)到后端所有的Shard才能找出滿足條件的文檔俩由。

2.3.4 分片鍵選擇建議

1毒嫡、遞增的sharding key

數(shù)據(jù)文件挪動(dòng)小。(優(yōu)勢(shì))

因?yàn)閿?shù)據(jù)文件遞增,所以會(huì)把insert的寫IO永久放在最后一片上兜畸,造成最后一片的寫熱點(diǎn)努释。同時(shí),隨著最后一片的數(shù)據(jù)量增大咬摇,將不斷的發(fā)生遷移至之前的片上伐蒂。

2、隨機(jī)的sharding key

數(shù)據(jù)分布均勻肛鹏,insert的寫IO均勻分布在多個(gè)片上逸邦。(優(yōu)勢(shì))

大量的隨機(jī)IO,磁盤不堪重荷在扰。

3缕减、混合型key

大方向隨機(jī)遞增,小范圍隨機(jī)分布芒珠。

為了防止出現(xiàn)大量的chunk均衡遷移桥狡,可能造成的IO壓力。我們需要設(shè)置合理分片使用策略(片鍵的選擇皱卓、分片算法(range裹芝、hash))

分片注意:

?? 分片鍵是不可變、分片鍵必須有索引娜汁、分片鍵大小限制512bytes嫂易、分片鍵用于路由查詢。

?? MongoDB不接受已進(jìn)行collection級(jí)分片的collection上插入無分片鍵的文檔(也不支持空值插入)

擴(kuò)展閱讀:https://www.cnblogs.com/clsn/p/8214345.html#auto-id-32

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掐禁,一起剝皮案震驚了整個(gè)濱河市怜械,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌穆桂,老刑警劉巖宫盔,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異享完,居然都是意外死亡灼芭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門般又,熙熙樓的掌柜王于貴愁眉苦臉地迎上來彼绷,“玉大人,你說我怎么就攤上這事茴迁〖拿酰” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵堕义,是天一觀的道長猜旬。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么洒擦? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任椿争,我火速辦了婚禮,結(jié)果婚禮上熟嫩,老公的妹妹穿的比我還像新娘秦踪。我一直安慰自己,他們只是感情好掸茅,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布椅邓。 她就那樣靜靜地躺著,像睡著了一般昧狮。 火紅的嫁衣襯著肌膚如雪景馁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天陵且,我揣著相機(jī)與錄音裁僧,去河邊找鬼。 笑死慕购,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的茬底。 我是一名探鬼主播沪悲,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼阱表!你這毒婦竟也來了殿如?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤最爬,失蹤者是張志新(化名)和其女友劉穎涉馁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爱致,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烤送,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了糠悯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帮坚。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖互艾,靈堂內(nèi)的尸體忽然破棺而出试和,到底是詐尸還是另有隱情,我是刑警寧澤纫普,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布阅悍,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏节视。R本人自食惡果不足惜晦墙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肴茄。 院中可真熱鬧晌畅,春花似錦、人聲如沸寡痰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拦坠。三九已至连躏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贞滨,已是汗流浹背入热。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晓铆,地道東北人勺良。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像骄噪,于是被迫代替她去往敵國和親尚困。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361