一、哈希槽介紹
Redis Cluster在設計中沒有使用一致性哈希(Consistency Hashing),而是使用數據分片引入哈希槽(hash slot)來實現;
一個 Redis Cluster包含16384(0~16383)個哈希槽(補充:為什么redis集群的最大槽數是16384個?),存儲在Redis Cluster中的所有鍵都會被映射到這些slot中,集群中的每個鍵都屬於這16384個哈希槽中的一個。按照槽來進行分片,通過為每個節點指派不同數量的槽,可以控制不同節點負責的數據量和請求數.
當前集群有3個節點,槽默認是平均分的:
- 節點 A (6381)包含 0 到 5499號哈希槽.
- 節點 B (6382)包含5500 到 10999 號哈希槽.
- 節點 C (6383)包含11000 到 16383號哈希槽.
二、哈希槽計算公式
集群使用公式slot=CRC16(key)/16384來計算key屬於哪個槽,其中CRC16(key)語句用於計算key的CRC16 校驗和。
三、哈希槽怎么工作
我們看到的是master節點在 Redis Cluster中的實現時,都存有所有的路由信息。
當客戶端的key 經過hash運算,發送slot 槽位不在本節點的時候:
- (1)如果是非集群方式連接,則直接報告錯誤給client,告訴它應該訪問集群中那個IP的master主機。
- (2)如果是集群方式連接,則將客戶端重定向到正確的節點上。
注意這里並不是127.0.0.1:7001 幫client去連接127.0.0.1:7003獲取數據的,而是將客戶端請求重定向了。
四、哈希槽的優點
很容易添加或者刪除節點:
- 比如如果我想新添加個節點D, 我需要從節點 A, B, C中轉移部分槽到D上即可.
- 如果我像移除節點A,需要將A中得槽移到B和C節點上,然后將沒有任何槽的A節點從集群中移除即可.
由於從一個節點將哈希槽移動到另一個節點並不會停止服務,所以無論添加刪除或者改變某個節點的哈希槽的數量都不會造成集群不可用的狀態.
五、補充知識
查看哈希槽分區情況
通過cluster nodes命令,可以清晰看到Redis Cluster中的每一個master節點管理的哈希槽。比如 127.0.0.1:7001 擁有哈希槽 0-5460, 127.0.0.1:7002 擁有哈希槽 5461-10922, 127.0.0.1:7003 擁有哈希槽 10923-16383。
//查看集群中,各個master節點的哈希槽分區情況 127.0.0.1:7001> cluster nodes e51711eb03d 127.0.0.1:7002@17002 master - 0 1590126183862 2 connected 5461-10922 68c5fc14287 127.0.0.1:7003@17003 master - 0 1590126181856 3 connected 10923-16383 903322e4431 127.0.0.1:7001@17001 myself,master - 0 1590126182000 1 connected 0-5460
參考文獻
版權聲明:本文為CSDN博主「小小月的春天」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/tianpeng341204/article/details/78963850