
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 集群采用每個(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)上對(duì)象與機(jī)器處于同一哈??臻g中,這樣按順時(shí)針轉(zhuǎn)動(dòng)object1存儲(chǔ)到了NODE1中,object3存儲(chǔ)到了NODE2中,object2、object4存儲(chǔ)到了NODE3中。映射機(jī)器機(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 ......







