016.Redis Cluster通信原理

1. 通信流程

分布式系統(tǒng)元數(shù)據(jù)存儲的兩種方案

  • 集中式存儲,典型產品:Zookeeper
  • 優(yōu)勢:更新效率快
  • 劣勢:所有的元數(shù)據(jù)信息集中在一個外部系統(tǒng)中粱玲,這個外部系統(tǒng)的壓力很大
  • 使用Gossip協(xié)議進行通信

  • 優(yōu)勢:減少了元數(shù)據(jù)存儲壓力

  • 劣勢:元數(shù)據(jù)更新有延遲,需等待全部master的元數(shù)據(jù)達成一致

    每個master都會自己維護一份完整的元數(shù)據(jù)信息备籽,只要自己的元數(shù)據(jù)有變化绸硕,就會發(fā)送消息給其他master钠署,通過master之間的兩兩通信來保持元數(shù)據(jù)一致

Redis Cluster采用P2P的Gossip協(xié)議進行通信勾怒,節(jié)點之間不斷的交換信息婆排,這些信息包括節(jié)點負責哪些slot、是否出現(xiàn)故障等信息

  • 集群中的每個節(jié)點都會單獨開通一個TCP通道笔链,用于節(jié)點之間彼此通信段只,通信端口號為基礎端口號+10000,例如10.0.0.100:6379的通信端口號為16379
  • 每個節(jié)點在固定周期內通過特定規(guī)則選擇幾個節(jié)點發(fā)送ping消息
  • 接收到ping消息的節(jié)點用pong消息作為響應

集群中的每個節(jié)點通過一定的規(guī)則挑選要通信的節(jié)點鉴扫,每個節(jié)點可能知道其他全部節(jié)點赞枕,也可能僅知道部分節(jié)點,只要這些節(jié)點之間可以正常通信坪创,最終它們會達到一致狀態(tài)炕婶,當節(jié)點出現(xiàn)故障、新節(jié)點加入误堡、主從角色變化古话、slot信息變更等事件發(fā)生時,通過不斷的ping/pong消息通信锁施,經過一段時間后所有的節(jié)點都會知道整個集群全部節(jié)點的最新狀態(tài),從而達到集群狀態(tài)同步的目的杖们。

2. Gossip消息

Gossip消息類型

Gossip協(xié)議的主要職責就是信息交換悉抵。信息交換的載體就是節(jié)點彼此發(fā)送的Gossip消息,常用的Gossip消息可分為:ping消息摘完、pong消息姥饰、meet消息、fail消息等孝治。

  • meet消息:用于通知新節(jié)點加入列粪。消息發(fā)送者通知接收者加入到當前集群审磁,meet消息通信正常完成后,接收節(jié)點會加入到集群中并進行周期性的ping岂座、pong消息交換态蒂。
  • ping消息:集群內交換最頻繁的消息,集群內每個節(jié)點每秒向多個其他節(jié)點發(fā)送ping消息费什,用于檢測節(jié)點是否在線和交換彼此狀態(tài)信息钾恢。ping消息發(fā)送封裝了自身節(jié)點和部分其他節(jié)點的狀態(tài)數(shù)據(jù)。
  • pong消息:當接收到ping鸳址、meet消息時瘩蚪,作為響應消息回復給發(fā)送方確認消息正常通信。pong消息內部封裝了自身狀態(tài)數(shù)據(jù)稿黍。節(jié)點也可以向集群內廣播自身的pong消息來通知整個集群對自身狀態(tài)進行更新疹瘦。
  • fail消息:當節(jié)點判定集群內另一個節(jié)點下線時,會向集群內廣播一個fail消息巡球,其他節(jié)點接收到fail消息之后把對應節(jié)點更新為下線狀態(tài)言沐。

Gossip消息中的包含的信息

一個Gossip的消息頭中包含的信息:

  • 消息總長度
  • 協(xié)議版本
  • 消息類型,用于區(qū)分是meet辕漂、ping呢灶、pong等消息
  • 當前發(fā)送消息的節(jié)點的配置版本
  • 主/從節(jié)點的配置版本
  • 復制偏移量
  • 發(fā)送節(jié)點的nodeId
  • 發(fā)送節(jié)點負責的slot信息
  • 如果發(fā)送節(jié)點是slave,那么還包括對應的master的nodeId
  • 端口號
  • 集群狀態(tài)
  • 節(jié)點標識(主從角色/是否下線等)

