校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 解析Redis Cluster原理

解析Redis Cluster原理

熱門標簽:日本中國地圖標注 超呼電話機器人 貴州電銷卡外呼系統(tǒng) 山東外呼銷售系統(tǒng)招商 魔獸2青云地圖標注 十堰營銷電銷機器人哪家便宜 北京400電話辦理收費標準 鄭州人工智能電銷機器人系統(tǒng) 宿遷便宜外呼系統(tǒng)平臺

一、前言

Sentinel集群會對Redis的主從架構中的Redis實例進行監(jiān)控,一旦發(fā)現(xiàn)了master節(jié)點宕機了,就會選舉出一個Sentinel節(jié)點來執(zhí)行故障轉移,從原來的slave節(jié)點中選舉出一個,將其提升為master節(jié)點,然后讓其他的節(jié)點去復制新選舉出來的master節(jié)點。

你可能會覺得這樣沒有問題啊,甚至能夠滿足我們生產環(huán)境的使用需求了,那我們?yōu)槭裁催€需要Redis Cluster呢?

二、為什么需要Redis Cluster

的確,在數據上,有replication副本做保證;可用性上,master宕機會自動的執(zhí)行failover。

那問題在哪兒呢?

首先Redis Sentinel說白了也是基于主從復制,在主從復制中slave的數據是完全來自于master。

假設master節(jié)點的內存只有4G,那slave節(jié)點所能存儲的數據上限也只能是4G。主從復制架構中是讀寫分離的,我們可以通過增加slave節(jié)點來擴展主從的讀并發(fā)能力,但是寫能力和存儲能力是無法進行擴展的,就只能是master節(jié)點能夠承載的上限。

所以,當你只需要存儲4G的數據時候的,基于主從復制和基于Sentinel的高可用架構是完全夠用的。

但是如果當你面臨的是海量的數據的時候呢?16G、64G、256G甚至1T呢?現(xiàn)在互聯(lián)網的業(yè)務里面,如果你的體量足夠大,我覺得是肯定會面臨緩存海量緩存數據的場景的。

這就是為什么我們需要引入Redis Cluster。

三、Redis Cluster是什么

知道了為什么需要Redis Cluster之后,我們就可以來對其一探究竟了。

那什么是Redis Cluster呢?

很簡單,你就可以理解為n個主從架構組合在一起對外服務。Redis Cluster要求至少需要3個master才能組成一個集群,同時每個master至少需要有一個slave節(jié)點。

這樣一來,如果一個主從能夠存儲32G的數據,如果這個集群包含了兩個主從,則整個集群就能夠存儲64G的數據。

我們知道,主從架構中,可以通過增加slave節(jié)點的方式來擴展讀請求的并發(fā)量,那Redis Cluster中是如何做的呢?雖然每個master下都掛載了一個slave節(jié)點,但是在Redis Cluster中的讀、寫請求其實都是在master上完成的。

slave節(jié)點只是充當了一個數據備份的角色,當master發(fā)生了宕機,就會將對應的slave節(jié)點提拔為master,來重新對外提供服務。

四、節(jié)點負載均衡

知道了什么是Redis Cluster,我們就可以繼續(xù)下面的討論了。

不知道你思考過一個問題沒,這么多的master節(jié)點。我存儲的時候,到底該選擇哪個節(jié)點呢?一般這種負載均衡算法,會選擇哈希算法。哈希算法是怎么做的呢?

首先就是對key計算出一個hash值,然后用哈希值對master數量進行取模。由此就可以將key負載均衡到每一個Redis節(jié)點上去。這就是簡單的哈希算法的實現(xiàn)。

那Redis Cluster是采取的上面的哈希算法嗎?答案是沒有。

Redis Cluster其實采取的是類似于一致性哈希的算法來實現(xiàn)節(jié)點選擇的。那為什么不用哈希算法來進行實例選擇呢?以及為什么說是類似的呢?我們繼續(xù)討論。

