3分钟,跟着Redist Cluster搞懂分布式协议

前面几篇学习了分布式的几大协议,强一致性的Raft,最终一致性的Gossip,用于负载均衡的一致性哈希及具体实现等等。本篇我们结合Redis Cluster聊聊分布式协议的具体落地实践。

Redis Cluster 概要

Redis Cluster是Redis 分布式部署的方案,它可以自动将数据集通过分片分布在多个Redis节点之间,同时支持动态扩容缩容,并提供故障转移等高可用解决方案。

数据分片--类一致性哈希

如果不了解一致性哈希的,可以看看(图文并茂,讲透一致性哈希,负载均衡绝招 - 掘金 (juejin.cn))

我们知道,Redis Cluster是去中心化的。不同节点存储不同的数据,这必定涉及到分片算法。下面看实现:

Redis Cluster的整个数据分为16384个哈希槽,数据一定属于16384个哈希槽的其中一个,同时一个节点管理一部分哈希槽。所以Redis Cluster实现分片的步骤如下

  1. 通过crc16() 对 Key ,计算出一个 16bit的值
  2. 将16bit值对16384取模
  3. 取模的结果就是数据分布的哈希槽,然后查询出负责该槽位的 Redis节点,进行存储。

大致如下图

怎么说,是不是有点一致性哈希的味道。不对啊,那对应的虚拟节点呢??

其实在集群中,Redis的某一个节点,它可以管理多个范围的哈希槽。比如 某一结点指定负责 0~5461,10922 ~ 14382两部分哈希槽。这不就是 虚拟节点的效果吗🤗🤗。

但要注意,Redis官方也表示没有采用一致性哈希算法,而是借鉴了一致性哈希的思想

高可用选举和信息传播(类Raft和Gossip)

一般Redis集群部署的每个主节点,都会有从节点,以便主节点宕机故障转移。如下图

第一个问题,Redis Cluster如何确定一个master宕机下线? (以上图 MasterA为例)

等等,这不就是一个分布式共识问题吗,由于Redis Cluster是去中心化的,而且要保证可用必须牺牲一致性。根据前面文章的介绍,兼有去中心化和最终一致性两个特点的共识算法 当然是 Gossip协议啦。 关于Gossip可以参考(言简意赅--聊聊分布式Gossip协议 - 掘金 (juejin.cn))

所以Redis使用Gossip协议两两节点交换信息以便来广播自己的状态,如果一个节点发现 某一主节点 例如 master A失联了,则向集群中广播该节点失联。最后确定此masterA下线。

第二个问题,如和在从节点列表选举一个新的主节点

当 slave A2,slave A3发现自己 master A宕机后,便成为候选人,然后向整个集群中发起选举。当一个slave收到大多数节点投票,就成为新的 masterA。 Raft选举可以参考 我之前写的(言简意赅--聊聊Raft协议 - 掘金 (juejin.cn))

总结

Redis Cluster 通过一致性哈希的思想,实现高效的数据分片。通过Gossip协议进行节点之间的健康检查,通过Raft的选举实现了故障转移,保证了可用性。

市面上分布式组件成百上千,但核心还是那几套协议,一致性协议,选举协议,负载均衡协议等等。

我是爱聊技术的山人,大伙下期再见😊😊😊😊

相关推荐
Victor3561 小时前
Redis(158)Redis的主从同步问题如何解决?
后端
Victor3561 小时前
Redis(159)Redis的集群问题如何解决?
后端
LDG_AGI1 小时前
【推荐系统】深度学习训练框架(八):PyTorch分布式采样器DistributedSampler原理详解
人工智能·pytorch·分布式·深度学习·算法·机器学习·推荐算法
无心水2 小时前
【分布式利器:分布式ID】6、中间件方案:Redis/ZooKeeper分布式ID实现
redis·分布式·zookeeper·中间件·分库分表·分布式id·分布式利器
后端小张3 小时前
【JAVA进阶】Spring Boot 核心知识点之自动配置:原理与实战
java·开发语言·spring boot·后端·spring·spring cloud·自动配置
X***C8628 小时前
SpringBoot:几种常用的接口日期格式化方法
java·spring boot·后端
i***t9198 小时前
Spring Boot项目接收前端参数的11种方式
前端·spring boot·后端
o***74179 小时前
基于SpringBoot的DeepSeek-demo 深度求索-demo 支持流式输出、历史记录
spring boot·后端·lua
9***J6289 小时前
Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
java·spring boot·后端
S***q1929 小时前
Rust在系统工具中的内存安全给代码上了三道保险锁。但正是这种“编译期的严苛”,换来了运行时的安心。比如这段代码:
开发语言·后端·rust