冰解的破-Redis

Redis

Redis 是一個(gè) Key-Value 存儲(chǔ)系統(tǒng)。和 Memcached 類似,它支持存儲(chǔ)的 value 類型相對(duì)更多,包括 string(字符串)、 list(鏈表)、 set(集合)和 zset(有序集合)。這些數(shù)據(jù)類型都支持 push/pop、add/remove 及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎(chǔ)上,Redis 支持各種不同方式的排序。與 memcached 一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是 Redis 會(huì)周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎(chǔ)上實(shí)現(xiàn)了 master-slave(主從)同步。

學(xué)習(xí)整理:

  • redis中hash slot是什么?

hash slot 是redis分布式部署,節(jié)點(diǎn)分配的一種方法
redis分布式部署其結(jié)構(gòu)如下:


redis-cluster

Redis 集群采用每個(gè)節(jié)點(diǎn)擁有 1(主服務(wù)自身)到 N 個(gè)副本(N-1 個(gè)附加的從服務(wù)器)的主從模型,cluster內(nèi)部master和slave之間的數(shù)據(jù)是異步復(fù)制的(提高性能,主要是在性能和一致性間的一個(gè)平衡)。
一個(gè)redis cluster有固定的16384個(gè)hash slot,slot被均勻的分配到cluster中的master節(jié)點(diǎn)上,而一個(gè)key具體的存儲(chǔ)在哪個(gè)slot上,則是通過(guò)key的CRC16編碼對(duì)16384取模得出的。

再講講hash slot的基本原理:

hash-slot

記錄和物理機(jī)之間引入了虛擬桶層,記錄通過(guò)hash函數(shù)映射到虛擬桶,記錄和虛擬桶是多對(duì)一的關(guān)系;第二層是虛擬桶和物理機(jī)之間的映射,同樣也是多對(duì)一的關(guān)系,即一個(gè)物理機(jī)對(duì)應(yīng)多個(gè)虛擬桶,這個(gè)層關(guān)系是通過(guò)內(nèi)存表實(shí)現(xiàn)的。

Redis 集群沒(méi)有并使用傳統(tǒng)的一致性哈希來(lái)分配數(shù)據(jù),而是采用另外一種叫做哈希槽 (hash slot)的方式來(lái)分配的。redis cluster 默認(rèn)分配了 16384 個(gè)slot,當(dāng)我們set一個(gè)key 時(shí),會(huì)用CRC16算法來(lái)取模得到所屬的slot,然后將這個(gè)key 分到哈希槽區(qū)間的節(jié)點(diǎn)上,具體算法就是:CRC16(key) % 16384。

  • 如果用戶將新節(jié)點(diǎn) D 添加到集群中, 那么集群只需要將節(jié)點(diǎn) A 、B 、 C 中的某些槽移動(dòng)到節(jié)點(diǎn) D 就可以了。
    比如我想新增一個(gè)節(jié)點(diǎn)D,redis cluster的這種做法是從各個(gè)節(jié)點(diǎn)的前面各拿取一部分slot到D上。
  • 與此類似, 如果用戶要從集群中移除節(jié)點(diǎn) A , 那么集群只需要將節(jié)點(diǎn) A 中的所有哈希槽移動(dòng)到節(jié)點(diǎn) B 和節(jié)點(diǎn) C , 然后再移除空白(不包含任何哈希槽)的節(jié)點(diǎn) A 就可以了。

因?yàn)閷⒁粋€(gè)哈希槽從一個(gè)節(jié)點(diǎn)移動(dòng)到另一個(gè)節(jié)點(diǎn)不會(huì)造成節(jié)點(diǎn)阻塞, 所以無(wú)論是添加新節(jié)點(diǎn)還是移除已存在節(jié)點(diǎn), 又或者改變某個(gè)節(jié)點(diǎn)包含的哈希槽數(shù)量, 都不會(huì)造成集群下線。

最后補(bǔ)充一個(gè)跟hash槽類似但應(yīng)用更廣的一個(gè)叫一致性hash的東東:

環(huán)形Hash空間
按照常用的hash算法來(lái)將對(duì)應(yīng)的key哈希到一個(gè)具有232次方個(gè)桶的空間中,即0~(232)-1的數(shù)字空間中。現(xiàn)在我們可以將這些數(shù)字頭尾相連,想象成一個(gè)閉合的環(huán)形。如下圖

環(huán)形空間

把數(shù)據(jù)通過(guò)一定的hash算法處理后映射到環(huán)上
映射數(shù)據(jù)