因為如果此時某一臺master發(fā)生了宕機,那么此時會導致Redis中所有的緩存失效。為什么是所有的?假設之前有3個master,那么之前的算法應該是 hash % 3,但是如果其中一臺master宕機了,則算法就會變成 hash % 2,會影響到之前存儲的所有的key。而這對緩存后面保護的DB來說,是致命的打擊。

五、什么是一致性哈希

知道了通過傳統(tǒng)哈希算法來實現(xiàn)對節(jié)點的負載均衡的弊端,我們就需要進一步了解什么是一致性哈希。

我們上面提過哈希算法是對master實例數量來取模,而一致性哈希則是對2^32取模,也就是值的范圍在[0, 2^32 -1]。一致性哈希將其范圍抽象成了一個圓環(huán),使用CRC16算法計算出來的哈希值會落到圓環(huán)上的某個地方。

然后我們的Redis實例也分布在圓環(huán)上,我們在圓環(huán)上按照順時針的順序找到第一個Redis實例,這樣就完成了對key的節(jié)點分配。我們舉個例子。

假設我們有A、B、C三個Redis實例按照如圖所示的位置分布在圓環(huán)上,此時計算出來的hash值,取模之后位置落在了位置D,那么我們按照順時針的順序,就能夠找到我們這個key應該分配的Redis實例B。同理如果我們計算出來位置在E,那么對應選擇的Redis的實例就是A。

即使這個時候Redis實例B掛了,也不會影響到實例A和C的緩存。

例如此時節(jié)點B掛了,那之前計算出來在位置D的key,此時會按照順時針的順序,找到節(jié)點C。相當于自動的把原來節(jié)點B的流量給轉移到了節(jié)點C上去。而其他原本就在節(jié)點A和節(jié)點C的數據則完全不受影響。

這就是一致性哈希,能夠在我們后續(xù)需要新增節(jié)點或者刪除節(jié)點的時候,不影響其他節(jié)點的正常運行。

六、虛擬節(jié)點機制

但是一致性哈希也存在自身的小問題,例如當我們的Redis節(jié)點分布如下時,就有問題了。

此時數據落在節(jié)點A上的概率明顯是大于其他兩個節(jié)點的,其次落在節(jié)點C上的概率最小。這樣一來會導致整個集群的數據存儲不平衡,AB節(jié)點壓力較大,而C節(jié)點資源利用不充分。為了解決這個問題,一致性哈希算法引入了虛擬節(jié)點機制。

virtual-dom

在圓環(huán)中,增加了對應節(jié)點的虛擬節(jié)點,然后完成了虛擬節(jié)點到真實節(jié)點的映射。假設現(xiàn)在計算得出了位置D,那么按照順時針的順序,我們找到的第一個節(jié)點就是C #1,最終數據實際還是會落在節(jié)點C上。

通過增加虛擬節(jié)點的方式,使ABC三個節(jié)點在圓環(huán)上的位置更加均勻,平均了落在每一個節(jié)點上的概率。這樣一來就解決了上文提到的數據存儲存在不均勻的問題了,這就是一致性哈希的虛擬節(jié)點機制。

七、Redis Cluster采用的什么算法

上面提到過,Redis Cluster采用的是類一致性哈希算法,之所以是類一致性哈希算法是因為它們實現(xiàn)的方式還略微有差別。

例如一致性哈希是對2^32取模,而Redis Cluster則是對2^14(也就是16384)取模。Redis Cluster將自己分成了16384個Slot(槽位)。通過CRC16算法計算出來的哈希值會跟16384取模,取模之后得到的值就是對應的槽位,然后每個Redis節(jié)點都會負責處理一部分的槽位,就像下表這樣。

節(jié)點 處理槽位
A 0 - 5000
B 5001 - 10000
C 10001 - 16383

