-
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节点从集群中移除即可。
- 由于哈希槽从一个节点将移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量,都不会造成集群不可用的状态。