本篇內(nèi)容介紹了“Redis哈希分片原理是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)公司于2013年創(chuàng)立,先為虹口等服務(wù)建站,虹口等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為虹口企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。如果Redis只用復(fù)制功能做主從,那么當數(shù)據(jù)量巨大的情況下,單機情況下可能已經(jīng)承受不下一份數(shù)據(jù),更不用說是主從都要各自保存一份完整的數(shù)據(jù)。在這種情況下,數(shù)據(jù)分片是一個非常好的解決辦法。
Redis的Cluster正是用于解決該問題。它主要提供兩個功能:
自動對數(shù)據(jù)分片,落到各個節(jié)點上
即使集群部分節(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的值。這樣的算法會導(dǎo)致增加機器或減少機器的時候,引起大量的緩存穿透,造成雪崩。
在1997年,麻省理工學(xué)院的Karger等人提出了一致性哈希算法,為的就是解決分布式緩存的問題。
在一致性哈希算法中,整個哈??臻g是一個虛擬圓環(huán)
假設(shè)有四個節(jié)點Node A、B、C、D,經(jīng)過ip地址的哈希計算,它們的位置如下
有4個存儲對象Object A、B、C、D,經(jīng)過對Key的哈希計算后,它們的位置如下
對于各個Object,它所真正的存儲位置是按順時針找到的第一個存儲節(jié)點。例如Object A順時針找到的第一個節(jié)點是Node A,所以Node A負責(zé)存儲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進行存儲。
同理,假設(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集群(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é)點負責(zé)的槽位轉(zhuǎn)移到其他正常的節(jié)點上。擴展節(jié)點也是一樣,把其他節(jié)點上的槽位轉(zhuǎn)移到新的節(jié)點上。
但一定要注意的是,對于槽位的轉(zhuǎn)移和分派,Redis集群是不會自動進行的,而是需要人工配置的。所以Redis集群的高可用是依賴于節(jié)點的主從復(fù)制與主從間的自動故障轉(zhuǎn)移。
下面以最簡單的例子,拋開高可用主從復(fù)制級轉(zhuǎn)移的內(nèi)容,來重點介紹下Redis集群是如何搭建,槽位是如何分配的,以加深對Redis集群原理及概念的理解。
先找到redis.conf,啟用cluster功能。
cluster-enabled yes
默認是關(guān)閉的,要啟用cluster,讓redis成為集群的一部分,需要手動打開才行。
然后配置cluster的配置文件
每一個cluster節(jié)點都有一個cluster的配置文件,這個文件主要用于記錄節(jié)點信息,用程序自動生成和管理,不需要人工干預(yù)。唯一要注意的是,如果在同一臺機器上運行多個節(jié)點,需要修改這個配置為不同的名字。
本次為了方便搭建,所有Redis實例都在同一臺機器上,所以修改不同的cluster config名字后,復(fù)制三份redis.conf配置,以用于啟動三個集群實例(cluster至少要三個主節(jié)點才能進行)。
> 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
查看集群范圍。
連上其他實例也是一樣,目前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
可以看到集群中已經(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)
state的狀態(tài)是fail的,還沒啟用。看下官方的說明
只有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
state已經(jīng)為ok,16384個槽位都已經(jīng)分配好了。現(xiàn)在集群已經(jīng)可以正常工作了。
隨便登上一個實例,記得加上參數(shù)-c
,啟用集群模式的客戶端,否則無法正常運行。
redis-cli -c -p 6380
嘗試下set、get操作
可以看到,Redis集群會計算key落在哪個卡槽,然后會把命令轉(zhuǎn)發(fā)到負責(zé)該卡槽的節(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.muchs.cn/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)
猜你還喜歡下面的內(nèi)容