Redis集群(二)發(fā)送命令和故障轉(zhuǎn)移

發(fā)送命令

在上一篇文章中,已經(jīng)將16384個(gè)槽都進(jìn)行了指派之后,集群已經(jīng)進(jìn)入上線狀態(tài)

127.0.0.1:7000> cluster info
// 集群狀態(tài):OK表示上線
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:3
cluster_size:3
cluster_current_epoch:3
cluster_my_epoch:1
···

現(xiàn)在客戶端就可以向集群中的節(jié)點(diǎn)發(fā)送命令了。

當(dāng)客戶端向節(jié)點(diǎn)發(fā)送與數(shù)據(jù)庫(kù)鍵有關(guān)的命令時(shí)回铛,接收命令的節(jié)點(diǎn)會(huì)計(jì)算出命令要處理的數(shù)據(jù)庫(kù)鍵屬于哪個(gè)槽,并檢查這個(gè)槽是否指派給了自己:

  • 如果鍵所在的槽剛好指派給當(dāng)前節(jié)點(diǎn)克锣,那么節(jié)點(diǎn)就回直接執(zhí)行這個(gè)命令茵肃。
  • 如果不在當(dāng)前節(jié)點(diǎn),那么節(jié)點(diǎn)會(huì)向客戶端返回一個(gè)MOVED錯(cuò)誤袭祟,指引客戶端轉(zhuǎn)向(redirect)至正確的節(jié)點(diǎn)验残,并再次發(fā)送之前想要執(zhí)行的命令。

計(jì)算鍵屬于哪個(gè)槽

CLUSTER KEYSLOT <key>

127.0.0.1:7000> cluster keyslot "date"
(integer) 2022

說明"date"鍵會(huì)分配在2022這個(gè)槽巾乳。

當(dāng)節(jié)點(diǎn)計(jì)算出鍵所屬的槽i后您没,節(jié)點(diǎn)就回檢查自己在clusterState.slots數(shù)組中的項(xiàng)i,判斷鍵是否由自己負(fù)責(zé)胆绊。

MOVED錯(cuò)誤

當(dāng)節(jié)點(diǎn)發(fā)現(xiàn)鍵所在的槽并非自己負(fù)責(zé)處理的時(shí)候氨鹏,節(jié)點(diǎn)就會(huì)向客戶端返回一個(gè)MOVED錯(cuò)誤,指引客戶端轉(zhuǎn)向至正在負(fù)責(zé)槽的節(jié)點(diǎn)压状。

節(jié)點(diǎn)數(shù)據(jù)庫(kù)的實(shí)現(xiàn)

集群節(jié)點(diǎn)保存鍵值對(duì)以及鍵值對(duì)過期時(shí)間的方式與單機(jī)Redis服務(wù)器一樣仆抵,它們兩者只有一個(gè)區(qū)別,節(jié)點(diǎn)只能使用0號(hào)數(shù)據(jù)庫(kù),而單機(jī)Redis服務(wù)器沒有這一限制镣丑。

重新分片

Redis集群的重新分片操作可以將任意數(shù)量已經(jīng)指派給某個(gè)節(jié)點(diǎn)(源節(jié)點(diǎn))的槽改為指派給另一個(gè)節(jié)點(diǎn)(目標(biāo)節(jié)點(diǎn))舔糖,并且相關(guān)槽所屬的鍵值對(duì)也會(huì)從源節(jié)點(diǎn)被移動(dòng)到目標(biāo)節(jié)點(diǎn)。

在重新分片過程莺匠,集群不需要下線金吗,并且源節(jié)點(diǎn)和目標(biāo)節(jié)點(diǎn)都可以繼續(xù)進(jìn)行命令請(qǐng)求。

這時(shí)需要Redis的集群管理軟件redis-trib負(fù)責(zé)執(zhí)行慨蛙,Redis提供了進(jìn)行重新分片所需的所有命令,而redis-trib則通過向源節(jié)點(diǎn)和目標(biāo)節(jié)點(diǎn)發(fā)送命令來(lái)進(jìn)行重新分片操作纪挎。

[圖片上傳失敗...(image-e2a2ef-1534470023589)]

ASK錯(cuò)誤

在進(jìn)行重新分片過程中期贫,源節(jié)點(diǎn)向目標(biāo)節(jié)點(diǎn)遷移一個(gè)槽的過程中,可能會(huì)出現(xiàn)這種情況:屬于被遷移槽的一部分鍵值對(duì)保存在源節(jié)點(diǎn)里面异袄,而另一部分鍵值對(duì)則保存在目標(biāo)節(jié)點(diǎn)里面通砍。

