您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Redis分片機(jī)制的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Redis分片機(jī)制的示例分析”這篇文章吧。
引入分片概念--分片機(jī)制的作用
而本篇文章主要談?wù)?strong>Redis的分片機(jī)制,如果沒(méi)有分片機(jī)制,Redis就被局限于單機(jī)所支持的內(nèi)存容量。Redis的分片機(jī)制允許數(shù)據(jù)拆分存放在不同的Redis實(shí)例上,每個(gè)Redis實(shí)例只包含所有鍵的子集。可以減輕單臺(tái)Redis的壓力,提升Redis擴(kuò)展能力和計(jì)算能力。如果我們只使用一個(gè)Redis實(shí)例,當(dāng)Redis宕機(jī)將會(huì)直接停止服務(wù),所以我們可以采取分片機(jī)制,將原本一臺(tái)Redis實(shí)例維護(hù)的數(shù)據(jù),改為由多個(gè)Redis實(shí)例共同維護(hù)這部分?jǐn)?shù)據(jù)。
(1)范圍分片
分片需要將不同key映射到不同Redis實(shí)例上存儲(chǔ),所以key的映射規(guī)則需要制定一個(gè)算法,最簡(jiǎn)單的一個(gè)分片方案應(yīng)該是范圍分片。范圍分片理解起來(lái)很簡(jiǎn)單,比如我們存儲(chǔ)用戶(hù)基本信息,我們制定一個(gè)算法將用戶(hù)user_id從0到1000映射到實(shí)例A,user_id從1000到2000映射到實(shí)例B,以此類(lèi)推。這個(gè)方案很輕松可以使用,但是引發(fā)了一個(gè)問(wèn)題:我們需要維護(hù)user_id范圍和映射實(shí)例之間的關(guān)系。而正是這個(gè)問(wèn)題導(dǎo)致范圍分片雖然簡(jiǎn)單,但是效率比其他分片方案低效許多,所以Redis中一般不會(huì)使用范圍分片作為分片方案。
(2)哈希分片
比如我們目前有四個(gè)Redis實(shí)例,我們需要存儲(chǔ)一個(gè)key。我們可以通過(guò)哈希函數(shù)crc32()將key名轉(zhuǎn)換成一個(gè)長(zhǎng)整型數(shù)字,然后對(duì)長(zhǎng)整型數(shù)字對(duì)4取余,就可以得到映射的實(shí)例。但是這種分配方案一樣存在弊端:當(dāng)我們需要增加或移除Redis實(shí)例時(shí),就會(huì)造成大量key無(wú)法被命中。所以這時(shí)候出現(xiàn)了一種哈希分片的高級(jí)形式--一致性哈希。一致性哈希有三大特性:
key哈希結(jié)果盡可能分配到不同Redis實(shí)例。
當(dāng)實(shí)例增加或移除,需要保護(hù)已映射的內(nèi)容不會(huì)重新被分配到新實(shí)例上。
對(duì)key的哈希應(yīng)盡量避免重復(fù)。
但是在Redis中沒(méi)有使用一致性哈希這個(gè)概念,而是引入了哈希槽。在Redis集群中共有16384個(gè)哈希槽,然后每個(gè)key通過(guò)哈希函數(shù)crc16()將key名轉(zhuǎn)化成一個(gè)長(zhǎng)整型數(shù)字再對(duì)16384取余,最終決定這個(gè)key存儲(chǔ)的哈希槽。而每個(gè)Redis實(shí)例負(fù)責(zé)維護(hù)一部分哈希槽,所有實(shí)例共同維護(hù)所有的哈希槽。使用哈希槽最顯而易見(jiàn)的特點(diǎn)就是Redis實(shí)例的增加或者移除很方便,而不需要暫停所有Redis實(shí)例服務(wù)。
分片實(shí)現(xiàn)
上一篇談到主從切換的哨兵模式已經(jīng)提到,哨兵模式可以實(shí)現(xiàn)高可用以及讀寫(xiě)分離,但是缺點(diǎn)在于所有Redis實(shí)例存儲(chǔ)的數(shù)據(jù)全部一致,所以Redis支持cluster模式,可以簡(jiǎn)單將cluster理解為Redis集群管理的一個(gè)插件,通過(guò)它可以實(shí)現(xiàn)Redis的分布式存儲(chǔ)。
數(shù)據(jù)分片方式一般有三種:客戶(hù)端分片、代理分片和服務(wù)器分片。
客戶(hù)端分片
定義:客戶(hù)端自己計(jì)算key需要映射到哪一個(gè)Redis實(shí)例。
優(yōu)點(diǎn):客戶(hù)端分片最明顯的好處在于降低了集群的復(fù)雜度,而服務(wù)器之間沒(méi)有任何關(guān)聯(lián)性,數(shù)據(jù)分片由客戶(hù)端來(lái)負(fù)責(zé)實(shí)現(xiàn)。
缺點(diǎn):客戶(hù)端實(shí)現(xiàn)分片則客戶(hù)端需要知道當(dāng)前集群下不同Redis實(shí)例的信息,當(dāng)新增Redis實(shí)例時(shí)需要支持動(dòng)態(tài)分片,多數(shù)Redis需要重啟才能實(shí)現(xiàn)該功能。
代理分片
定義:客戶(hù)端將請(qǐng)求發(fā)送到代理,代理通過(guò)計(jì)算得到需要映射的集群實(shí)例信息,然后將客戶(hù)端的請(qǐng)求轉(zhuǎn)發(fā)到對(duì)應(yīng)的集群實(shí)例上,然后返回響應(yīng)給客戶(hù)端。
優(yōu)點(diǎn):降低了客戶(hù)端的復(fù)雜度,客戶(hù)端不用關(guān)心后端Redis實(shí)例的狀態(tài)信息。
缺點(diǎn):多了一個(gè)中間分發(fā)環(huán)節(jié),所以對(duì)性能有些取的損失。
服務(wù)器分片
定義:客戶(hù)端可以和集群中任意Redis實(shí)例通信,當(dāng)客戶(hù)端訪問(wèn)某個(gè)實(shí)例時(shí),服務(wù)器進(jìn)行計(jì)算key應(yīng)該映射到哪個(gè)具體的Redis實(shí)例中存儲(chǔ),如果映射的實(shí)例不是當(dāng)前實(shí)例,則該實(shí)例主動(dòng)引導(dǎo)客戶(hù)端去對(duì)應(yīng)實(shí)例對(duì)key進(jìn)行操作。這其實(shí)是一個(gè)重定向的過(guò)程。這個(gè)過(guò)程不是從當(dāng)前Redis實(shí)例轉(zhuǎn)發(fā)到對(duì)應(yīng)的Redis實(shí)例,而是客戶(hù)端收到服務(wù)器通知具體映射的Redis實(shí)例重定向到映射的實(shí)例中。當(dāng)前還不能完全適用于生產(chǎn)環(huán)境。
優(yōu)點(diǎn):支持高可用,任意實(shí)例都有主從,主掛了從會(huì)自動(dòng)接管。
缺點(diǎn):需要客戶(hù)端語(yǔ)言實(shí)現(xiàn)服務(wù)器集群協(xié)議,但是目前大多數(shù)語(yǔ)言都有其客戶(hù)端實(shí)現(xiàn)版本。
預(yù)分片
從上面可以清楚地看出,分片機(jī)制增加或移除實(shí)例是非常麻煩的一件事,所以我們可以考慮一開(kāi)始就開(kāi)啟32個(gè)節(jié)點(diǎn)實(shí)例,當(dāng)我們可以新增Redis服務(wù)器時(shí),我們可以將一半的節(jié)點(diǎn)移動(dòng)到新的Redis服務(wù)器。這樣我們只需要在新服務(wù)器啟動(dòng)一個(gè)空節(jié)點(diǎn),然后移動(dòng)數(shù)據(jù),配置新節(jié)點(diǎn)為源節(jié)點(diǎn)的從節(jié)點(diǎn),然后更新被移動(dòng)節(jié)點(diǎn)的ip信息,然后向新服務(wù)器發(fā)送slaveof命令關(guān)閉主從配置,最后關(guān)閉舊服務(wù)器不需要使用的實(shí)例并且重新啟動(dòng)客戶(hù)端。這樣我們就可以在幾乎不需要停機(jī)時(shí)間時(shí)完成數(shù)據(jù)的移動(dòng)。
分片機(jī)制的缺點(diǎn)
分片是由多臺(tái)Redis實(shí)例共同運(yùn)轉(zhuǎn),所以如果其中一個(gè)Redis實(shí)例宕機(jī),則整個(gè)分片都將無(wú)法使用,所以分片機(jī)制無(wú)法實(shí)現(xiàn)高可用。
如果有不同的key映射到不同的Redis實(shí)例,這時(shí)候不能對(duì)這兩個(gè)key做交集或者使用事務(wù)。
使用分片機(jī)制因?yàn)樯婕岸鄬?shí)例,數(shù)據(jù)處理比較復(fù)雜。
分片中對(duì)于實(shí)例的添加或刪除會(huì)很復(fù)雜,不過(guò)可以使用預(yù)分片技術(shù)進(jìn)行改善。
以上是“Redis分片機(jī)制的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。