<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          從Redis的集群設(shè)計(jì)中能夠得到哪些啟發(fā)?

          共 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ā)。

          1

          Redis集群的可擴(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 16384
          Redis之所以引入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)求不中斷。

          2

          Redis集群的高可用設(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è)無法打破的理論性約束。

          3

          Redis集群的客戶端

          集群同樣需要客戶端的支持。從單節(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)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  五月丁香激情中文字幕 | 欧美黄片免费播放 | 肏屄网站 | 日韩精品毛片免费视频 | 国产大学生一级A片 |