redis的哨兵模式和集群模式

哨兵模式

哨兵模式是redis高可用的實現(xiàn)方式之一
使用一個或者多個哨兵(Sentinel)實例組成的系統(tǒng)软族,對redis節(jié)點進行監(jiān)控,在主節(jié)點出現(xiàn)故障的情況下立砸,能將從節(jié)點中的一個升級為主節(jié)點,進行故障轉(zhuǎn)義颗祝,保證系統(tǒng)的可用性。

redis哨兵模式.png

哨兵們是怎么感知整個系統(tǒng)中的所有節(jié)點(主節(jié)點/從節(jié)點/哨兵節(jié)點)的

  1. 首先主節(jié)點的信息是配置在哨兵(Sentinel)的配置文件中
  2. 哨兵節(jié)點會和配置的主節(jié)點建立起兩條連接命令連接訂閱連接
  3. 哨兵會通過命令連接每10s發(fā)送一次INFO命令搁宾,通過INFO命令盖腿,主節(jié)點會返回自己的run_id和自己的從節(jié)點信息
  4. 哨兵會對這些從節(jié)點也建立兩條連接命令連接訂閱連接
  5. 哨兵通過命令連接向從節(jié)點發(fā)送INFO命令,獲取到他的一些信息
    a. run_id
    b. role
    c. 從服務(wù)器的復制偏移量 offset
    d. 等
  6. 因為哨兵對與集群中的其他節(jié)點(主從節(jié)點)當前都有兩條連接鸟款,命令連接訂閱連接
    a. 通過命令連接向服務(wù)器的_sentinel:hello頻道發(fā)送一條消息茂卦,內(nèi)容包括自己的ip端口、run_id疙筹、配置紀元(后續(xù)投票的時候會用到)等
    b. 通過訂閱連接對服務(wù)器的_sentinel:hello頻道做了監(jiān)聽而咆,所以所有的向該頻道發(fā)送的哨兵的消息都能被接受到
    c. 解析監(jiān)聽到的消息幕袱,進行分析提取,就可以知道還有那些別的哨兵服務(wù)節(jié)點也在監(jiān)聽這些主從節(jié)點了涯捻,更新結(jié)構(gòu)體將這些哨兵節(jié)點記錄下來
    d. 向觀察到的其他的哨兵節(jié)點建立命令連接----沒有訂閱連接

哨兵模式下的故障遷移

主觀下線

哨兵(Sentinel)節(jié)點會每秒一次的頻率向建立了命令連接的實例發(fā)送PING命令障癌,如果在down-after-milliseconds毫秒內(nèi)沒有做出有效響應(yīng)包括(PONG/LOADING/MASTERDOWN)以外的響應(yīng)辩尊,哨兵就會將該實例在本結(jié)構(gòu)體中的狀態(tài)標記為SRI_S_DOWN主觀下線

客觀下線

當一個哨兵節(jié)點發(fā)現(xiàn)主節(jié)點處于主觀下線狀態(tài)是摄欲,會向其他的哨兵節(jié)點發(fā)出詢問,該節(jié)點是不是已經(jīng)主觀下線了我注。如果超過配置參數(shù)quorum個節(jié)點認為是主觀下線時但骨,該哨兵節(jié)點就會將自己維護的結(jié)構(gòu)體中該主節(jié)點標記為SRI_O_DOWN客觀下線
詢問命令SENTINEL is-master-down-by-addr <ip> <port> <current_epoch> <run_id>

參數(shù) 意義
ip/port 當前認為下線的主節(jié)點的ip和端口
current_epoch 配置紀元
run_id *標識僅用于詢問是否下線
有值標識該哨兵節(jié)點希望對方將自己設(shè)置為leader
詢問時用*玻淑,選舉時用run_id
leader選舉

在認為主節(jié)點客觀下線的情況下,哨兵節(jié)點節(jié)點間會發(fā)起一次選舉补履,命令還是上面的命令SENTINEL is-master-down-by-addr <ip> <port> <current_epoch> <run_id>,只是run_id這次會將自己的run_id帶進去,希望接受者將自己設(shè)置為主節(jié)點贬蛙。如果超過半數(shù)以上的節(jié)點返回將該節(jié)點標記為leader的情況下,會有該leader對故障進行遷移