每個Redis實例會自己維護一份slot - Redis節(jié)點的映射關系,假設你在節(jié)點A上設置了某個key,但是這個key通過CRC16計算出來的槽位是由節(jié)點B維護的,那么就會提示你需要去節(jié)點B上進行操作。

slot-to-node

八、Redis Cluster如何做到高可用

不知道你思考過一個問題沒,如果Redis Cluster中的某個master節(jié)點掛了,它是如何保證集群自身的高可用的?如果這個時候我們集群需要擴容節(jié)點,它該負責哪些槽位呢?我們一個一個問題的來看一下。

8.1、集群如何進行擴容

我們開篇聊過,Redis Cluster可以很方便的進行橫向擴容,那當新的節(jié)點加入進來的時候,它是如何獲取對應的slot的呢?

答案是通過reshard(重新分片)來實現(xiàn)。reshard可以將已經分配給某個節(jié)點的任意數量的slot遷移給另一個節(jié)點,在Redis內部是由redis-trib負責執(zhí)行的。你可以理解為Redis其實已經封裝好了所有的命令,而redis-trib則負責向獲取slot的節(jié)點和被轉移slot的節(jié)點發(fā)送命令來最終實現(xiàn)reshard。

假設我們需要向集群中加入一個D節(jié)點,而此時集群內已經有A、B、C三個節(jié)點了。

此時redis-trib會向A、B、C三個節(jié)點發(fā)送遷移出槽位的請求,同時向D節(jié)點發(fā)送準備導入槽位的請求,做好準備之后A、B、C這三個源節(jié)點就開始執(zhí)行遷移,將對應的slot所對應的鍵值對遷移至目標節(jié)點D。最后redis-trib會向集群中所有主節(jié)點發(fā)送槽位的變更信息。

8.2、高可用及故障轉移

Redis Cluster中保證集群高可用的思路和實現(xiàn)和Redis Sentinel如出一轍

簡單來說,針對A節(jié)點,某一個節(jié)點認為A宕機了,那么此時是主觀宕機。而如果集群內超過半數的節(jié)點認為A掛了, 那么此時A就會被標記為客觀宕機。

一旦節(jié)點A被標記為了客觀宕機,集群就會開始執(zhí)行故障轉移。其余正常運行的master節(jié)點會進行投票選舉,從A節(jié)點的slave節(jié)點中選舉出一個,將其切換成新的master對外提供服務。當某個slave獲得了超過半數的master節(jié)點投票,就成功當選。

cluster-failover

當選成功之后,新的master會執(zhí)行slaveof no one來讓自己停止復制A節(jié)點,使自己成為master。然后將A節(jié)點所負責處理的slot,全部轉移給自己,然后就會向集群發(fā)PONG消息來廣播自己的最新狀態(tài)。

按照一致性哈希的思想,如果某個節(jié)點掛了,那么就會沿著那個圓環(huán),按照順時針的順序找到遇到的第一個Redis實例。

而對于Redis Cluster,某個key它其實并不關心它最終要去到哪個節(jié)點,他只關心他最終落到哪個slot上,無論你節(jié)點怎么去遷移,最終還是只需要找到對應的slot,然后再找到slot關聯(lián)的節(jié)點,最終就能夠找到最終的Redis實例了。

那這個PONG消息又是什么東西呢?別急,下面就會聊到。

九、簡單了解gossip協(xié)議

這就是Redis Cluster各個節(jié)點之間交換數據、通信所采用的一種協(xié)議,叫做gossip。

gossip: 流言、八卦、小道消息

gossip是在1989年的論文上提出的,我看了一堆資料都說的是1987年發(fā)表的,但是文章里的時間明確是1989年1月份發(fā)表。

image-20201215100703648

感興趣的可以去看看Epidemic Algorithms for Replicated . Database Maintenance,在當時提出gossip主要是為了解決在分布式數據庫中,各個副本節(jié)點的數據同步問題。但隨著技術的發(fā)展,gossip后續(xù)也被廣泛運用于信息擴散、故障探測等等。