消息體包含的信息:

  • 目標節(jié)點的nodeId
  • 最后一次向目標節(jié)點發(fā)送ping消息的時間
  • 最后一次接收目標節(jié)點的pong消息時間
  • 目標節(jié)點的IP和port
  • 目標節(jié)點的標識(主從角色/是否下線等)

一個節(jié)點處理ping/meet消息的流程

  • 解析消息頭钉嘹,消息頭包含了發(fā)送節(jié)點的信息

    • 如果發(fā)送節(jié)點是新節(jié)點且消息是meet類型鸯乃,則加入到本地節(jié)點列表

    • 如果是已知節(jié)點,則嘗試更新發(fā)送節(jié)點的狀態(tài)跋涣,如槽映射關系缨睡、主從角色等狀態(tài)

  • 解析消息體

    • 如果消息體內包含的節(jié)點是新節(jié)點,則嘗試發(fā)起與新節(jié)點的meet握手流程

    • 如果是已知節(jié)點陈辱,則根據(jù)消息體中的目標節(jié)點的標識判斷該節(jié)點是否下線奖年,用于故障轉移

  • 消息處理完后回復pong消息,內容同樣包含消息頭和消息體沛贪,發(fā)送節(jié)點接收到回復的pong消息后陋守,采用類似的流程解析處理消息并更新與接收節(jié)點最后通信時間,完成一次消息通信

3. 節(jié)點選擇

雖然Gossip協(xié)議的信息交換機制具有天然的分布式特性利赋,但它是有成本的水评。由于內部需要頻繁地進行節(jié)點信息交換,而ping/pong消息會攜帶當前節(jié)點和部分其他節(jié)點的狀態(tài)數(shù)據(jù)媚送,勢必會加重帶寬和計算的負擔中燥。Redis集群內節(jié)點通信采用固定頻率(定時任務每秒執(zhí)行10次)。因此節(jié)點每次選擇需要通信的節(jié)點列表變得非常重要塘偎。通信節(jié)點選擇過多雖然可以做到信息及時交換但成本過高疗涉。節(jié)點選擇過少會降低集群內所有節(jié)點彼此信息交換頻率拿霉,從而影響故障判定、新節(jié)點發(fā)現(xiàn)等需求的速度咱扣。因此Redis集群的Gossip協(xié)議需要兼顧信息交換實時性和成本開銷绽淘,通信節(jié)點選擇的規(guī)則如下:

選擇發(fā)送消息的節(jié)點數(shù)量

  • 每秒會隨機選取5個節(jié)點,找出其中最久沒有通信的節(jié)點發(fā)送ping消息偏窝,用于保證Gossip信息交換的隨機性
  • 每100毫秒都會掃描本地節(jié)點列表收恢,如果發(fā)現(xiàn)節(jié)點最近一次接受pong消息的時間大于cluster_node_timeout/2,則立刻發(fā)送ping消息祭往,防止該節(jié)點信息太長時間未更新
  • 根據(jù)以上規(guī)則得出每個節(jié)點每秒需要發(fā)送ping消息的數(shù)量=1+10*num(node.pong_received>cluster_node_timeout/2)伦意,因此cluster_node_timeout參數(shù)對消息發(fā)送的節(jié)點數(shù)量影響非常大
  • 當我們的帶寬資源緊張時,可以適當調大這個參數(shù)硼补,如從默認15秒改為30秒來降低帶寬占用率驮肉。
  • 過度調大cluster_node_timeout會影響消息交換的頻率從而影響故障轉移、槽信息更新已骇、新節(jié)點發(fā)現(xiàn)的速度离钝,因此需要根據(jù)業(yè)務容忍度和資源消耗進行平衡。
  • 整個集群消息總交換量也跟節(jié)點數(shù)成正比褪储,所以并非redis cluster的節(jié)點越多卵渴,其性能越好,隨著節(jié)點數(shù)的增多鲤竹,交換元數(shù)據(jù)的消耗也會加大

