Redis集群(一)

Redis 集群概念(一)

本文提取至官網(wǎng)文檔

Redis集群介紹

Redis 集群是一個提供在多個Redis間節(jié)點間共享數(shù)據(jù)的程序集。

Redis集群并不支持處理多個keys的命令,因為這需要在不同的節(jié)點間移動數(shù)據(jù),從而達(dá)不到像Redis那樣的性能,在高負(fù)載的情況下可能會導(dǎo)致不可預(yù)料的錯誤.

Redis 集群通過分區(qū)來提供一定程度的可用性,在實際環(huán)境中當(dāng)某個節(jié)點宕機(jī)或者不可達(dá)的情況下繼續(xù)處理命令. Redis 集群的優(yōu)勢:

  • 自動分割數(shù)據(jù)到不同的節(jié)點上。
  • 整個集群的部分節(jié)點失敗或者不可達(dá)的情況下能夠繼續(xù)處理命令。

Redis 集群的數(shù)據(jù)分片

Redis 集群沒有使用一致性hash, 而是引入了 哈希槽的概念.

Redis 集群有16384個哈希槽,每個key通過CRC16校驗后對16384取模來決定放置哪個槽.集群的每個節(jié)點負(fù)責(zé)一部分hash槽,舉個例子,比如當(dāng)前集群有3個節(jié)點,那么:

  • 節(jié)點 A 包含 0 到 5500號哈希槽.
  • 節(jié)點 B 包含5501 到 11000 號哈希槽.
  • 節(jié)點 C 包含11001 到 16384號哈希槽.

這種結(jié)構(gòu)很容易添加或者刪除節(jié)點. 比如如果我想新添加個節(jié)點D, 我需要從節(jié)點 A, B, C中得部分槽到D上. 如果我想移除節(jié)點A,需要將A中的槽移到B和C節(jié)點上,然后將沒有任何槽的A節(jié)點從集群中移除即可. 由于從一個節(jié)點將哈希槽移動到另一個節(jié)點并不會停止服務(wù),所以無論添加刪除或者改變某個節(jié)點的哈希槽的數(shù)量都不會造成集群不可用的狀態(tài).

Redis 集群的主從復(fù)制模型

為了使在部分節(jié)點失敗或者大部分節(jié)點無法通信的情況下集群仍然可用,所以集群使用了主從復(fù)制模型,每個節(jié)點都會有N-1個復(fù)制品.

在我們例子中具有A,B,C三個節(jié)點的集群,在沒有復(fù)制模型的情況下,如果節(jié)點B失敗了,那么整個集群就會以為缺少5501-11000這個范圍的槽而不可用.

然而如果在集群創(chuàng)建的時候(或者過一段時間)我們?yōu)槊總€節(jié)點添加一個從節(jié)點A1,B1,C1,那么整個集群便有三個master節(jié)點和三個slave節(jié)點組成,這樣在節(jié)點B失敗后,集群便會選舉B1為新的主節(jié)點繼續(xù)服務(wù),整個集群便不會因為槽找不到而不可用了

不過當(dāng)B和B1 都失敗后,集群是不可用的.

Redis 一致性保證

Redis 并不能保證數(shù)據(jù)的強(qiáng)一致性. 這意味這在實際中集群在特定的條件下可能會丟失寫操作.

第一個原因是因為集群是用了異步復(fù)制. 寫操作過程:

  • 客戶端向主節(jié)點B寫入一條命令.
  • 主節(jié)點B向客戶端回復(fù)命令狀態(tài).
  • 主節(jié)點將寫操作復(fù)制給他得從節(jié)點 B1, B2 和 B3.

主節(jié)點對命令的復(fù)制工作發(fā)生在返回命令回復(fù)之后, 因為如果每次處理命令請求都需要等待復(fù)制操作完成的話, 那么主節(jié)點處理命令請求的速度將極大地降低 —— 我們必須在性能和一致性之間做出權(quán)衡。 注意:Redis 集群可能會在將來提供同步寫的方法。 Redis 集群另外一種可能會丟失命令的情況是集群出現(xiàn)了網(wǎng)絡(luò)分區(qū), 并且一個客戶端與至少包括一個主節(jié)點在內(nèi)的少數(shù)實例被孤立。

舉個例子 假設(shè)集群包含 A 、 B 、 C 、 A1 、 B1 、 C1 六個節(jié)點, 其中 A 、B 、C 為主節(jié)點, A1 、B1 、C1 為A,B,C的從節(jié)點, 還有一個客戶端 Z1 假設(shè)集群中發(fā)生網(wǎng)絡(luò)分區(qū),那么集群可能會分為兩方,大部分的一方包含節(jié)點 A 、C 、A1 、B1 和 C1 ,小部分的一方則包含節(jié)點 B 和客戶端 Z1 .

Z1仍然能夠向主節(jié)點B中寫入, 如果網(wǎng)絡(luò)分區(qū)發(fā)生時間較短,那么集群將會繼續(xù)正常運作,如果分區(qū)的時間足夠讓大部分的一方將B1選舉為新的master,那么Z1寫入B中得數(shù)據(jù)便丟失了.

注意, 在網(wǎng)絡(luò)分裂出現(xiàn)期間, 客戶端 Z1 可以向主節(jié)點 B 發(fā)送寫命令的最大時間是有限制的, 這一時間限制稱為節(jié)點超時時間(node timeout), 是 Redis 集群的一個重要的配置選項:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • redis集群分為服務(wù)端集群和客戶端分片,redis3.0以上版本實現(xiàn)了集群機(jī)制,即服務(wù)端集群,3.0以下使用客戶...
    hadoop_null閱讀 1,677評論 0 6
  • 前言 Redis 是我們目前大規(guī)模使用的緩存中間件,由于它強(qiáng)大高效而又便捷的功能,得到了廣泛的使用。單節(jié)點的Red...
    Kevin_ZGJ閱讀 11,854評論 19 133
  • 集群簡介 Redis 集群通過分區(qū)(partition)來提供一定程度的可用性(availability): 即使...
    抄無止境閱讀 316評論 0 0
  • 以下為演講實錄: 湖畔大學(xué)所有學(xué)員,大家都有一個共同的特征,都是企業(yè)一號位,或者即將成為企業(yè)一號位。我今天和大家分...
    言射手閱讀 403評論 0 2
  • 歲暮陰陽催景短, 天涯孤旅雪霽寒。 煎熬十日得霜病, 一年惆悵教客斷。 把酒臨風(fēng)數(shù)懸冰, 和曲成歌聽紫弦。 人生寂...
    顧聿閱讀 388評論 0 1

友情鏈接更多精彩內(nèi)容