Redis Cluster

簡介

Redis Cluster 是 在 3.0 版本正式推出的高可用集群方案,相比Redis Sentinel,Redis Cluster方案不需要額外部署Sentinel集群,而是通過集群內(nèi)部通信實現(xiàn)集群監(jiān)控净捅,故障時主從切換;同時,支持內(nèi)部基于哈希實現(xiàn)數(shù)據(jù)分片廉羔,支持動態(tài)水平擴容;某節(jié)點宕機只會影響該節(jié)點的槽位僻造,不會影響到其他主節(jié)點

拓撲

Redis 集群是一個網(wǎng)狀結(jié)構(gòu)憋他,無中心結(jié)構(gòu),每個節(jié)點都通過 TCP 連接跟其他每個節(jié)點連接髓削。
在一個有 N 個節(jié)點的集群中竹挡,每個節(jié)點都有 N-1 個流出的 TCP 連接,和 N-1 個流入的連接立膛。 這些 TCP 連接會永久保持揪罕,并不是按需創(chuàng)建的。
節(jié)點們使用一個 gossip 協(xié)議來傳播集群的信息:發(fā)現(xiàn)新的節(jié)點宝泵、 發(fā)送ping包(用來確保所有節(jié)點都在正常工作中)好啰、在特定情況發(fā)生時發(fā)送集群消息。集群連接也用于在集群中發(fā)布或訂閱消息儿奶。

image.png

集群中有多個主節(jié)點框往,每個主節(jié)點有多個從節(jié)點,主從節(jié)點間數(shù)據(jù)一致闯捎,最少需要3個主節(jié)點椰弊,每個主節(jié)點最少需要1個從節(jié)點

  • 高可用:當master節(jié)點故障時许溅,自動主從切換
  • 高性能:主節(jié)點提供讀寫服務(wù),從節(jié)點只讀服務(wù)秉版,提高系統(tǒng)吞吐量
  • 可擴展性:集群的數(shù)據(jù)分片存儲贤重,主節(jié)點間數(shù)據(jù)各不同,各自維護對應(yīng)數(shù)據(jù)沐飘,可以為集群添加節(jié)點進行擴容游桩,也可以下線部分節(jié)點進行水平縮容

gossip 協(xié)議

原理:所有節(jié)點都持有一份元數(shù)據(jù),不同的節(jié)點如果出現(xiàn)了元數(shù)據(jù)的變更耐朴,就不斷將元數(shù)據(jù)發(fā)送給其它的節(jié)點借卧,讓其它節(jié)點也進行元數(shù)據(jù)的變更。

gossip 協(xié)議包含多種消息筛峭,包含 ping,pong,meet,fail 等等

  • meet:某個節(jié)點發(fā)送 meet 給新加入的節(jié)點铐刘,讓新節(jié)點加入集群中,然后新節(jié)點就會開始與其它節(jié)點進行通信影晓。
  • ping:每個節(jié)點都會頻繁給其它節(jié)點發(fā)送 ping镰吵,其中包含自己的狀態(tài)還有自己維護的集群元數(shù)據(jù),互相通過 ping 交換元數(shù)據(jù)挂签。
  • pong:返回 ping 和 meeet疤祭,包含自己的狀態(tài)和其它信息,也用于信息廣播和更新饵婆。
  • fail:某個節(jié)點判斷另一個節(jié)點 fail 之后勺馆,就發(fā)送 fail 給其它節(jié)點,通知其它節(jié)點說侨核,某個節(jié)點宕機

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

槽是 Redis 集群管理數(shù)據(jù)的基本單位
redis cluster 有固定的 16384 個 hash slot草穆,對每個 key 計算 CRC16 值,然后對 16384 取模搓译,可以獲取 key 對應(yīng)的 hash slot悲柱,利用鏈表解決哈希沖突
公式:HASH_SLOT = CRC16(key) mod 16384

redis cluster 中每個 master 都會持有部分 slot,比如有 3 個 master些己,那么可能每個 master 持有 5000 多個 hash slot豌鸡。hash slot 讓 node 的增加和移除很簡單,增加一個 master段标,就將其他 master 的 hash slot 移動部分過去涯冠,減少一個 master,就將它的 hash slot 移動到其他 master 上去怀樟。移動 hash slot 的成本是非常低的功偿。