cluster_node_timeout

真實世界的機房網絡往往并不是風平浪靜的浪读,它們經常會發(fā)生各種各樣的小問題。比如網絡抖動就是非常常見的一種現(xiàn)象辛藻,突然之間部分連接變得不可訪問碘橘,然后很快又恢復正常。為解決這種問題吱肌,Redis Cluster 提供了一個配置選項cluster-node-timeout 痘拆,表示當某個節(jié)點持續(xù) timeout 的時間失時,才可以認定該節(jié)點出現(xiàn)故障氮墨,需要進行主從切換纺蛆。如果沒有這個選項,網絡抖動會導致主從頻繁切換 (數(shù)據(jù)的重新復制)规揪。

每個從節(jié)點都要檢查最后與主節(jié)點斷線時間犹撒,判斷是否有資格替換故障的主節(jié)點。如果從節(jié)點與主節(jié)點斷線時間超過cluster-node-time*cluster-slave-validity-factor粒褒,則當前從節(jié)點不具備故障轉移資格,cluster-slave-validity-factor設置為0代表任何slave都可以被轉換為master

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末诚镰,一起剝皮案震驚了整個濱河市奕坟,隨后出現(xiàn)的幾起案子祥款,更是在濱河造成了極大的恐慌,老刑警劉巖月杉,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刃跛,死亡現(xiàn)場離奇詭異,居然都是意外死亡苛萎,警方通過查閱死者的電腦和手機桨昙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腌歉,“玉大人蛙酪,你說我怎么就攤上這事∏谈牵” “怎么了桂塞?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長馍驯。 經常有香客問我阁危,道長,這世上最難降的妖魔是什么汰瘫? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任狂打,我火速辦了婚禮,結果婚禮上混弥,老公的妹妹穿的比我還像新娘趴乡。我一直安慰自己,他們只是感情好剑逃,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布浙宜。 她就那樣靜靜地躺著,像睡著了一般蛹磺。 火紅的嫁衣襯著肌膚如雪粟瞬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天萤捆,我揣著相機與錄音裙品,去河邊找鬼。 笑死俗或,一個胖子當著我的面吹牛市怎,可吹牛的內容都是我干的。 我是一名探鬼主播辛慰,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼区匠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起驰弄,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤麻汰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后戚篙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體五鲫,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年岔擂,在試婚紗的時候發(fā)現(xiàn)自己被綠了位喂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡乱灵,死狀恐怖塑崖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情阔蛉,我是刑警寧澤弃舒,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站状原,受9級特大地震影響聋呢,放射性物質發(fā)生泄漏。R本人自食惡果不足惜颠区,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一削锰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毕莱,春花似錦器贩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至部服,卻和暖如春唆姐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背廓八。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工奉芦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剧蹂。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓声功,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宠叼。 傳聞我的和親對象是個殘疾皇子先巴,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容

  • Redis Cluster Redis Cluster是Redis官方在Redis 3.0版本正式推出的高可用以及...
    Springlin閱讀 3,773評論 1 5
  • Redis Cluster原理分析 文章較長,如需轉載可分段。轉載請標明作者以及文章來源筹裕,謝謝醋闭! 作者介紹 姓名:...
    lihanglucien閱讀 20,427評論 3 30
  • 節(jié)點通信 通信流程在分布式存儲中需要提供維護節(jié)點元數(shù)據(jù)信息的機制,所謂元數(shù)據(jù)是指:節(jié)點負責那些數(shù)據(jù)乐埠,是否出現(xiàn)故障等...
    linuxzw閱讀 558評論 0 3
  • 基本目標與設計基本思想 Redis cluster 目標 高性能抗斤,并且能線性擴展到1000個節(jié)點。不需要代理丈咐,使用...
    tafeng閱讀 2,759評論 0 0
  • 大家好瑞眼,我是IT修真院北京分院第31期的學員,一枚正直純潔善良的JAVA程序員棵逊。今天給大家分享一下伤疙,Redis集群...
    ve追風_685b閱讀 926評論 0 0