從Redis的集群設(shè)計(jì)中能夠得到哪些啟發(fā)?WU雙關(guān)注共 2612字,需瀏覽 6分鐘 ·2021-09-02 09:01 聊技術(shù),不止于技術(shù)在大型的分布式系統(tǒng)中,我們都會(huì)聽到集群的概念,比如Redis集群、ES集群等。那么集群主要的作用是什么呢?個(gè)人看來集群主要做了這幾件事,或者說集群的設(shè)計(jì)主要為了解決如下問題:(1) 可擴(kuò)展,好的集群設(shè)計(jì)可以實(shí)現(xiàn)近乎線性擴(kuò)展,即存儲(chǔ)和性能隨著硬件的增加而線性增長(zhǎng);(2) 高可用,能夠在部分節(jié)點(diǎn)故障時(shí)實(shí)現(xiàn)故障轉(zhuǎn)移。今天讓我們一起來看看Redis集群是如何設(shè)計(jì)來解決可擴(kuò)展及高可用問題的,從中我們又能得到哪些啟發(fā)。1Redis集群的可擴(kuò)展設(shè)計(jì)Redis集群引入了hash slot的概念,實(shí)際上也就是數(shù)據(jù)分區(qū),Redis集群總共有16384個(gè)hash slot,集群中的每個(gè)節(jié)點(diǎn)都會(huì)負(fù)責(zé)一部分hash slot。假如我們集群中有三個(gè)節(jié)點(diǎn),那么:(1) 節(jié)點(diǎn)A將包含hash slot 0 ~ 5500;(2) 節(jié)點(diǎn)B將包含hash slot 5501 ~11000;(3) 節(jié)點(diǎn)C將包含hash slot 11001 ~16383。Redis集群通過計(jì)算每個(gè)key值的crc16值,然后對(duì)16384取模,來獲得key對(duì)應(yīng)的hash slot,實(shí)現(xiàn)數(shù)據(jù)寫入/讀取。HASH_SLOT = CRC16(key) mod 16384Redis之所以引入hash slot的概念,其實(shí)是為了方便集群的擴(kuò)縮容,也就是提供了集群的可擴(kuò)展性。當(dāng)我們?cè)黾踊蚴菧p少節(jié)點(diǎn)的時(shí)候,可以以hash slot為粒度來進(jìn)行數(shù)據(jù)的遷移。對(duì)于有狀態(tài)的集群來講,要想實(shí)現(xiàn)可擴(kuò)展,一定需要數(shù)據(jù)遷移的功能,數(shù)據(jù)遷移又涉及到遷移粒度,對(duì)于Redis來講,數(shù)據(jù)遷移的粒度為hash slot,對(duì)于elasticsearch來講,為shard分區(qū)。Redis集群允許我們動(dòng)態(tài)的增加及刪除節(jié)點(diǎn)。增加新的節(jié)點(diǎn),我們可以遷移部分hash slot到新節(jié)點(diǎn)中,如果要?jiǎng)h除節(jié)點(diǎn),我們可以將待刪除節(jié)點(diǎn)的hash slot遷移到其他節(jié)點(diǎn),待遷移完成便可以刪除相應(yīng)節(jié)點(diǎn)。Redis集群的數(shù)據(jù)重分區(qū)不會(huì)對(duì)客戶端產(chǎn)生影響,整個(gè)過程不影響客戶端正常操作。那這是如何做到的呢?舉個(gè)例子,假如我們正在把hash slot 3 從A節(jié)點(diǎn)遷移到B節(jié)點(diǎn)(hash slot的遷移會(huì)將該slot中的所有數(shù)據(jù)都遷移),在這個(gè)過程中客戶端發(fā)起查詢的key值在hash slot 3中:(1) 集群中的所有節(jié)點(diǎn)還是會(huì)將請(qǐng)求指向A節(jié)點(diǎn);(2) 如果A節(jié)點(diǎn)中相應(yīng)的key值還未遷移,則返回查詢結(jié)果;(3) 如果A節(jié)點(diǎn)中相應(yīng)的key值已經(jīng)遷移,則A會(huì)將客戶端查詢重定向到B,由B處理并返回查詢結(jié)果。在整個(gè)遷移過程中不會(huì)再在節(jié)點(diǎn)A上新創(chuàng)建key,新增的key值在hash slot 3中的,將在節(jié)點(diǎn)B中創(chuàng)建。數(shù)據(jù)遷移完成后,集群內(nèi)會(huì)通過內(nèi)部協(xié)議更新各個(gè)節(jié)點(diǎn)對(duì)應(yīng)的hash slot信息,后續(xù)相應(yīng)key的查詢都會(huì)直接走B了。Redis集群通過將數(shù)據(jù)劃分為hash slot,并且能夠以hash slot為粒度進(jìn)行數(shù)據(jù)遷移,從而實(shí)現(xiàn)集群了的可擴(kuò)展性。通過與客戶端的配合,也能夠?qū)崿F(xiàn)在集群擴(kuò)展過程中的請(qǐng)求不中斷。2Redis集群的高可用設(shè)計(jì)因?yàn)镽edis本身是有狀態(tài)的,而對(duì)于有狀態(tài)的應(yīng)用來講,高可用的實(shí)現(xiàn)方式就是復(fù)制。Redis集群的高可用是通過主從復(fù)制來實(shí)現(xiàn)的。假設(shè)Redis集群有三個(gè)主A、B、C,他們的從節(jié)點(diǎn)分別為A1、B1、C1,當(dāng)主節(jié)點(diǎn)A掛掉后,故障切換流程如下(簡(jiǎn)化流程):(1) 節(jié)點(diǎn)A掛掉,集群將選舉A1為新的主節(jié)點(diǎn),然后繼續(xù)提供服務(wù);(2) 在新的主選舉成功之前,部分讀寫請(qǐng)求會(huì)返回失??;(3) 重啟節(jié)點(diǎn)A,它會(huì)作為從節(jié)點(diǎn)重新加入集群。談到了主從復(fù)制,一個(gè)無法回避的問題是數(shù)據(jù)一致性。性能與一致性之間,我們需要做個(gè)取舍。Redis選擇了性能。Redis集群無法保證強(qiáng)一致性,因?yàn)镽edis的主從復(fù)制采用的是異步的方式。Redis的數(shù)據(jù)寫入流程如下:(1) 客戶端向master B寫入數(shù)據(jù);(2) master B返回OK;(3) master B向自己的從節(jié)點(diǎn)B1發(fā)送寫入數(shù)據(jù)。可以看到master B在返回客戶端OK的時(shí)候,沒有等待確認(rèn)從節(jié)點(diǎn)的數(shù)據(jù)寫入。所以雖然master B返回寫入成功,但如果它在向從節(jié)點(diǎn)發(fā)送數(shù)據(jù)之前掛掉,那么重新選舉產(chǎn)生的主節(jié)點(diǎn)將丟失該數(shù)據(jù)。這其實(shí)是在性能與一致性之間的權(quán)衡。如果采用同步復(fù)制,也就是在確認(rèn)了從節(jié)點(diǎn)的數(shù)據(jù)寫入成功后在返回給用戶,那么我們將獲得數(shù)據(jù)一致性,但犧牲了性能。可以看到,性能與一致性在分布式系統(tǒng)中的取舍,目前來看是一個(gè)無法打破的理論性約束。3Redis集群的客戶端集群同樣需要客戶端的支持。從單節(jié)點(diǎn)變成了集群,客戶端最基本的支持也得需要支持配置多個(gè)節(jié)點(diǎn)ip,從而能夠?qū)⒄?qǐng)求發(fā)送給集群中各個(gè)節(jié)點(diǎn)。Redis客戶端更進(jìn)一步能夠緩存hash slot與各個(gè)節(jié)點(diǎn)間的路由信息,從而能夠直接將請(qǐng)求發(fā)送給相應(yīng)的節(jié)點(diǎn),進(jìn)一步提升性能。可以看出,完整的集群方案設(shè)計(jì),不光光是集群服務(wù)端的事,客戶端也是需要考慮的一個(gè)很重要的地方。兩者結(jié)合,才能發(fā)揮出更好的效果。寫在最后如今的計(jì)算機(jī)系統(tǒng)中,集群是越來越常見的概念。集群的設(shè)計(jì)主要用來解決如下兩個(gè)問題:(1) 可擴(kuò)展;(2) 高可用。可擴(kuò)展即存儲(chǔ)和性能能夠隨著硬件的增加而近乎線性增長(zhǎng)。高可用即能夠在部分節(jié)點(diǎn)故障時(shí)實(shí)現(xiàn)故障轉(zhuǎn)移。可擴(kuò)展需要通過數(shù)據(jù)遷移來實(shí)現(xiàn),數(shù)據(jù)遷移又涉及到數(shù)據(jù)遷移粒度,Redis集群中遷移粒度為hash slot,其他的集群實(shí)現(xiàn)中也有類似的數(shù)據(jù)遷移粒度概念。對(duì)于有狀態(tài)的系統(tǒng)來講,高可用只能通過復(fù)制來實(shí)現(xiàn)。復(fù)制又不可避免的會(huì)遇到數(shù)據(jù)一致性與性能之間的權(quán)衡。目前理論限制下,只能二選一。集群的設(shè)計(jì)不光光是服務(wù)端的事情,也需要客戶端的支持。二者結(jié)合,才能夠發(fā)揮更好的效果。今天主要講解了Redis集群的設(shè)計(jì),相信其中的一些設(shè)計(jì)思想能夠?qū)ξ覀冇兴鶈l(fā)。推薦閱讀:《微服務(wù)中的灰度發(fā)布是什么?實(shí)現(xiàn)思路又是什么?》聊技術(shù),不止于技術(shù)。在這里我會(huì)分享技術(shù)文章、管理知識(shí)以及個(gè)人的思想感悟,歡迎點(diǎn)擊關(guān)注。 瀏覽 51點(diǎn)贊 評(píng)論 收藏 分享 手機(jī)掃一掃分享分享 舉報(bào) 評(píng)論圖片表情視頻評(píng)價(jià)全部評(píng)論推薦 從“年輕人讀毛選”,書店能得到哪些啟發(fā)?闌夕0從嬰兒的語言天賦得到的啟發(fā)深度學(xué)習(xí)視覺0設(shè)計(jì)得到設(shè)計(jì)得到(www.shejidedao.com)是必模(上海)信息科技有限公司旗下幫助建筑裝飾領(lǐng)域設(shè)計(jì)師提升自我能力并提供專業(yè)知識(shí)學(xué)習(xí)的互聯(lián)網(wǎng)綜合服務(wù)平臺(tái);同時(shí)也是國(guó)內(nèi)一線深化設(shè)計(jì)品牌「dop設(shè)計(jì)」旗設(shè)計(jì)得到設(shè)計(jì)得到(www.shejidedao.com)是必模(上海)信息科技有限公司旗下幫助建筑裝飾領(lǐng)域設(shè)從記憶中得到安慰從記憶中得到安慰0從記憶中得到安慰從記憶中得到安慰0Redis集群的搭建Java老鐵鐵0Redis 集群篇JavaKeeper0Redis集群模式數(shù)據(jù)庫(kù)干貨鋪0Redis 集群搭建PHP在線0點(diǎn)贊 評(píng)論 收藏 分享 手機(jī)掃一掃分享分享 舉報(bào)