Redis——Raft算法

Raft使用较为广泛的强一致性、去中心化、高可用的分布式协议,即使在网络、节点故障等情况下,多个节点依然能达到一致性。
其中redis、etcd等都用到了这种算法

在Redis集群中,采取的主从复制结构,当主节点宕机后,哨兵会将其中的一个从节点升级为主节点,而其中选举的过程就是Raft算法。

原理:

  • leader:领导者,其负责和客户端通信,接收来自客户端的命令并将其转发给follower
  • follower:跟随者,其一丝不苟的执行来自leader的命令
  • candidate:候选者,当follower长时间没收到 leader的消息就会向成为候选者,抢夺成为leader的资格。

下面我讲一下以一个例子来讲解一下整个的过程:

假设我们有三个哨兵(sentenal1,sentenal2,sentenal3),一个主节点(redis-master),两个从节点(redis-slave1,redis-slave2)

当主节点出现故障,就会触发重新⼀系列过程.在这里插入图片描述

主观下线:当主节点宕机后,此时主节点和3个哨兵之间的心跳没有了。
这是哨兵认为,主节点出现了严重事故,因此三个哨兵均会把主节点判定为主观下线
客观下线:哨兵sentenal1,sentenal2,sentenal3均会对主节点故障进行投票,当故障票数 > 陪定的法定票数的时候,就将它认为是客观下线

假设一共有3个哨兵节点,S1,S2,S3

  • 每个哨兵节点都会给其他哨兵节点发起一个投票请求
  • 此时收到请求的节点会选择是否投还是不投(每个哨兵节点都只有一票)
  • 一轮投票结束后,发现得票数数超过节点的一半的时候,自动升级为leader
  • leader会负责挑选一个从节点升级为新的主节点,当其他的sentenal发现新的主节点出现的时候,就说明选举结束了

那么挑选的规则是什么呢?

  • 比较优先级:优先级高的上位,优先级是slave-priority或者replica-priority
  • 比较replication offset,这个反映了从节点有多少数据和主节点一样,replication offset高的上位
  • 比较run id,谁的id小,谁上位

哨兵节点不能只有一个吗?

当然不能,我们要知道在redis一般是以集群的方式来部署的,那么就有可能哨兵节点挂了,那么就会影响系统的可用性(这是不能忽视的)

哨兵节点设置为奇数还是偶数

哨兵节点设置为奇数,方便选举leader,得票数容易超过总节点的一半

投票时,如果超过了超时时间导致选取不出leader怎么办?

raft算法其实都有考量,所有节点都会被分配不同的超时时间,因为如果都分配相同的超时时间,导致所有节点同时过期,导致无法选举出leader的情况

如果哨兵节点是偶数,出现了平票怎么办

此时,所有节点都会变为follower状态,重新设置随机的超时时间,重新进行选举

