Redis哈希分片原理是什么-創(chuàng)新互聯(lián)

本篇內(nèi)容介紹了“Redis哈希分片原理是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)公司于2013年創(chuàng)立,先為虹口等服務(wù)建站,虹口等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為虹口企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

集群分片模式

如果Redis只用復制功能做主從,那么當數(shù)據(jù)量巨大的情況下,單機情況下可能已經(jīng)承受不下一份數(shù)據(jù),更不用說是主從都要各自保存一份完整的數(shù)據(jù)。在這種情況下,數(shù)據(jù)分片是一個非常好的解決辦法。

Redis的Cluster正是用于解決該問題。它主要提供兩個功能:

  1. 自動對數(shù)據(jù)分片,落到各個節(jié)點上

  2. 即使集群部分節(jié)點失效或者連接不上,依然可以繼續(xù)處理命令

對于第二點,它的功能有點類似于Sentienl的故障轉(zhuǎn)移(可以了解下之前Sentinel的文章),在這里不細說。下面詳細了解下Redis的槽位分片原理,在此之前,先了解下分布式簡單哈希算法和一致性哈希算法,以幫助理解槽位的作用。

簡單哈希算法

假設(shè)有三臺機,數(shù)據(jù)落在哪臺機的算法為

  c = Hash(key) % 3

例如key A的哈希值為4,4%3=1,則落在第二臺機。Key ABC哈希值為11,11%3=2,則落在第三臺機上。

利用這樣的算法,假設(shè)現(xiàn)在數(shù)據(jù)量太大了,需要增加一臺機器。A原本落在第二臺上,現(xiàn)在根據(jù)算法4%4=0,落到了第一臺機器上了,但是第一臺機器上根本沒有A的值。這樣的算法會導致增加機器或減少機器的時候,引起大量的緩存穿透,造成雪崩。

一致性哈希算法

在1997年,麻省理工學院的Karger等人提出了一致性哈希算法,為的就是解決分布式緩存的問題。

一致性哈希算法中,整個哈??臻g是一個虛擬圓環(huán)
Redis哈希分片原理是什么

假設(shè)有四個節(jié)點Node A、B、C、D,經(jīng)過ip地址的哈希計算,它們的位置如下
Redis哈希分片原理是什么

有4個存儲對象Object A、B、C、D,經(jīng)過對Key的哈希計算后,它們的位置如下
Redis哈希分片原理是什么
對于各個Object,它所真正的存儲位置是按順時針找到的第一個存儲節(jié)點。例如Object A順時針找到的第一個節(jié)點是Node A,所以Node A負責存儲Object A,Object B存儲在Node B。

一致性哈希算法大概如此,那么它的容錯性擴展性如何呢?

假設(shè)Node C節(jié)點掛掉了,Object C的存儲丟失,那么它順時針找到的最新節(jié)點是Node D。也就是說Node C掛掉了,受影響僅僅包括Node B到Node C區(qū)間的數(shù)據(jù),并且這些數(shù)據(jù)會轉(zhuǎn)移到Node D進行存儲。
Redis哈希分片原理是什么

同理,假設(shè)現(xiàn)在數(shù)據(jù)量大了,需要增加一臺節(jié)點Node X。Node X的位置在Node B到Node C直接,那么受到影響的僅僅是Node B到Node X間的數(shù)據(jù),它們要重新落到Node X上。

所以一致性哈希算法對于容錯性和擴展性有非常好的支持。但一致性哈希算法也有一個嚴重的問題,就是數(shù)據(jù)傾斜。

如果在分片的集群中,節(jié)點太少,并且分布不均,一致性哈希算法就會出現(xiàn)部分節(jié)點數(shù)據(jù)太多,部分節(jié)點數(shù)據(jù)太少。也就是說無法控制節(jié)點存儲數(shù)據(jù)的分配。如下圖,大部分數(shù)據(jù)都在A上了,B的數(shù)據(jù)比較少。
Redis哈希分片原理是什么

哈希槽

Redis集群(Cluster)并沒有選用上面一致性哈希,而是采用了哈希槽(SLOT)的這種概念。主要的原因就是上面所說的,一致性哈希算法對于數(shù)據(jù)分布、節(jié)點位置的控制并不是很友好。

首先哈希槽其實是兩個概念,第一個是哈希算法。Redis Cluster的hash算法不是簡單的hash(),而是crc16算法,一種校驗算法。

另外一個就是槽位的概念,空間分配的規(guī)則。其實哈希槽的本質(zhì)和一致性哈希算法非常相似,不同點就是對于哈??臻g的定義。一致性哈希的空間是一個圓環(huán),節(jié)點分布是基于圓環(huán)的,無法很好的控制數(shù)據(jù)分布。而Redis Cluster的槽位空間是自定義分配的,類似于Windows盤分區(qū)的概念。這種分區(qū)是可以自定義大小,自定義位置的。

Redis Cluster包含了16384個哈希槽,每個Key通過計算后都會落在具體一個槽位上,而這個槽位是屬于哪個存儲節(jié)點的,則由用戶自己定義分配。例如機器硬盤小的,可以分配少一點槽位,硬盤大的可以分配多一點。如果節(jié)點硬盤都差不多則可以平均分配。所以哈希槽這種概念很好地解決了一致性哈希的弊端。