當(dāng)客戶端向源節(jié)點(diǎn)發(fā)送一個(gè)與數(shù)據(jù)庫(kù)鍵有關(guān)的命令,并且命令要處理的數(shù)據(jù)庫(kù)鍵就在正在被遷移的槽時(shí):

  • 源節(jié)點(diǎn)會(huì)先在自己的數(shù)據(jù)庫(kù)里面查找指定的鍵烤蜕,如果找到就回執(zhí)行命令
  • 相反地封孙,沒有找到,這個(gè)鍵可能被遷移到目標(biāo)節(jié)點(diǎn)讽营,源節(jié)點(diǎn)將想客戶端返回一個(gè)ASK錯(cuò)誤虎忌,指引客戶端轉(zhuǎn)向正在導(dǎo)入槽的目標(biāo)節(jié)點(diǎn),并再次發(fā)送之前想要執(zhí)行的命令橱鹏。

ASK錯(cuò)誤和MOVED錯(cuò)誤的區(qū)別:

  • MOVED錯(cuò)誤代表槽的負(fù)責(zé)權(quán)已經(jīng)從一個(gè)節(jié)點(diǎn)轉(zhuǎn)移到了另一個(gè)節(jié)點(diǎn):在客戶端收到關(guān)于槽i的MOVED錯(cuò)誤之后膜蠢,客戶端每次遇到關(guān)于槽i的命令請(qǐng)求時(shí),都可以直接將命令請(qǐng)求發(fā)送至MOVED錯(cuò)誤所指向的節(jié)點(diǎn)莉兰,因?yàn)樵摴?jié)點(diǎn)就是目前負(fù)責(zé)槽i的節(jié)點(diǎn)挑围。

  • ASK錯(cuò)誤只是兩個(gè)節(jié)點(diǎn)在遷移槽的過程中使用的一種臨時(shí)措施:在客戶端收到槽i的ASK錯(cuò)誤之后,客戶端只會(huì)在接下來(lái)的一次命令請(qǐng)求中將關(guān)于槽i的命令請(qǐng)求發(fā)送至ASK錯(cuò)誤所指示的節(jié)點(diǎn)糖荒,但這種轉(zhuǎn)向不會(huì)對(duì)客戶端今后發(fā)送關(guān)于槽i的命令請(qǐng)求產(chǎn)生任何影響杉辙,客戶端仍然會(huì)將關(guān)于槽i的命令請(qǐng)求發(fā)送至目前負(fù)責(zé)處理槽i的節(jié)點(diǎn),除非ASK錯(cuò)誤再次出現(xiàn)


復(fù)制與故障轉(zhuǎn)移

Redis集群中的節(jié)點(diǎn)分為主節(jié)點(diǎn)(Master)和從節(jié)點(diǎn)(slave)捶朵,其中主節(jié)點(diǎn)負(fù)責(zé)處理槽蜘矢,而從節(jié)點(diǎn)則用于負(fù)責(zé)某個(gè)主節(jié)點(diǎn),并在被復(fù)制的主節(jié)點(diǎn)下線時(shí)综看,代替下線主節(jié)點(diǎn)繼續(xù)處理命令請(qǐng)求硼端。

個(gè)人感覺與單機(jī)版時(shí)的主從配置很相似,多了一步寓搬,就是主節(jié)點(diǎn)掛了之后珍昨,從節(jié)點(diǎn)繼承負(fù)責(zé)處理槽的職責(zé)。

集群中設(shè)置從節(jié)點(diǎn)

CLUSTER REPLICATE <node_id>

可以讓接收命令的節(jié)點(diǎn)成為node_id所指定節(jié)點(diǎn)的從節(jié)點(diǎn),并開始對(duì)主機(jī)進(jìn)行復(fù)制镣典。

故障檢測(cè)

集群中每個(gè)節(jié)點(diǎn)都會(huì)定期地想幾區(qū)中的其他節(jié)點(diǎn)發(fā)送PING消息兔毙,以此來(lái)檢測(cè)對(duì)方是否在線,如果接收PING消息的節(jié)點(diǎn)沒有在規(guī)定時(shí)間內(nèi)回復(fù)PONG消息兄春,那么發(fā)送PING消息的節(jié)點(diǎn)就會(huì)將接收PING消息的節(jié)點(diǎn)標(biāo)記為疑似下線(probable fail, PFAIL)澎剥。

在一個(gè)集群中,超過半數(shù)以上負(fù)責(zé)處理槽的主節(jié)點(diǎn)都將這個(gè)主節(jié)點(diǎn)x報(bào)告為疑似下線赶舆,那么這個(gè)主節(jié)點(diǎn)x將被標(biāo)記為以下線(FAIL)哑姚,并向集群廣播一條關(guān)于主節(jié)點(diǎn)x的FAIL消息

