暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis 集群为什么是16384槽位

DevOps架构实战 2023-05-09
2950

1、性能测试:

redis-benchmark 命令

它是测试redis性能工具,通过多个命令实现

结论:单节点比集群的性能要快

2、集群原理

2.1哈希槽

redis集群(cluster)并没有选用上面的一致性哈希,面是采用了哈希槽的这种概念,主要原因就是一致性哈希算法对于数据分布、节点位置的控制并不是很友好。

首先哈希槽其实是两个概念:

1、哈希算法:redis clusterhash算法不是简单的hash(),而是crc16算法,一种校验算法。

2、槽位的概念,空间分配的规则。

一定要注意,对于槽位的转移和分派,redis集群是不会自动进行的,而是需要人式配置,所以redis集群的高可用是依赖于节点的主从复制与主从音的自动故障转移。

2.216384slots(槽位)

redis cluster没有单机的那种16个数据库(0-15)的概念,而是分成了16384slots槽位,每个节点负责其中一部分槽位,槽位的信息存储于每个节点中。

2.3、槽位定位算法

redis cluster默认会对key值使用CRC16算法进行hash得到一个整数值,然后用这个整数值对16384进行取模来得到具体的槽位,槽位计算公式:hash_slot = CRC16(key) mod 16384

2.4、补充:为什么是16384个槽

总结:

1、消息大小考虑:尽管crc16能得到65535个值,但redis选择16384slot,是因为16384的消息只占用了2k,而65535则需要8k

2、集群规模设计考虑:集群设计最多支持1000个分片,16384是相对比较好的选择,需要保证在最大集群规模下,slot均匀分布场景下,每个分片平均分到的slot不至于太小。

需要注意2个问题:

1、为什么要传全量的slot状态?

因为分布式场景,基于状态的设计更合理,状态的传播具有幂等性

2、为什么不考虑压缩?

集群规模较小的场景下,每个分片负责大量的slot,很难压缩。

如果本文对你有帮助的话,欢迎点赞&在看&转发,这对我继续分享&创作优质文章非常重要。感谢🙏🏻

文章转载自DevOps架构实战,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论