美文网首页
redis数据分布及槽信息

redis数据分布及槽信息

作者: 183207efd207 | 来源:发表于2016-12-27 12:13 被阅读0次
1、槽(slot)概念

Redis Cluster中有一个16384长度的槽的概念,他们的编号为0、1、2、3……16382、16383。这个槽是一个虚拟的槽,并不是真正存在的。正常工作的时候,Redis Cluster中的每个Master节点都会负责一部分的槽,当有某个key被映射到某个Master负责的槽,那么这个Master负责为这个key提供服务,至于哪个Master节点负责哪个槽,这是可以由用户指定的,也可以在初始化的时候自动生成(redis-trib.rb脚本)。这里值得一提的是,在Redis Cluster中,只有Master才拥有槽的所有权,如果是某个Master的slave,这个slave只负责槽的使用,但是没有所有权。

2、数据分片

在Redis Cluster中,拥有16384个slot,这个数是固定的,存储在Redis Cluster中的所有的键都会被映射到这些slot中。数据库中的每个键都属于这16384个哈希槽的其中一个,集群使用公式CRC16(key) % 16384来计算键key属于哪个槽,其中CRC16(key)语句用于计算键key的CRC16校验。集群中的每个节点负责处理一部分哈希槽。

3、节点的槽指派信息

clusterNode结构的slots属性和numslot属性记录了节点负责处理那些槽:
struct clusterNode {
//…
unsignedchar slots[16384/8];
};
Slots属性是一个二进制位数组(bit
array),这个数组的长度为16384/8=2048个字节,共包含16384个二进制位。
Master节点用bit来标识对于某个槽自己是否拥有。比如对于编号为1的槽,Master只要判断序列的第二位(索引从0开始)是不是为1即可。时间复杂度为O(1)。

4、集群所有槽的指派信息

通过将所有槽的指派信息保存在clusterState.slots数组里面,程序要检查槽i是否已经被指派,又或者取得负责处理槽i的节点,只需要访问clusterState.slots[i]的值即可,复杂度仅为O(1)。

5、请求重定向

由于每个节点只负责部分slot,以及slot可能从一个节点迁移到另一节点,造成客户端有可能会向错误的节点发起请求。因此需要有一种机制来对其进行发现和修正,这就是请求重定向。有两种不同的重定向场景:
a)MOVED错误
1.请求的key对应的槽不在该节点上,节点将查看自身内部所保存的哈希槽到节点ID的映射记录, 节点回复一个MOVED错误。
2.需要客户端进行再次重试。


b)ASK错误
1.请求的key对应的槽目前的状态属于MIGRATING状态,并且当前节点找不到这个key了,节点回 复ASK错误。ASK会把对应槽的IMPORTING节点返回给你,告诉你去IMPORTING的节点尝试找找。
2.客户端进行重试首先发送ASKING命令,节点将为客户端设置一个一次性的标志(flag),使得 客户端可以执行一次针对IMPORTING状态的槽的命令请求,然后再发送真正的命令请求。
3.不必更新客户端所记录的槽至节点的映射。

相关文章

  • redis数据分布及槽信息

    1、槽(slot)概念 Redis Cluster中有一个16384长度的槽的概念,他们的编号为0、1、2、3……...

  • redis集群

    一、数据分布 1. Redis数据分区 Redis Cluser采用虚拟槽分区,所有的键根据哈希函数映射到0~16...

  • redis相关

    导读 redis的工作模型和常用数据结构 redis的持久化及数据淘汰机制 redis的应用场景及应对措施分布式锁...

  • redis学习笔记(五) 集群

    1. 数据分布 Redis Cluster采用虚拟槽对数据进行分区。虚拟槽使用分散度良好的哈希函数把所有的数据均匀...

  • Redis 集群的数据分片

    概述:Redis 集群的数据分片是redis进行分布式存储的一种,它引入了hash槽的概念,每个redis节点存储...

  • 爬虫环境配置(Ubuntu)

    python环境安装 MongoDb环境及安装 用于存储结构化字典数据。 Redis环境anzhaung 分布式爬...

  • 一致性hash

    应用领域(数据分布式存储) 数据缓存集群(redis、memcache) hadoop ESearch 分布式数据...

  • 从Redis分区的优缺点来看适合的应用场景

    ****正文****Redis Partitioning即Redis分区,简单的说就是将数据分布到不同的redis...

  • Python爬虫第十天:数据存储MySql-Redis|Scra

    内容简述: 一:数据存储-MySQL|Redis 二:分布式爬虫Scrapy-Redis...

  • 常见的Redis面试题及分布式集群讲解

    常见的Redis面试题及分布式集群讲解 1、 使用Redis有哪些好处?1、速度快,因为数据存在内存中,类似于Ha...

网友评论

      本文标题:redis数据分布及槽信息

      本文链接:https://www.haomeiwen.com/subject/ymosvttx.html