故障轉(zhuǎn)移

主節(jié)點(diǎn)下線后芜茵,從節(jié)點(diǎn)將開始對(duì)下線主節(jié)點(diǎn)進(jìn)行故障轉(zhuǎn)移叙量,有以下幾個(gè)步驟:

  • 從從節(jié)點(diǎn)中選出新的主節(jié)點(diǎn)
  • 被選中的從節(jié)點(diǎn)會(huì)執(zhí)行SLAVEOF no one命令,成為新的主節(jié)點(diǎn)
  • 新的主節(jié)點(diǎn)會(huì)撤銷所有對(duì)已下線主節(jié)點(diǎn)的槽指派九串,并將這些槽全部指派給自己
  • 新的主節(jié)點(diǎn)像集群廣播PONG消息绞佩,讓其它節(jié)點(diǎn)了解這個(gè)節(jié)點(diǎn)已經(jīng)成為新的主節(jié)點(diǎn),接管原本已下線節(jié)點(diǎn)負(fù)責(zé)處理的槽
  • 新的主節(jié)點(diǎn)開始接受和自己負(fù)責(zé)處理的槽有關(guān)的命令請(qǐng)求猪钮,故障轉(zhuǎn)移完成品山。

小結(jié):Redis集群的坑只填了一點(diǎn),還有關(guān)于Redis消息的沒填烤低,這個(gè)先留著吧肘交,先去寫論文。之后開始擼NIO還是SPRING呢扑馁,日常糾結(jié)??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末酸些,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子檐蚜,更是在濱河造成了極大的恐慌魄懂,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闯第,死亡現(xiàn)場(chǎng)離奇詭異市栗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)咳短,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門填帽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人咙好,你說我怎么就攤上這事篡腌。” “怎么了勾效?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵嘹悼,是天一觀的道長(zhǎng)叛甫。 經(jīng)常有香客問我,道長(zhǎng)杨伙,這世上最難降的妖魔是什么其监? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮限匣,結(jié)果婚禮上抖苦,老公的妹妹穿的比我還像新娘。我一直安慰自己米死,他們只是感情好锌历,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著峦筒,像睡著了一般究西。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勘天,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天怔揩,我揣著相機(jī)與錄音捉邢,去河邊找鬼脯丝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛伏伐,可吹牛的內(nèi)容都是我干的宠进。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼藐翎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼材蹬!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起吝镣,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤堤器,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后末贾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闸溃,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年拱撵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辉川。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拴测,死狀恐怖乓旗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情集索,我是刑警寧澤屿愚,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布汇跨,位于F島的核電站,受9級(jí)特大地震影響渺鹦,放射性物質(zhì)發(fā)生泄漏扰法。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一毅厚、第九天 我趴在偏房一處隱蔽的房頂上張望塞颁。 院中可真熱鬧,春花似錦吸耿、人聲如沸祠锣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)伴网。三九已至,卻和暖如春妆棒,著一層夾襖步出監(jiān)牢的瞬間澡腾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工糕珊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留动分,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓红选,卻偏偏與公主長(zhǎng)得像澜公,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喇肋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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

  • 本文檔翻譯自 http://redis.io/topics/cluster-tutorial 坟乾。 本文檔是 Red...
    會(huì)跳舞的機(jī)器人閱讀 66,921評(píng)論 2 21
  • Redis Cluster Specification 1 設(shè)計(jì)目標(biāo)和理由 1.1 Redis Cluster g...
    近路閱讀 4,230評(píng)論 0 12
  • 前言 Redis 是我們目前大規(guī)模使用的緩存中間件,由于它強(qiáng)大高效而又便捷的功能蝶防,得到了廣泛的使用甚侣。單節(jié)點(diǎn)的Red...
    Kevin_ZGJ閱讀 11,673評(píng)論 19 133
  • 2017年的夏夜,讀完一首長(zhǎng)詩(shī)忽然提筆也想自己寫一首间学,左右斟酌殷费,也不知該寫點(diǎn)什么好。說實(shí)話菱鸥,我真的算是一個(gè)文筆很差...
    寫無(wú)聊的話閱讀 206評(píng)論 0 0
  • 下了一整夜的暴雨後的清晨宗兼,天氣好的不像樣子,湛藍(lán)的天空漂過幾朵雲(yún)彩氮采,拉開窗簾殷绍,慵懶的陽(yáng)光暖暖的灑進(jìn)屋子? 但我卻很...
    CHENGSRISY閱讀 297評(píng)論 0 0