Redis集群Cluster(下)

Redis集群Cluster

redis官方提供了多种集群部署方案例如主从模式、哨兵模式、Cluster模式,主从模式最为简单,核心思想就是主从复制读写分离,让从节点分担主节点的压力,但缺点就是不具备容错机制一旦节点故障需要人工介入,哨兵模式更像是一种对主从模式的补充,哨兵这种低级别的线程能做到监控主从节点,一但主节点发生故障,哨兵集群可以进行故障转移不需要人工介入,但缺点是在集群达到一定数量在线扩容难度大,同时哨兵集群也是对资源的一种消耗,所以在redis3.0推出了一种新的集群模式Cluster。

什么是Cluster

Cluster集群模式也被称为切片集群是Redis官方推荐使用的一种模式,Cluster方案采用哈希槽(hash slot)来处理实例之间的映射关系,在集群中总共有16384个哈希槽,默认形式是将16384个哈希槽分配给所有的节点,每个节点分配一段哈希槽类似数据分区,每个键值按照CRC16算法得到哈希值再将其对16384取模CRC16(key) modulo 16384通过最终的结果得到key值存在的哈希槽位置,如下所示。

redis集群可以执行CLUSTER NODES就可以查看集群节点如下所示,三主三从结构。

Cluster特点

Redis Cluster特点

  • 多主多从:从节点作备用不提供服务复制主节点,仅当主节点故障会选取从节点顶上。

  • 不支持处理多个keys的命令:如mget,mset等批量操作,因为多个键可能不在一个节点上,在并发情况下处理可能有问题,所以不支持。

  • 节点之间故障转移,不依赖哨兵集群:主节点之间相互监督,发生故障相互选举。

  • 支持在线扩容,弥补哨兵模式的缺点。

Redis Cluster优点

  • Redis Cluster数据分片不需要保存冗余数据,节省内存。

  • Redis Cluster模式采用多个主节点提供服务,相比哨兵模式或主从模式的单个主节点写的性能更好。

  • Redis Cluster模式不需要额外的配置(哨兵)保证其高可用,其内部选举机制(多个主节点相互ping)就可以实现。

客户端定位数据

客户端可以采用CRC16算法得到哈希值后取模得到key值所处的哈希槽,但是哈希槽所处的实例客户端如何知道呢?

客户端和实例建立连接后,实例就会将自身的哈希槽映射发送给客户端,客户端做缓存操作,同时实例与实例连接后会交换自身的哈希槽映射关系,这时客户端和所有实例就能得到完整的哈希槽映射关系,后续客户端做请求操作就知道键值对应的哪个哈希槽在哪个实例,如下所示。

哈希槽映射改变如何处理

哈希槽的映射是有可能改变的,如遇到实例的增减需要重新分配哈希槽,或者为了负载均衡重新分配哈希槽(初次分配哈希槽后可能有某些热点key的哈希槽频繁访问,导致实例的压力不均衡,所以需要重新分配),哈希槽的变化客户端是不能主动感知的,这就导致了客户端缓存的哈希槽映射和实例中的哈希槽不一致,这种场景下Redis推出了重定向解决问题。

MOVE重定向

重定向也就是说当客户端给一个实例发送命令操作,但是这个实例上没有键值对应的哈希槽,这时Redis将返回键值哈希槽应该存在的实例如下所示,同时客户端还会将该哈希槽映射关系更新

客户端执行流程如下所示

ASK转向

上图聊的是重新分配哈希槽后客户端请求的处理流程,如果是重新分配哈希槽的过程中请求到达,Redis应该如何响应呢?此时Redis会响应ASK,如下所示

GET key1
(error) ASK key1存在的哈希槽数  所在实例IP:端口

ASK表明key存在的哈希槽数在给出的实例IP上,但分配哈希槽正在进行,所以需要客户端向实例所在IP发送ASKING命令,该Redis实例将会为客户端设置一次性标识,使得实例可以执行客户端命令请求,如果没有先发送ASKING命令单纯只发送操作命令如get key1这时实例会拒绝执行。

如下所示,实例3中存在哈希槽4,这个哈希槽中存在键值key1、key2、key3、key4,负载均衡哈希槽重新分配将哈希槽从实例3迁移到实例2,当哈希槽4迁移了key3、key4后,实例3中还存在key1、key2未迁移,客户端发送get key1请求命令。

和MOVE重定向不同的是ASK转向不会更新客户端缓存哈希槽映射关系,也就是说当哈希槽分配未完成下次请求的键值为key1时,客户端同样还是会去实例3中执行请求,ASK的作用只是让客户端重新发起一次请求。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值