每個集群節(jié)點維護著一個16384 bit (2KB)的位數(shù)組盆佣,每個bit對應(yīng)相同編號的槽往堡,用 0 / 1標識對于某個槽自己是否擁有
集群節(jié)點同時還維護著槽到集群節(jié)點的映射械荷,是由長度為16384,數(shù)組下標代表槽編號虑灰,值為節(jié)點信息的數(shù)組
作者之所以設(shè)計16384個槽位吨瞎,主要原因就是集群節(jié)點間每次ping都需要發(fā)送自己2KB的槽位數(shù)組,設(shè)置的槽位太大會增加傳輸消耗

hash tag

默認情況下穆咐,key在哪個slot上由key進行哈希后的結(jié)果決定颤诀,但有的時候我們希望把同一批相關(guān)的key存放到同一個slot上,提升性能與保證原子性对湃,這時就可以利用hash tag崖叫。

假設(shè)一個key是9999:order,表示用戶ID為9999的訂單信息拍柒,只需要用{}將key中我們需要進行哈希計算那部分包起來心傀,即{9999}:order;另外其他的{9999}:user同樣可以這樣操作
這樣就將同一個用戶的所有相關(guān)信息都放到了同一個哈希槽中

高可用

  • 判斷節(jié)點宕機:如果一個節(jié)點認為某個節(jié)點 pfail 了拆讯,那么會在 gossip ping 消息中脂男,ping 給其他節(jié)點,如果超過半數(shù)的節(jié)點都認為 pfail 了种呐,那么就會變成 fail
  • 從節(jié)點選舉:每個從節(jié)點宰翅,都根據(jù)自己對 master 復(fù)制數(shù)據(jù)的 offset,來設(shè)置一個選舉時間爽室,offset 越大(復(fù)制數(shù)據(jù)越多)的從節(jié)點汁讼,選舉時間越靠前,優(yōu)先進行選舉肮之。所有的 master node 開始 slave 選舉投票掉缺,給要進行選舉的 slave 進行投票,如果大部分 master node(N/2 + 1)都投票給了某個從節(jié)點戈擒,那么選舉通過眶明,那個從節(jié)點可以切換成 master。
    從節(jié)點執(zhí)行主備切換筐高,從節(jié)點切換為主節(jié)點搜囱。

集群客戶端

基于重定向的客戶端,很消耗網(wǎng)絡(luò)IO柑土,因為大部分情況下蜀肘,可能都會出現(xiàn)一次請求重定向,才能找到正確的節(jié)點稽屏。
JedisCluster初始化時會隨機選擇一個節(jié)點獲取集群元數(shù)據(jù)扮宠,初始化hash slot對應(yīng)jedisPool的Map映射表,后續(xù)的操作如下狐榔,無需通過集群的重定向來執(zhí)行命令:

  • 把key作為參數(shù)坛增,執(zhí)行CRC16算法获雕,獲取key對應(yīng)的slot值
  • 通過該slot值,去slots的map集合中獲取jedisPool實例
  • 通過jedisPool實例獲取jedis實例收捣,最終完成redis數(shù)據(jù)存取工作
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末届案,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子罢艾,更是在濱河造成了極大的恐慌楣颠,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咐蚯,死亡現(xiàn)場離奇詭異童漩,居然都是意外死亡,警方通過查閱死者的電腦和手機春锋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門睁冬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人看疙,你說我怎么就攤上這事豆拨。” “怎么了能庆?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵施禾,是天一觀的道長。 經(jīng)常有香客問我搁胆,道長弥搞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任渠旁,我火速辦了婚禮攀例,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘顾腊。我一直安慰自己粤铭,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布杂靶。 她就那樣靜靜地躺著梆惯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吗垮。 梳的紋絲不亂的頭發(fā)上垛吗,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音烁登,去河邊找鬼怯屉。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的锨络。 我是一名探鬼主播蝗敢,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼足删!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锁右,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤失受,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后咏瑟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拂到,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年码泞,在試婚紗的時候發(fā)現(xiàn)自己被綠了兄旬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡余寥,死狀恐怖领铐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宋舷,我是刑警寧澤绪撵,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站祝蝠,受9級特大地震影響音诈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绎狭,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一细溅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧儡嘶,春花似錦喇聊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鸥咖,卻和暖如春燕鸽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背啼辣。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工啊研, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓党远,卻偏偏與公主長得像削解,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子沟娱,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容