Redis Cluster就是利用了gossip來實現(xiàn)自身的信息擴散的。那使用gossip具體是如何通信的呢?

gossip

很簡單,就像圖里這樣。每個Redis節(jié)點每秒鐘都會向其他的節(jié)點發(fā)送PING,然后被PING的節(jié)點會回一個PONG。

十、gossip協(xié)議消息類型

Redis Cluster中,節(jié)點之間的消息類型有5種,分別是MEET、PING、PONG、FAIL和PUBLISH。這些消息分別傳遞了什么內容呢?我簡單總結了一下。

消息類型 消息內容
MEET 給某個節(jié)點發(fā)送MEET消息,請求接收消息的節(jié)點加入到集群中
PING 每隔一秒鐘,選擇5個最久沒有通信的節(jié)點,發(fā)送PING消息,檢測對應的節(jié)點是否在線;同時還有一種策略是,如果某個節(jié)點的通信延遲大于了cluster-node-time的值的一半,就會立即給該節(jié)點發(fā)送PING消息,避免數據交換延遲過久
PONG 當節(jié)點接收到MEET或者PING消息之后,會回一個PONG消息給發(fā)送方,代表自己收到了MEET或者PING消息。同時,節(jié)點也可以主動的通過PONG消息向集群中廣播自己的信息,讓其他節(jié)點獲取到自己最新的屬性,就像完成了故障轉移之后新的master向集群發(fā)送PONG消息一樣
FAIL 用于廣播自己的對某個節(jié)點的宕機判斷,假設當前節(jié)點對A節(jié)點判斷為宕機,就會立即向Redis Cluster廣播自己對于A節(jié)點的判斷,所有收到消息的節(jié)點就會對A節(jié)點做標記
PUBLISH 用于向指定的Channel發(fā)送消息,某個節(jié)點收到PUBLISH消息之后會直接在集群內廣播,這樣一來,客戶端無論連接到任何節(jié)點都能夠訂閱這個Channel

十一、使用gossip的優(yōu)劣

既然Redis Cluster選擇了gossip,那肯定存在一些gossip的優(yōu)點,我們接下來簡單梳理一下。

優(yōu)點 描述
擴展性 網絡可以允許節(jié)點的任意增加和減少,新增加的節(jié)點的狀態(tài)最終會與其他節(jié)點一致。
容錯性 由于每個節(jié)點都持有一份完整元數據,所以任何節(jié)點宕機都不會影響gossip的運行
健壯性 與容錯性類似,由于所有節(jié)點都持有數據,地位平臺,是一個去中心化的設計,任何節(jié)點都不會影響到服務的運行
最終一致性 當有新的信息需要傳遞時,消息可以快速的發(fā)送到所有的節(jié)點,讓所有的節(jié)點都擁有最新的數據

gossip可以在O(logN) 輪就可以將信息傳播到所有的節(jié)點,為什么是O(logN)呢?因為每次ping,當前節(jié)點會帶上自己的信息外加整個Cluster的1/10數量的節(jié)點信息,一起發(fā)送出去。你可以簡單的把這個模型抽象為:

你轉發(fā)了一個特別有意思的文章到朋友圈,然后你的朋友們都覺得還不錯,于是就一傳十、十傳百這樣的散播出去了,這就是朋友圈的裂變傳播。

當然,gossip仍然存在一些缺點。例如消息可能最終會經過很多輪才能到達目標節(jié)點,而這可能會帶來較大的延遲。同時由于節(jié)點會隨機選出5個最久沒有通信的節(jié)點,這可能會造成某一個節(jié)點同時收到n個重復的消息。

十二、總結

總的來說,Redis Cluster相當于是把Redis的主從架構和Sentinel集成到了一起,從Redis Cluster的高可用機制、判斷故障轉移以及執(zhí)行故障轉移的過程,都和主從、Sentinel相關,這也是為什么我在之前的文章里說,主從是Redis高可用架構的基石。

