Redis 集群模式(Cluster)原理详解

 更新时间:2023年07月28日 08:52:58   作者:david6969xin  
redis cluster集群是一个由多个主从节点集群组成的分布式服务集群,它具有复制、高可用和分片特性,cluster集群不需要sentinel 哨兵也能完成节点移除和故障转移的功能,本文就详细的给大家介绍一下Redis 集群模式原理,感兴趣的朋友跟着小编一起来看看吧

1、简述

Redis Cluster 集群中每个节点负责整个集群的一部分数据,每个节点上的数据多少可能不一样,节点之间通过一种特殊的二进制协议交互集群信息。

Redis Cluster将所有数据划分为16384个槽位,每个节点负责其中一部分槽位,槽位信息存储于每个节点中,当redis客户端来连接集群时,也会得到一份集群的槽位配置信息,这样当客户端要查找某个key时,可以直接定位到目标节点。

客户端为了可以直接找到具体key所在的节点,需要缓存槽位相关信息,这样就可快速定位到相对应的节点,同时可能存在客户端与服务器存储槽位信息不一致的情况,故需要纠正机制来实现槽位信息的校验调整。

2、槽位定位算法

Redis Cluster默认会对key值使用crc16算法进行hash得到一个整数值,然后用该整数值对16384进行取模来得到具体槽位。Redis Cluster还允许用户强制把某个key挂在特定槽位上,通过key字符串里面嵌入tag标记以此来强制key所挂的槽位等于tag所在的槽位。

3、跳转机制

当客户端向一个错误节点发送指令后,该节点会发现指令的key所在槽位并不归自己管,此时它会向客户端发送一个特殊的跳转指令携带目标操作的节点地址,告诉客户端去连接该节点以获取数据。客户端在收到MOVED指令后,要立即纠正本地槽位映射表,后续所有key将使用新的槽位映射表

4、key 迁移(redis-trib为例)

Redis迁移的单位是槽,即一个槽一个槽的迁移,当一个槽正在迁移时,这个槽就处于中间过渡状态。如图,这个槽在源节点的状态为migrating,在目标节点的状态为importing,表示数据正在从源节点流向目标节点。

redis-trib会在源节点和目标节点设置好中间状态,然后一次性获取元节点槽位的多有key列表(keysinslot指令,也可部分获取),然后挨个key进行迁移。每个key的迁移过程以源节点作为目标节点的“客户端”,源节点对当前key执行dump指令得到序列化内容,然后通过“客户端”向目标节点发送restore指令携带序列化的内容作为参数,目标节点在进行反序列化将内容恢复到目标节点内存中,然后返回“客户端”ok,源节点“客户端”收到后再把当前节点的key删掉就完成了单个key迁移的全过程。

迁移过程是同步的,在目标节点执行restore指令到源节点删除key之间,源节点的主线程会处于阻塞状态,直到key被成功删除。

迁移过程中,如果每个key的内容都很小,那么migrate过程会很快,几乎不会影响客户端的正常访问,如果key的内容很大,因为migrate过程是阻塞的,所以会导致源节点和目标节点 卡顿,影响集群稳定性,所以要避免大key。

5、容错

当主节点发生故障,集群会自动将从节点提升为主节点,如果主节点没有从节点,则发生故障时,集群不可用。同时Redis也提供了一个参数 cluster-require-full-coverage 可以允许部分节点发生故障,其余节点可正常提供服务。

6、网络抖动

由于网络抖动问题导致主从频繁切换,Redis Cluster 提供 cluster-node-timeout 参数,当某个节点持续时间timeout时间失联时,才可以认定该节点出现故障,需要进行主从切换。同时参数 cluster-slave-validity-factory 作为倍乘系数放大这个超时时间来宽容容错的紧急程度,系数为零,主从切换不会抗拒网络抖动,系数大于1则就成了主从切换的松弛系数。

7、可能下线(PFail)与确定下线(Fail)

因为Redis Cluster是去中心化的,一个节点认为某个节点失联了并不代表所有节点都认为它失联了,所以集群会通过以此协商过程,只有当大多数节点认为某个节点失联了,那么该节点才需要进行主从切换来容错。

