一: 首先,在redis的每一个节点上,都有这么两个东西,一个是插槽(slot)可以理解为是一个可以存储两个数值的一个变量这个变量的取值范围是:0-16383。还有一个就是cluster我个人把这个cluster理解为是一个集群管理的插件。当你往Redis Cluster中加入一个Key时,redis会根据crc16的算法得出一个结果,然后把结果对 16384 求余数,计算这个key应该分布到哪个hash slot中。

说明:

1. 一个hash slot中会有很多key和value。你可以理解成表的分区。使用单节点时的redis时只有一个表,所有的key都放在这个表里;

2. 改用Redis Cluster以后会自动为你生成16384个分区表,你insert数据时会根据上面的简单算法来决定你的key应该存在哪个分区,每个分区里有很多key。

  • 这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。
  • 一个hash slot可以存多少数据:摘自Redis官网的Data type章节,意思是内存允许的情况下,可以存超过40亿数据
  • redis cluster哈希槽数量能改变吗?

不能,因为代码算法写死了,固定是2的14次方这个数字上,作者自己有过分析

原因是因为需要把所有的槽放到心跳包里面便于让节点知道当前的全部信息。16348=16k,用bitmap来压缩心跳包的话,就相当于使用2*8*10=2KB大小的心跳包。而如果用crc16算法(redis使用这个而不是用哈希一致性算法)来确定哈希槽的分配。他的最大值是是2的16次方。用上面的算法换算需要8KB的心跳包来传输,作者自己认为这样不划算。而一个redis节点一般不会有超过1000个master(这个是作者自己说的),用16k来划分是比较合适的

redis集群数据存储原理:

    在redis cluster中,如果想要存入一个key-value,

    这个key首先会通过CRC16算法(和16384取余)

    结果会对应上0-16383之间的哈希槽(hash slot)

    最后,redis cluster会将key-value放置在对应的哈希槽中。

redis集群数据获取原理:

    当client向redis cluster中的任意一个节点发送与数据库key有关的命令时,

    接收命令的节点会计算出要处理的key属于哪个哈希槽(hash slot),

    并且先检查这个hash slot是否属于自己(管辖):

        如果key所在的槽正好属于自己(管辖),节点会直接执行这个key相关命令。

        如果key所在的槽不属于自己(管辖),那么节点会给client返回一个MOVED错误,

        指引client转向负责对应槽的节点,并客户端需要再次发送想要执行的和key相关的命令。

 

总结:针对redis集群如果缓存的业务数据没那么重要redis可以不做备份,例如有3个节点的集群,3个全都是主节点master,如果数据比较重要那么就要对这3个节点都增加一个备份节点slave,判断一个节点是否挂掉是通过投票来决定的,投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉。

如果redis集群没有备份,那么当master挂掉之后那么这个节点上的数据因为没有salve备份和替换有可能会丢失,所以一般集群都会有备份的,一般是3主3从的配置,开始3个主节点是确定好的,当有一个主节点宕机,并且它有多个从节点那么这多个从节点就开始竞争选举master。
 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