以上就是解析Redis Cluster原理的詳細內容,更多關于Redis Cluster的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • 詳解SpringBoot Redis自適應配置(Cluster Standalone Sentinel)
  • Redis Cluster集群數據分片機制原理
  • docker redis5.0 cluster集群搭建的實現(xiàn)
  • 使用Ruby腳本部署Redis Cluster集群步驟講解
  • php成功操作redis cluster集群的實例教程
  • Redis cluster集群的介紹
  • Windows環(huán)境下Redis Cluster環(huán)境搭建(圖文)
  • 如何用docker部署redis cluster的方法
  • spring集成redis cluster詳解
  • Redis Cluster添加、刪除的完整操作步驟

標簽:北京 果洛 楊凌 臺州 江蘇 吉安 朝陽 大慶

巨人網絡通訊聲明:本文標題《解析Redis Cluster原理》,本文關鍵詞  解析,Redis,Cluster,原理,解析,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《解析Redis Cluster原理》相關的同類信息!
  • 本頁收集關于解析Redis Cluster原理的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    久久av资源站| 日韩极品在线观看| 成人影视亚洲图片在线| 国产精品午夜电影| 91在线免费看| 婷婷综合另类小说色区| 欧美日韩色一区| 激情成人综合网| 国产精品久久久久婷婷| 一本到不卡精品视频在线观看| 亚洲欧美色一区| 在线成人免费视频| 精品一区二区综合| 中文字幕一区二区三区不卡在线| 色欧美88888久久久久久影院| 午夜国产不卡在线观看视频| 欧美成人女星排名| 不卡视频在线观看| 五月天亚洲婷婷| 欧美国产乱子伦| 欧美日韩国产首页| 黄色日韩三级电影| 亚洲美女电影在线| 欧美videossexotv100| 成人av影视在线观看| 日韩在线一二三区| 国产精品国产自产拍高清av王其 | 欧美日韩黄色影视| 国产在线精品一区二区三区不卡| 成人免费在线视频观看| 91精品国产综合久久福利 | 一本一道综合狠狠老| 蜜桃精品视频在线| 亚洲男女毛片无遮挡| 精品国产乱码久久久久久免费| 91麻豆精品一区二区三区| 激情国产一区二区| 亚洲影视在线播放| 国产精品午夜电影| 欧美成人三级在线| 欧美亚洲自拍偷拍| 成人av在线影院| 精品一区二区综合| 五月激情丁香一区二区三区| 国产精品无遮挡| 精品国产乱码久久久久久久久| 欧美在线观看18| 不卡av在线网| 国产成人精品三级麻豆| 青青青爽久久午夜综合久久午夜| 亚洲免费在线播放| 国产精品不卡视频| 国产欧美日韩中文久久| 精品欧美一区二区在线观看| 欧美日韩电影在线播放| 91视频xxxx| 91亚洲永久精品| 国产成a人亚洲精| 黄页视频在线91| 看片网站欧美日韩| 欧美aaaaaa午夜精品| 五月综合激情日本mⅴ| 一区二区三区欧美视频| 亚洲美女淫视频| 一区二区三区精品久久久| 亚洲欧美日韩在线| 亚洲人精品午夜| 综合激情网...| 亚洲同性同志一二三专区| 国产精品国产成人国产三级| 国产欧美精品一区二区色综合朱莉| 精品人在线二区三区| 精品国产一区二区三区四区四| 日韩视频中午一区| 亚洲精品一区二区三区福利| 精品国产91九色蝌蚪| 精品欧美乱码久久久久久| 久久综合久久鬼色中文字| 精品国精品自拍自在线| 久久久国产精华| 国产精品网站在线播放| 亚洲视频一二区| 一二三四区精品视频| 一区二区三区高清在线| 日韩国产一区二| 激情伊人五月天久久综合| 国产91精品久久久久久久网曝门| 成人美女在线观看| 91麻豆精东视频| 欧美日韩国产乱码电影| 日韩一区二区三区电影在线观看 | 最新中文字幕一区二区三区| 亚洲女人的天堂| 日韩av午夜在线观看| 久久99久久精品| 福利电影一区二区| 在线观看av一区二区| 欧美一级一区二区| 久久精品亚洲乱码伦伦中文| 亚洲女同一区二区| 人人狠狠综合久久亚洲| 国产成人av资源| 色婷婷av久久久久久久| 欧美一二三在线| 中文字幕在线一区| 亚洲国产欧美在线| 久久成人精品无人区| 99在线热播精品免费| 欧美日韩中字一区| 精品久久久三级丝袜| 亚洲乱码日产精品bd| 日韩中文字幕区一区有砖一区| 国产福利一区二区三区| 色综合久久久久综合体| 日韩欧美电影在线| 综合久久一区二区三区| 久久国产综合精品| 99热在这里有精品免费| 欧美片在线播放| 国产日韩欧美电影| 亚洲18影院在线观看| 国产成人免费视频网站高清观看视频| 97成人超碰视| 欧美精品一区二区蜜臀亚洲| 夜夜亚洲天天久久| 国产成人免费视频一区| 884aa四虎影成人精品一区| 中文字幕av一区二区三区| 日本在线不卡视频| 北条麻妃一区二区三区| 精品国产第一区二区三区观看体验| 亚洲男人电影天堂| 国产91精品露脸国语对白| 日韩一区二区精品在线观看| 亚洲人精品午夜| 国产黄色91视频| 欧美一区二区大片| 亚洲一二三区在线观看| 成人va在线观看| 久久精品欧美一区二区三区麻豆| 日日摸夜夜添夜夜添亚洲女人| 99这里只有久久精品视频| 久久精品水蜜桃av综合天堂| 全国精品久久少妇| 欧美日韩亚洲丝袜制服| 一区二区三区日韩| 91在线小视频| 国产精品久久久一本精品| 国产精品一区二区在线观看网站| 91精品久久久久久久99蜜桃 | 91美女片黄在线观看| 久久九九99视频| 国产精品一区二区x88av| 精品国产91久久久久久久妲己 | 国产日产亚洲精品系列| 紧缚捆绑精品一区二区| 日韩网站在线看片你懂的| 日产国产欧美视频一区精品| 欧美猛男男办公室激情| 亚洲五月六月丁香激情| 在线精品视频一区二区三四| 亚洲最大色网站| 在线观看日韩电影| 亚洲已满18点击进入久久| 在线免费观看视频一区| 一片黄亚洲嫩模| 欧美午夜精品免费| 午夜电影久久久| 欧美一区二区大片| 精品一区二区三区在线观看国产| 日韩三级免费观看| 激情综合色播激情啊| 久久丝袜美腿综合| 国产91精品精华液一区二区三区| 欧美—级在线免费片| 波多野结衣欧美| 一个色妞综合视频在线观看| 欧美专区日韩专区| 日本vs亚洲vs韩国一区三区| 精品国产91乱码一区二区三区| 国产精品一级在线| 成人欧美一区二区三区白人| 在线影院国内精品| 婷婷久久综合九色综合伊人色| 欧美一级午夜免费电影| 国产一区二区三区日韩| 一区视频在线播放| 欧美日韩视频在线第一区 | 懂色一区二区三区免费观看 | 中文字幕巨乱亚洲| 日本高清免费不卡视频| 日韩电影在线观看网站| 精品免费国产一区二区三区四区| 国产成人精品一区二区三区网站观看| 亚洲同性gay激情无套| 欧美女孩性生活视频| 国产成a人无v码亚洲福利| 一区二区三区免费在线观看| 欧美一级片在线| 99天天综合性|