Redis 集群怎么实现高可用

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis 集群怎么实现高可用

Redis  集群怎么实现高可用


高可用首先要解决集群部分失败的场景:

  • 当集群内少量节点出现故障时通过自动故障转移保证集群可以对外提供服务。

故障发现


首先需要通过一种健壮的方式识别出节点是否发生了故障。 Redis 集群内节点通过 ping/pong 消息实现节点通讯, 消息不但可以传播节点槽信息,还可以传播其他状态:主从状态、节点故障等。

故障发现也是通过消息传播机制实现的。

  • 主观下线

指某个节点任务另外一个节点不可用,即下线状态,这个状态并不是最终的故障判定。只能代表一个节点的意见,可能存在误判。

  • 客观下线

指标记一个节点真正的下线, 集群内多个节点都认为该节点不可用。从而达成共识的结果,如果持有槽的主节点故障,要为该节点进行故障转移。


主观下线


集群中每个节点都会定期向其他节点发送 ping 消息,接收节点回复 pong 消息作为响应。如果 cluster-node-timeout 时间内通讯一致失败,则发送节点会任务接收节点存在故障,会把接收节点标记为主观下线(pfail)状态

image.png

客观下线


当节点判断另外一个节点主观下线后,相应的节点状态会在集群中传播,ping/pong 消息的消息体会携带集群其他节点状态数据,当接收节点发现消息体重含主观下线的节点状态,会在本地故障找到故障节点的 ClusterNode 结构,保存到下线报告链。当半数以上持有槽节点都标记节点是主观下线时,触发客观下线。

image.png

尝试客观下线

集群中的节点每次接收其他节点的 pfail 状态,都会尝试触发客观下线,流程如下:

  1. 首次统计有效的下线报告数量,如果小于集群内持有操的主节点总数的一般则退出。
  2. 当下线报告大于槽主节点数量一半时,标记对应故障节点为客观下线状态。
  3. 向集群广播一条 fail 信息,通知所有的节点故障节点标记为客观下线,fail 消息的消息体只包含故障节点的 I

image.png

其中广播 Fail 消息是集群内客观下线的最后一步:

  • 通知集群内所有节点标记故障节点为客观下线状态并立刻生效
  • 通知故障节点的从节点触发故障转移流程。


故障恢复


当故障节点变成客观下线之后,如果下线节点是持有槽的主节点,需要从他的一个从节点中选一个替换,从而保证集群的高可用。

故障恢复过程:

  1. 资格检查

每个从节点都要检查和主节点断线时间,判断是否有资格替换故障的主节点,如果从节点与主节点断线时间超过 cluster-mode-time*cluster-slave-validity-factor, 则当前节点不具备故障转译资格。cluster-slave-validity-factor 默认为10。

  1. 准备选举时间

当从节点复合故障转译资格,更新触发故障选举的时间,只有到达时间后才能执行后续流程。

  1. 发起选举

当从节点定时任务检测到达故障选举时间(failover_auth_time)到达后,发起选举流程如下:

  • 更新配置纪元

配置纪元是一个只增不减的整数,每个节点自身维护一个配置纪元(clusterNode.configEpoch)标示当前主节点的版本,所有节点的配置纪元都不相等,从节点会复制主节点的配置纪元。整个机器又维护一个全局的配置纪元(clusterState.currentEpoch).用于记录机器内所有主节点日志纪元的最大版本。

  1. 选举投票

只有持有槽节点才会处理故障选举信息(FAILOVER_AUTH_REQUEST),因为每个持有槽的节点在一个配置纪元内都有唯一的一张选票。当接到第一个请求投票的从节点时回复 FAILOVER_AUTH_ACK 消息作为投票,之后相同配置纪元内其他及选举信息将忽略。

image.png

选举过程

投票过程其实是一个领导者选举过程,如果集群内有N个持有槽的主节点代表有N张选票,由于在每个配置纪元内持有槽的主节点只能投票给一个从节点,因此有一个从节点获得 N/2+1 的选票能够保证找出唯一的从节点。

Redis 集群没有直接使用从节点进行领导者选举。主要因为从节点必须大于等于 3个才能保证凑够 N/2+1 个节点。将导致资源浪费。使用集群内所有持有槽的主节点进行领导者选举,即使只有一个从节点也可以完成选举过程。当从节点收集到 N/2+1 持有槽的主节点投票时,从节点可以执行替换主节点操作。

image.png

替换主节点
  1. 当前从节点强制变成主节点。
  2. 执行 cluserDelSlot 操作撤销故障主节点负责的槽,并执行 CluserAddSlot 将这些槽委派给自己。
  3. 向集群广播自己的pong 消息,通知集群内所有节点当前从节点变为主节点并接管了故障主节点的槽信息。
相关文章
|
3月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
314 2
|
1月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
320 5
|
2月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
7月前
|
存储 NoSQL 数据库
Redis 逻辑数据库与集群模式详解
Redis 是高性能内存键值数据库,广泛用于缓存与实时数据处理。本文深入解析 Redis 逻辑数据库与集群模式:逻辑数据库提供16个独立存储空间,适合小规模隔离;集群模式通过分布式架构支持高并发和大数据量,但仅支持 database 0。文章对比两者特性,讲解配置与实践注意事项,并探讨持久化及性能优化策略,助你根据需求选择最佳方案。
270 5
|
4月前
|
负载均衡 NoSQL Redis
【赵渝强老师】Redis的主从复制集群
Redis主从复制是指将一台Redis服务器的数据复制到其他Redis服务器,实现数据热备份、故障恢复、负载均衡及高可用架构的基础。主节点负责写操作,从节点同步数据并可提供读服务,提升并发处理能力。
145 5
|
3月前
|
存储 NoSQL 算法
Redis的集群架构与使用经验
本文介绍了Redis的集群架构与使用经验,包括主从复制、哨兵集群及Cluster分片集群的应用场景与实现原理。内容涵盖Redis主从同步机制、数据分片存储方式、事务支持及与Memcached的区别,并讨论了Redis内存用尽时的处理策略。适用于了解Redis高可用与性能优化方案。
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
481 2
基于Redis的高可用分布式锁——RedLock
|
7月前
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构
|
8月前
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用的算法是哈希槽分区算法。Redis集群中有16384个哈希槽(槽的范围是 0 -16383,哈希槽),将不同的哈希槽分布在不同的Redis节点上面进行管理,也就是说每个Redis节点只负责一部分的哈希槽。在对数据进行操作的时候,集群会对使用CRC16算法对key进行计算并对16384取模(slot = CRC16(key)%16383),得到的结果就是 Key-Value 所放入的槽,通过这个值,去找到对应的槽所对应的Redis节点,然后直接到这个对应的节点上进行存取操作