故障遷移
  1. 在從節(jié)點中挑選出新的主節(jié)點
    a. 通訊正常
    b. 優(yōu)先級排序
    c. 優(yōu)先級相同是選擇offset最大的
  2. 將該節(jié)點設(shè)置成新的主節(jié)點 SLAVEOF no one,并確保在后續(xù)的INGO命令時氛堕,該節(jié)點返回狀態(tài)為master
  3. 將其他的從節(jié)點設(shè)置成從新的主節(jié)點復制, SLAVEOF命令
  4. 將舊的主節(jié)點變成新的主節(jié)點的從節(jié)點

優(yōu)缺點

  • 優(yōu)點
    高可用野蝇,在主節(jié)點故障時能實現(xiàn)故障的轉(zhuǎn)移
  • 缺點:好像沒辦法做到水平拓展绕沈,如果內(nèi)容很大的情況下

集群模式

官方提供的分布式方案(槽指派/重新分片/故障轉(zhuǎn)移)
集群內(nèi)的節(jié)點,都會有個數(shù)據(jù)結(jié)構(gòu)存儲整個集群內(nèi)的節(jié)點信息

//整體
struct clusterState{
  clusterNode *mySelf;
  ....
  dict *nodes;  //集群內(nèi)的所有節(jié)點
}

// 單個節(jié)點
struct clusterNode {
  char name[];
  char ip[];
  int port;
  clusterLink *link;  //保存節(jié)點間赠摇,連接的信息
  int flags;    //狀態(tài)標記
}

//節(jié)點間連接的信息
struct clusterLink{
  mstime_t ctime;  //創(chuàng)建時間
  int fd; //tcp套接字描述符
  sds sndbuf;  // 輸出緩存區(qū)
  sds rcvbuf;  //輸入緩存區(qū)
  struct clusterNode *node;
}

redis集群結(jié)構(gòu)體.jpg

槽指派

redis集群可以被分為16384個槽藕帜,只有這些槽全被指派了處理的節(jié)點的情況下惜傲,集群的狀態(tài)才能是上線狀態(tài)(ok)
操作redis集群的時候,將key作為參數(shù)收津,就可以計算出對應(yīng)的處理槽上浊伙,所以存儲等操作都應(yīng)該在該槽對應(yīng)的節(jié)點上嚣鄙。通過這種方式,可以完美的實現(xiàn)集群存儲的水平拓展哑子。

def slot_number(key):
  return CRC16(key) & 16383
//得到的結(jié)果就是槽的序號

槽指派的信息是怎么存儲的

struct clusterState{
  clusterNode *slots[16384]
 }

struct clusterNode{
  unsigned char slots[16384/8]
}

通過上面兩個結(jié)構(gòu)體中的定義可以看出卧蜓,槽指派的信息是分了兩種方式,保存在結(jié)構(gòu)體里面榨惠。


方式一.png

方式二.png

分兩種存儲的好處
1. 如果需要判斷某一個節(jié)點負責的槽赠橙,只需要獲取方式二中的數(shù)組做判斷就可以
2.如果找某個槽是哪個節(jié)點負責期揪,只需要獲取方式一的列表,一查就知道

重新分片

將已經(jīng)指派給節(jié)點的槽姓建,重新執(zhí)行新的節(jié)點缤苫。


redis重新分片過程中可能遇到的問題.jpg

故障轉(zhuǎn)移

發(fā)現(xiàn)故障節(jié)點
  1. 集群內(nèi)的節(jié)點會向其他節(jié)點發(fā)送PING命令榨馁,檢查是否在線
  2. 如果未能在規(guī)定時間內(nèi)做出PONG響應(yīng)翼虫,則會把對應(yīng)的節(jié)點標記為疑似下線
  3. 集群中一半以上負責處理槽的主節(jié)點都將主節(jié)點X標記為疑似下線的話屡萤,那么這個主節(jié)點X就會被認為是已下線
  4. 向集群廣播主節(jié)點X已下線,大家收到消息后都會把自己維護的結(jié)構(gòu)體里的主節(jié)點X標記為已下線
從節(jié)點選舉
  1. 當從節(jié)點發(fā)現(xiàn)自己復制的主節(jié)點已下線了,會向集群里面廣播一條消息招拙,要求所有有投票權(quán)的節(jié)點給自己投票(所有負責處理槽的主節(jié)點都有投票權(quán))
  2. 主節(jié)點會向第一個給他發(fā)選舉消息的從節(jié)點回復支持
  3. 當支持數(shù)量超過N/2+1的情況下别凤,該從節(jié)點當選新的主節(jié)點
