切片集群

如果要用redis保存非常大的数据,那么有时候可能响应会特别慢,因为在fork的时候会耗时很久,而fork是阻塞主线程的。这个时候,就需要对redis实例进行扩展。

纵向扩展:增加内存容量、增加磁盘容量、使用更高配置的 CPU。

优点:实施起来简单、直接。

缺点:随着数据增长fork的耗时也会增加;受到硬件和成本的限制。

横向扩展:横向增加当前 Redis 实例的个数,从一个到使用三个相同配置的实例。

启动多个 Redis 实例组成一个集群,然后按照一定的规则,把收到的数据划分成多份,每一份用一个实例来保存。

数据切片和实例的对应分布关系

使用Redis Cluster 方案规定了数据和实例的对应规则。Redis Cluster 方案采用哈希槽,来处理数据和实例之间的映射关系,一个切片集群共有 16384个哈希槽,如果集群中有 N 个实例,那么,每个实例上的槽个数为 16384/N 个。

Redis 实例会把自己的哈希槽信息发给和它相连接的其它实例,来完成哈希槽分配信息的扩散。当实例之间相互连接后,每个实例就有所有哈希槽的映射关系了。客户端收到哈希槽信息后,会缓存到本地,之后由新修改数据会直接发送到对应的实例节点。

每个键值对都会根据它的 key,根据CRC16算法得到一个16bit的值,然后对16384取模,得到编号被映射到一个哈希槽中。

 

实例和哈希槽的对应关系重新分配

实例和哈希槽的对应关系并不是一成不变的,最常见的变化有两个:

  • 在集群中,实例有新增或删除,Redis 需要重新分配哈希槽;
  • 为了负载均衡,Redis 需要把哈希槽在所有实例上重新分布一遍。

如果实例和哈希槽的对应关系发生了重新分配,那么redis cluster就会使用他的重定向机制。如果客户端给一个实例发送一个键值对的操作命令,如果这个实例没有这个键值对所映射的哈希曹,那么就会发送一个响应给客户端,就包括了新实例的访问地址。

要注意一种情况:

1. 当客户端给实例1发送命令时,实例1里面的数据只有一半迁移到了实例2

2. 此时客户端就会收到了一条ASK的报错信息,表示这个哈希槽正在转移,且这个ASK会包含目标键值对当前所在的实例IP,只是这个哈希槽正在转移。

3. 客户端要给目标实例发送一个ASKING命令,让这个实例允许执行客户端接下来发送的命令。

4. 客户端再向这个实例发送 GET 命令,以读取数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值