1、hash槽是什么?
- 首先说明,普通hash、一致性hash(圆环hash)、哈希槽算法,他们是不一样的。
- 1.普通hash取模法:是对服务器的数量进行取模。
- 2.一致性Hash算法:是对2^32取模,一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环,将各个服务器进行hash处理得到一个哈希,每台机器就能确定其在哈希环上的位置。
- 3.哈希槽算法:Redis Cluser采用虚拟槽分区,所有的键根据哈希函数映射到0~16383个整数槽内。
- 哈希槽计算公式:slot=CRC16(key)& 16384。集群中的每个键都属于这16384个哈希槽中的一个。
2、普通哈希算法和hash槽算法对比:
-
1)当业务量突然增加,现有服务器不够用。增加服务器节点后,如果通过常用的hash取模算法:
- 增加服务器节点后:普通hash取模,hash(key)%(N+1) 做数据分片和分发时,由于节点数量发生变化,导致之前的key 会被分发到其他的服务器上,导致大量的数据失效,需要重新写(set)Redis 服务器。
- 某个服务器挂了:如果不做及时的修复,大量被分发到此服务器请求都会失效。
-
2)Redis Cluster在设计中没有使用一致性哈希,而是使用数据分片引入哈希槽(hash slot)来实现(好处):
- 1.控制节点请求负载:按照槽来进行分片,通过为每个节点指派不同数量的槽,可以控制不同节点负载的数据量和请求数。
- 2.尽量保证不丢失数据:可以保证最大程度的不丢失数据因为没有做数据迁移。
- 3.易增删节点:方便添加或者删除节点。
- 4.数据均匀:由于采用高质量的哈希算法,每个槽所映射的数据通常比较均匀。
-
3)举例:假如当前集群有3个节点,槽默认是平均分的:
- 节点 A (6381)包含 0 到 5499号哈希槽。
- 节点 B (6382)包含5500 到 10999 号哈希槽。
- 节点 C (6383)包含11000 到 16383号哈希槽。
- 这种结构很方便添加或者删除节点,比如如果我想新添加个节点D,,我需要从节点 A、B、C中得部分槽到D上。
- 如果我像移除节点A,需要将A中得槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可。
- 由于哈希槽从一个节点将移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量,都不会造成集群不可用的状态。