另外在容錯性擴展性上,表象與一致性哈希一樣,都是對受影響的數(shù)據(jù)進行轉(zhuǎn)移。而哈希槽本質(zhì)上是對槽位的轉(zhuǎn)移,把故障節(jié)點負責的槽位轉(zhuǎn)移到其他正常的節(jié)點上。擴展節(jié)點也是一樣,把其他節(jié)點上的槽位轉(zhuǎn)移到新的節(jié)點上。

但一定要注意的是,對于槽位的轉(zhuǎn)移和分派,Redis集群是不會自動進行的,而是需要人工配置的。所以Redis集群的高可用是依賴于節(jié)點的主從復制與主從間的自動故障轉(zhuǎn)移。

集群搭建

下面以最簡單的例子,拋開高可用主從復制級轉(zhuǎn)移的內(nèi)容,來重點介紹下Redis集群是如何搭建,槽位是如何分配的,以加深對Redis集群原理及概念的理解。

redis.conf配置

先找到redis.conf,啟用cluster功能。
Redis哈希分片原理是什么

cluster-enabled yes默認是關(guān)閉的,要啟用cluster,讓redis成為集群的一部分,需要手動打開才行。

然后配置cluster的配置文件
Redis哈希分片原理是什么
每一個cluster節(jié)點都有一個cluster的配置文件,這個文件主要用于記錄節(jié)點信息,用程序自動生成和管理,不需要人工干預。唯一要注意的是,如果在同一臺機器上運行多個節(jié)點,需要修改這個配置為不同的名字。

本次為了方便搭建,所有Redis實例都在同一臺機器上,所以修改不同的cluster config名字后,復制三份redis.conf配置,以用于啟動三個集群實例(cluster至少要三個主節(jié)點才能進行)。

集群關(guān)聯(lián)

  > redis-server /usr/local/etc/redis/redis-6379.conf --port 6379 &
  > redis-server /usr/local/etc/redis/redis-6380.conf --port 6380 &
  > redis-server /usr/local/etc/redis/redis-6381.conf --port 6381 &

&符號的作用是讓命令在后臺執(zhí)行,但程序執(zhí)行的log依然會打印在console中。也可以通過配置redis.conf中deamonize yes,讓Redis在后臺運行。

連上6379的Redis實例,然后通過cluster nodes查看集群范圍。
Redis哈希分片原理是什么
連上其他實例也是一樣,目前6379、6380、6381在各自的集群中,且集群只有它們自己一個。

在6379上,通過cluster meet命令,與6380、6381建立鏈接。

  127.0.0.1:6379> cluster meet 127.0.0.1 6380
  127.0.0.1:6379> cluster meet 127.0.0.1 6381

Redis哈希分片原理是什么
可以看到集群中已經(jīng)包含了6379、6380、6381三個節(jié)點了。登錄其他節(jié)點查看也是一樣的結(jié)果。即使6380與6381之間沒有直接手動關(guān)聯(lián),但在集群中,節(jié)點一旦發(fā)現(xiàn)有未關(guān)聯(lián)的節(jié)點,會自動與之握手關(guān)聯(lián)。

槽位分配

通過cluster info命令查看集群的狀態(tài)
Redis哈希分片原理是什么
state的狀態(tài)是fail的,還沒啟用??聪鹿俜降恼f明
Redis哈希分片原理是什么
只有state為ok,節(jié)點才能接受請求。如果只要有一個槽位(slot)沒有分配,那么這個狀態(tài)就是fail。而一共需要分配16384槽位才能讓集群正常工作。

接下來給6379分配0~5000的槽位,給6380分配5001~10000的槽位,給6381分配10001~16383的槽位。

  > redis-cli -c -p 6379 cluster addslots {0..5000}
  > redis-cli -c -p 6380 cluster addslots {5001..10000}
  > redis-cli -c -p 6381 cluster addslots {10001..16383}

再看看cluster info
Redis哈希分片原理是什么
state已經(jīng)為ok,16384個槽位都已經(jīng)分配好了?,F(xiàn)在集群已經(jīng)可以正常工作了。

效果測試

隨便登上一個實例,記得加上參數(shù)-c,啟用集群模式的客戶端,否則無法正常運行。

  redis-cli -c -p 6380

嘗試下set、get操作
Redis哈希分片原理是什么
可以看到,Redis集群會計算key落在哪個卡槽,然后會把命令轉(zhuǎn)發(fā)到負責該卡槽的節(jié)點上執(zhí)行。

利用cluster keyslot命令計算出key是在哪個槽位上,從而得出會跳轉(zhuǎn)到哪個節(jié)點上執(zhí)行。

“Redis哈希分片原理是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)頁名稱:Redis哈希分片原理是什么-創(chuàng)新互聯(lián)
本文路徑:http://www.bm7419.com/article42/cdjjhc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、移動網(wǎng)站建設(shè)、網(wǎng)站制作、電子商務(wù)App設(shè)計、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司