將機(jī)器通過(guò)hash算法映射到環(huán)上
映射機(jī)器
對(duì)象與機(jī)器處于同一哈??臻g中,這樣按順時(shí)針轉(zhuǎn)動(dòng)object1存儲(chǔ)到了NODE1中,object3存儲(chǔ)到了NODE2中,object2、object4存儲(chǔ)到了NODE3中。

機(jī)器的刪除與添加

  • 節(jié)點(diǎn)(機(jī)器)的刪除
    刪除節(jié)點(diǎn)
  • 節(jié)點(diǎn)(機(jī)器)的添加
    添加節(jié)點(diǎn)

通過(guò)按順時(shí)針遷移的規(guī)則,那么object2被遷移到了NODE4中,其它對(duì)象還保持這原有的存儲(chǔ)位置。通過(guò)對(duì)節(jié)點(diǎn)的添加和刪除的分析,一致性哈希算法在保持了單調(diào)性的同時(shí),還是數(shù)據(jù)的遷移達(dá)到了最小,這樣的算法對(duì)分布式集群來(lái)說(shuō)是非常合適的,避免了大量數(shù)據(jù)遷移,減小了服務(wù)器的的壓力。

一致性哈希算法中,為了盡可能的滿足平衡性,其引入了虛擬節(jié)點(diǎn)。

“虛擬節(jié)點(diǎn)”( virtual node )是實(shí)際節(jié)點(diǎn)(機(jī)器)在 hash 空間的復(fù)制( replica ),一個(gè)節(jié)點(diǎn)(機(jī)器)對(duì)應(yīng)了若干個(gè)“虛擬節(jié)點(diǎn)”,這個(gè)對(duì)應(yīng)個(gè)數(shù)也稱為“復(fù)制個(gè)數(shù)”,“虛擬節(jié)點(diǎn)”在 hash 空間中以hash值排列。


虛擬節(jié)點(diǎn)

映射關(guān)系:object1->NODE1-1,object2->NODE1-2,object3->NODE3-2,object4->NODE3-1。通過(guò)虛擬節(jié)點(diǎn)的引入,對(duì)象的分布就比較均衡了。那么在實(shí)際操作中,對(duì)象從hash到虛擬節(jié)點(diǎn)到實(shí)際節(jié)點(diǎn)的轉(zhuǎn)換如下圖:


時(shí)間轉(zhuǎn)換

“虛擬節(jié)點(diǎn)”的hash計(jì)算可以采用對(duì)應(yīng)節(jié)點(diǎn)的IP地址加數(shù)字后綴的方式。例如假設(shè)NODE1的IP地址為192.168.1.100。引入“虛擬節(jié)點(diǎn)”前,計(jì)算 cache A 的 hash 值:
Hash(“192.168.1.100”);

引入“虛擬節(jié)點(diǎn)”后,計(jì)算“虛擬節(jié)”點(diǎn)NODE1-1和NODE1-2的hash值:
Hash(“192.168.1.100#1”); // NODE1-1
Hash(“192.168.1.100#2”); // NODE1-2

參見(jiàn):
hash slot(虛擬桶):https://www.cnblogs.com/abc-begin/p/8203613.html
每天進(jìn)步一點(diǎn)點(diǎn)——五分鐘理解一致性哈希算法(consistent hashing):https://blog.csdn.net/cywosp/article/details/23397179

TO BE CONTINUED ......

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

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

  • 基于內(nèi)存的NoSQL數(shù)據(jù)庫(kù)。提供五種數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。字符串、列表、集合、有序集合、散列表。Redis 支持很多特性...
    韓絕交閱讀 817評(píng)論 0 1
  • Redis Cluster Specification 1 設(shè)計(jì)目標(biāo)和理由 1.1 Redis Cluster g...
    近路閱讀 4,411評(píng)論 0 12
  • 本文檔翻譯自 http://redis.io/topics/cluster-tutorial 。 本文檔是 Red...
    會(huì)跳舞的機(jī)器人閱讀 67,077評(píng)論 2 21
  • 昨天下午放學(xué)回家兒子吃了點(diǎn)藥就睡了,快10點(diǎn)的時(shí)候醒了,睜開(kāi)眼就和我說(shuō):“媽媽,我肚子不疼了?!蔽亿s緊過(guò)去,看到他...
    恬靜_799a閱讀 161評(píng)論 0 0
  • 1 他們說(shuō)我是個(gè)怪人,那也許只是因?yàn)楸诚蛉巳憾惺刮倚老病?在我很小的時(shí)候我從沒(méi)想過(guò)要當(dāng)一個(gè)講故事的人,可是當(dāng)我成...
    桃錦閱讀 2,830評(píng)論 4 50

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