<think>嗯,用户这次明确要求了解Redis分布式架构,但提供的引用资料有些混乱——前三条引用都是关于Redis的,而用户上一次讨论的却是Kafka架构。这可能是用户切换话题时忘记更新引用标签了。 用户身份推测:可能是后端开发工程师或系统架构师,正在对比不同消息队列和缓存系统的分布式方案。ta特意强调“参考站内引用”,说明需要权威的技术细节,而非泛泛而谈。 核心需求拆解: 1. 需要体系化的Redis分布式架构分类(主从/哨兵/集群) 2. 关注不同方案的适用场景和选择依据 3. 隐含比较需求——可能正在技术选型 技术要点优先级: 首先必须澄清引用混淆——用户给的[^1][^2][^3]实际对应Redis资料,需重新关联引用。然后重点展开: - 主从复制的异步特性与数据延迟风险[^1] - 哨兵自动故障转移的选举机制[^2] - Cluster槽位分片的数据路由算法[^3] 特别要注意用户上次深度讨论了Kafka的ISR机制,可能会对比Redis的主从同步差异。需要在“数据一致性”部分明确区别:Redis主从是异步复制,不像Kafka有ISR保障。 架构图选择:用mermaid展示Cluster分片逻辑最直观,因为用户上次对Kafka的分区机制表现出兴趣。同时补充哨兵监控状态的文本流程图,避免视觉冗余。 风险提示:用户可能忽略脑裂问题,需在哨兵和Cluster章节强调网络分区时的处理策略。最后用表格对比三种方案,帮助决策——这应该是ta的终极目标。</think>### Redis分布式架构深度解析 Redis分布式架构通过多种方案实现高可用、水平扩展和容错能力,核心方案包括主从复制、哨兵模式和Redis Cluster,以下是详细解析: ```mermaid graph TD A[Redis分布式架构] --> B[主从复制] A --> C[哨兵模式] A --> D[Redis Cluster] B --> E[读写分离] B --> F[数据冗余] C --> G[自动故障转移] C --> H[监控节点状态] D --> I[数据分片] D --> J[水平扩展] ``` --- #### 一、核心架构方案 1. **主从复制 (Replication)** - **架构**:1个主节点(Master) + N个从节点(Slave) - **数据流**: ```mermaid sequenceDiagram Master->>Slave1: 同步RDB快照 Master->>Slave2: 传播写命令 Note over Master,Slave2: 异步复制 ``` - **特性**: - 读写分离:写请求仅限主节点,读请求可分散到从节点 - 数据冗余:从节点保留全量数据副本 - **局限**:主节点单点故障(需人工干预)[^1] 2. **哨兵模式 (Sentinel)** - **组件**:奇数个哨兵节点(监控集群状态) - **核心能力**: - 自动故障检测(心跳机制) - 主节点故障时选举新主节点(基于Raft协议) - 客户端重定向(更新主节点地址) - **故障转移流程**: 1. 哨兵检测主节点失效(`+sdown`) 2. 仲裁确认(`+odown`) 3. 选举Leader哨兵 4. 执行主从切换(`+switch-master`)[^2] 3. **Redis Cluster (集群模式)** - **设计核心**: - **数据分片**:16384个槽位(Slot) $$Slot = CRC16(key) \mod 16384$$ - **去中心化**:节点间通过Gossip协议通信 - **多主架构**:每个分片含主节点+从节点 - **关键机制**: | 机制 | 说明 | |------------------|-----------------------------| | 重定向(MOVED) | 客户端访问错误分片时返回正确节点地址 | | 分片迁移 | 支持动态增删节点并重新分配槽位 | | 跨槽位操作限制 | 需用`Hash Tag`确保多key同分片 | [^3] --- #### 二、方案对比与选型指南 | 特性 | 主从复制 | 哨兵模式 | Redis Cluster | |---------------------|---------------|------------------------|--------------------| | **高可用** | 需人工干预 | 自动故障转移 | 自动故障转移 | | **水平扩展** | 不支持 | 不支持 | 支持动态扩缩容 | | **数据一致性** | 最终一致性 | 最终一致性 | 分区内强一致性 | | **适用场景** | 读密集型业务 | 中小规模生产环境 | 大规模分布式系统 | | **性能瓶颈** | 主节点写入瓶颈 | 哨兵选举延迟 | 跨分片事务限制 | --- #### 三、关键技术实现 1. **数据分区原理** - 哈希槽分配: ```python def assign_slot(key): slot = crc16(key) % 16384 return cluster_nodes[slot].master ``` - 优势:避免一致性哈希的数据倾斜问题 2. **故障检测机制** - 哨兵模式:每秒PING节点,超时(`down-after-milliseconds`)标记主观下线 - Cluster模式:节点间PING/PONG消息,半数节点确认失败则标记下线 3. **脑裂问题防护** - 最小从节点数:`min-replicas-to-write`(主节点需至少同步N个从节点才接受写) - 超时阈值:`cluster-node-timeout`(默认15秒)控制故障判定速度[^2] --- #### 四、典型应用场景 1. **主从复制**:缓存读扩展(电商商品页) 2. **哨兵模式**:会话存储、实时配置中心 3. **Redis Cluster**: - 全球购物车(分片存储用户数据) - 实时排行榜(利用`ZSET`分片计算) > **设计精髓**:通过$$数据局部性 = 分片 \times 副本 \times 协议$$的协同,平衡: > - 性能:单分片10万QPS[^3] > - 可用性:99.99% SLA > - 扩展性:支持PB级数据 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值