Redis 集群节点采用Gossip协议来广播自己的状态以及来改变对整个集群的认知。当一个节点发现某个节点失联后(Pfail),它会将该失联信息广播到整个集群,其他节点就会收到节点失联信息,如果收到某个节点失联的节点数量(PFail Count)已经达到集群的大多数,则可以标记该失联节点为确定下线状态(Fail),然后广播到其它节点该节点确定下线的事实,并立即对该失联节点进行主从切换。

8、槽位迁移感知

客户端保存了槽位与节点的映射关系表,它需要及时得到更新,才可以正常地将某条指令发送到正确的节点中。Cluster中存在两条特殊的error指令:

  • MOVED指令:用来纠正槽位,客户端会刷新自己的槽位关系表。
  • ASKING指令:用来临时纠正槽位,客户端不会刷新自己的槽位关系表。

9、集群变更感知

当服务器节点变更时,客户端如何得到通知并实时刷新自己的节点关系表?分为两种情况:

  • 目标节点挂掉了,客户端会抛出一个 ConnectionError,紧接着会随机挑选一个节点来重试,这时被重试的节点会通过MOVED指令告知目标槽位被分配到新的节点地址。
  • 运维手动修改集群信息,将主节点切换为其他节点,并将主节点移除。这时打在旧节点上的指令会收到ClusterDown的错误,告知当前节点所在集群不可用(当前节点已被孤立,不在属于之前集群),这时客户端就会关闭所有连接,清空槽位映射关系表,然后向上报错,待下一条指令过来时,就会重新尝试初始化节点信息。

到此这篇关于Redis 集群模式(Cluster)原理详解的文章就介绍到这了,更多相关Redis 集群模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈Redis处理接口幂等性的两种方案

    浅谈Redis处理接口幂等性的两种方案

    本文主要介绍了浅谈Redis处理接口幂等性的两种方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Redis中如何设置日志

    Redis中如何设置日志

    这篇文章主要介绍了Redis中如何设置日志问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Redis是单线程的吗

    Redis是单线程的吗

    Redis使用单线程的原因就是多线程并不能有效提升Redis的性能,相反可能还会降低性能,所以自然而然使用单线程,本文给大家详细介绍了Redis为什么是单线程的,感兴趣的朋友跟随小编一起看看吧
    2023-06-06
  • Redis主从/哨兵机制原理分析

    Redis主从/哨兵机制原理分析

    本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故障转移等步骤,确保Redis集群的高可用性
    2025-01-01
  • 详解如何使用Redis实现分布式锁

    详解如何使用Redis实现分布式锁

    Redis 作为一个独立的三方系统,其天生的优势就是可以作为一个分布式系统来使用,因此使用 Redis 实现的锁都是分布式锁,所以本文就给大家讲讲如何使用Redis实现分布式锁,感兴趣的小伙伴跟着小编来看看吧
    2023-08-08
  • redis key过期监听的实现示例

    redis key过期监听的实现示例

    在Redis中,我们可以为Key设置过期时间,当Key的过期时间到达后,Redis会自动将该Key标记为已失效,本文就来介绍一下redis key过期监听的实现示例,感兴趣的可以了解一下
    2024-03-03
  • 关于Redis未授权访问漏洞利用的介绍与修复建议

    关于Redis未授权访问漏洞利用的介绍与修复建议

    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API,下面这篇文章主要给大家介绍了关于Redis未授权访问漏洞利用的介绍和修复建议,文中介绍的非常详细,需要的朋友可以参考下。
    2017-07-07
  • 解决redis批量删除key值的问题

    解决redis批量删除key值的问题

    在开发过程中,会遇到要批量删除某种规则的key值,但是通常情况下没有批量删除某一个类的命令,遇到这种情况该如何处理呢?下面小编给大家带来了redis批量删除key值的问题,感兴趣的朋友一起看看吧
    2022-03-03
  • 详解Redis BoundValueOperations使用及实现

    详解Redis BoundValueOperations使用及实现

    BoundValueOperations是Spring Data Redis中一个非常实用的工具,本文主要介绍了Redis BoundValueOperations使用,具有一定的参考价值,感兴趣的可以了解一下
    2025-09-09
  • Redis缓存和数据库的数据一致性的问题解决

    Redis缓存和数据库的数据一致性的问题解决

    随业务增长,直接操作数据库性能下降,引入缓存提高读性能常见,但缓存和数据库的双写操作会引发数据不一致问题,本文讨论几种常用同步策略,感兴趣的可以了解一下
    2024-09-09

最新评论