Redis 集群怎么实现高可用

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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 消息,通知集群内所有节点当前从节点变为主节点并接管了故障主节点的槽信息。
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
102 2
基于Redis的高可用分布式锁——RedLock
|
4月前
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
4月前
|
监控 NoSQL Redis
Redis 哨兵模式高可用
Redis 哨兵模式高可用
77 4
|
3月前
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
106 0
|
28天前
|
存储 NoSQL 大数据
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
31 3
|
4月前
|
存储 NoSQL 算法
Redis 集群模式搭建
Redis 集群模式搭建
88 5
|
4月前
|
存储 缓存 NoSQL
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
|
3月前
|
NoSQL Redis
Redis——单机迁移cluster集群如何快速迁移
Redis——单机迁移cluster集群如何快速迁移
112 0
|
4月前
|
缓存 NoSQL Java
Redis Spring配置集群
【7月更文挑战第5天】
75 10