故障的遷移
  1. 新當選的從節(jié)點執(zhí)行 SLAVEOF no one,修改成主節(jié)點
  2. 新的主節(jié)點會撤銷所有已下線的老的主節(jié)點的槽指派领虹,指派給自己
  3. 新的主節(jié)點向集群發(fā)送命令塌衰,通知其他節(jié)點自己已經(jīng)變成主節(jié)點了,負責哪些槽指派
  4. 新的主節(jié)點開始處理自己負責的槽的命令

集群模式和哨兵模式的區(qū)別

  1. 哨兵模式監(jiān)控權(quán)交給了哨兵系統(tǒng)最疆,集群模式中是工作節(jié)點自己做監(jiān)控
  2. 哨兵模式發(fā)起選舉是選舉一個leader哨兵節(jié)點來處理故障轉(zhuǎn)移努酸,集群模式是在從節(jié)點中選舉一個新的主節(jié)點,來處理故障的轉(zhuǎn)移
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末层扶,一起剝皮案震驚了整個濱河市镜会,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌戳表,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镣屹,死亡現(xiàn)場離奇詭異女蜈,居然都是意外死亡色瘩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門覆山,熙熙樓的掌柜王于貴愁眉苦臉地迎上來簇宽,“玉大人吧享,你說我怎么就攤上這事〖剩” “怎么了须揣?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵钱豁,是天一觀的道長。 經(jīng)常有香客問我卵酪,道長,這世上最難降的妖魔是什么溢豆? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任漩仙,我火速辦了婚禮犹赖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘麸折。我一直安慰自己垢啼,他們只是感情好,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捌浩,像睡著了一般工秩。 火紅的嫁衣襯著肌膚如雪助币。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天迹栓,我揣著相機與錄音俭缓,去河邊找鬼华坦。 笑死,一個胖子當著我的面吹牛犁跪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坷衍,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼枫耳,長吁一口氣:“原來是場噩夢啊……” “哼嘉涌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起仑最,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤亿胸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后侈玄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體序仙,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年鲁豪,在試婚紗的時候發(fā)現(xiàn)自己被綠了潘悼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡爬橡,死狀恐怖治唤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情糙申,我是刑警寧澤宾添,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站柜裸,受9級特大地震影響缕陕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜榄檬,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一海雪、第九天 我趴在偏房一處隱蔽的房頂上張望奥裸。 院中可真熱鬧湾宙,春花似錦侠鳄、人聲如沸伟恶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽即寒。三九已至母赵,卻和暖如春痊银,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贞绳。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留萎攒,地道東北人耍休。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓斯够,卻偏偏與公主長得像,于是被迫代替她去往敵國和親束亏。 傳聞我的和親對象是個殘疾皇子枪汪,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

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

  • 單機/單點 單點故障/瓶頸:多個節(jié)點負載:面向數(shù)據(jù):一變多(一致性<弱一致,最終一致性>)》可用性最終一致性:一部...
    壹點零閱讀 789評論 0 3
  • 本文將要介紹的哨兵,它基于 Redis 主從復制越庇,主要作用便是解決主節(jié)點故障恢復的自動化問題卤唉,進一步提高系統(tǒng)的高可...
    java成功之路閱讀 2,201評論 0 4
  • 因為Redis擁有諸多優(yōu)秀的特性,使用范圍越來越廣跛蛋,系統(tǒng)對其可用性的依賴也越來越重押框,當前絕大部分系統(tǒng)使用的Redi...
    十毛tenmao閱讀 412評論 0 1
  • 《霍亂時期的愛情》久聞其名卻未真正讀過盒揉。和人一樣预烙,在浩瀚的書海中相遇并認定也是有機緣的吧扁掸。目前通過閱讀電子書和聽書...
    Clearness閱讀 283評論 2 1
  • 前段時間,碰到一個剛學成歸來的海歸牺蹄,談到電商沙兰,她說在英國基本上沒有純電商平臺鼎天,人們網(wǎng)購都是上某品牌的官方網(wǎng)站斋射,直接...
    管理顧問王榮增閱讀 480評論 1 6