<分布式寻址>redis cluster hash slot 算法

简介:

上两篇博客介绍了简单hash和一致性hash算法,下面介绍redis3.0版本以后推出的cluster分片hash算法。

redis cluster使用的是hash slot算法,有固定的16384个hash slot,slot是槽的概念,有点类似memcached的slot,就理解为数据管理和迁移的基本单位吧。

redis cluster算是真正服务端的分布式缓存系统,不像memcached和2.0的redis需要在客户端进行负载均衡。

算法:

对每个 key 计算 CRC16 值,然后对 16384 取模,可以获取 key 对应的 hash slot。

数据分区

Redis Cluster 采用虚拟槽分区,所有的根据哈希函数映射到 0~16383 整数槽内,计算公式:slot = CRC16(key)& 16384。每个节点负责维护一部分槽以及槽所映射的键值数据,如图所示:

<分布式寻址>redis cluster hash slot 算法_第1张图片


举个例子

<分布式寻址>redis cluster hash slot 算法_第2张图片
节点分布

如上图
当前集群有 5 个节点,每个节点平均大约负责 3276 个。由于采用高质量哈希算法,每个槽所映射的数据通常比较均匀,将数据平均划分到 5 个节点进行数据分区。Redis Cluster 就是采用虚拟槽分区

节点1: 包含 0 到 3276 号哈希槽。

节点2:包含 3277 到 6553 号哈希槽。

节点3:包含 6554 到 9830 号哈希槽。

节点4:包含 9831 到 13107 号哈希槽。

节点5:包含 13108 到 16383 号哈希槽。

所以hash slot的好处是可以像磁盘分区一样自由分配槽位,在配置文件里可以指定,也可以让redis自己选择分配,结果均匀。

这种结构很容易添加或者删除节点。如果增加一个节点 6,就需要从节点 1 ~ 5 获得部分分配到节点 6 上。如果想移除节点 1,需要将节点 1 中的移到节点 2 ~ 5 上,然后将没有任何槽的节点 1 从集群中移除即可。

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


缓存的key hash结果是和slot绑定的,而不是和服务器节点绑定,所以节点的更替只需要迁移slot即可平滑过渡。


但是redis分片技术也有功能限制:

笔者遇到过的一些限制主要就是以下几点:

1.对于pipeline批量操作,只能路由到一个片区,压力相对大

2.hmset() map结构也是只能路由到一个片区,是根据大key进行hash,即使有很多个field。

3.事务,不同片区无法在同一个事务中

你可能感兴趣的:(<分布式寻址>redis cluster hash slot 算法)