首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
开篇词 | 阅读Redis源码能给你带来什么?
01 | 带你快速攻略Redis源码的整体架构
02 | 键值对中字符串的实现,用char*还是结构体?
03 | 如何实现一个性能优异的Hash表?
04 | 内存友好的数据结构该如何细化设计?
05 | 有序集合为何能同时支持点查询和范围查询?
06 | 从ziplist到quicklist,再到listpack的启发
07 | 为什么Stream使用了Radix Tree?
08 | Redis server启动后会做哪些操作?
09 | Redis事件驱动框架(上):何时使用select、poll、epoll?
10 | Redis事件驱动框架(中):Redis实现了Reactor模型吗?
11 | Redis事件驱动框架(下):Redis有哪些事件?
12 | Redis真的是单线程吗?
13 | Redis 6.0多IO线程的效率提高了吗?
14 | 从代码实现看分布式锁的原子性保证
15 | 为什么LRU算法原理和代码实现不一样?
16 | LFU算法和其他算法相比有优势吗?
17 | Lazy Free会影响缓存替换吗?
18 | 如何生成和解读RDB文件?
19 | AOF重写(上):触发时机与重写的影响
20 | AOF重写(下):重写时的新写操作记录在哪里?
21 | 主从复制:基于状态机的设计与实现
22 | 哨兵也和Redis实例一样初始化吗?
23 | 从哨兵Leader选举学习Raft协议实现(上)
24 | 从哨兵Leader选举学习Raft协议实现(下)
25 | Pub/Sub在主从故障切换时是如何发挥作用的?
26 | 从Ping-Pong消息学习Gossip协议的实现
27 | 从MOVED、ASK看集群节点如何处理命令?
28 | Redis Cluster数据迁移会阻塞吗?
29 | 如何正确实现循环缓冲区?
30 | 如何在系统中实现延迟监控?
31 | 从Module的实现学习动态扩展功能
32 | 如何在一个系统中实现单元测试?
当前位置:
首页>>
技术小册>>
Redis源码剖析与实战
小册名称:Redis源码剖析与实战
### 23 | 从哨兵Leader选举学习Raft协议实现(上) 在Redis的高可用架构中,哨兵(Sentinel)系统扮演着至关重要的角色,它负责监控Redis主从集群的健康状态,并在主节点故障时自动进行故障转移,确保服务的连续性和可用性。哨兵系统内部实现了一种类似领导者选举的机制来确保决策的一致性,这种机制虽然并非直接基于Raft协议,但通过学习哨兵选举的过程,我们可以深入理解分布式系统中领导者选举的核心思想,进而探讨Raft协议这一经典分布式一致性算法的实现原理。本章将分为上下两部分,上部分主要聚焦于哨兵选举的基础知识及其与Raft协议的共通之处,为下部分深入Raft协议的具体实现打下基础。 #### 一、哨兵系统概述 Redis哨兵是一个独立的进程,它独立于Redis主从复制系统之外运行,用于监控Redis服务器的运行状态。哨兵系统可以配置为监控一个或多个Redis主服务器,以及这些主服务器下的所有从服务器和额外的哨兵实例。当哨兵检测到主服务器进入客观下线状态时(即多个哨兵都认为该主服务器不可达),它会启动一个领导者选举过程,以决定哪个哨兵负责执行故障转移操作。 #### 二、哨兵Leader选举机制 哨兵Leader选举并非Redis官方文档中明确提及的Raft或Paxos等具体算法的实现,但它确实遵循了分布式系统中领导者选举的一些基本原则。以下是哨兵选举过程的大致步骤: 1. **发现与通信**:哨兵之间通过定期发送心跳信息来相互发现和保持通信。这些心跳信息包含了哨兵监控的Redis服务器的状态信息。 2. **主观下线**:如果哨兵在配置的时间间隔内未能从某个Redis服务器接收到有效回复,它会将该服务器标记为主观下线。 3. **客观下线**:当足够数量的哨兵(由配置决定)都将同一个Redis服务器标记为主观下线时,该服务器被认定为客观下线。这是触发故障转移的前提条件。 4. **领导者选举**: - **候选者产生**:在确认主服务器客观下线后,每个哨兵都有可能成为领导者候选者,但并非所有哨兵都会立即尝试成为领导者。 - **选举过程**:哨兵之间通过发送特定的选举消息(如`SENTINEL is-master-down-by-addr`命令的响应)来协商领导者。选举的具体实现依赖于哨兵之间的通信和状态同步。 - **领导者确认**:一旦某个哨兵获得了足够的支持(例如,通过多数哨兵的认可),它就被视为领导者,并承担起故障转移的责任。 5. **故障转移**:领导者哨兵将执行故障转移操作,包括选择一个新的主服务器(通常是从现有的从服务器中挑选),更新配置,并通知其他哨兵和客户端新的主服务器地址。 #### 三、哨兵选举与Raft协议的共通之处 虽然哨兵选举的具体实现细节并未完全遵循Raft协议,但两者在领导者选举的核心理念上存在诸多共通之处: 1. **多数派原则**:无论是哨兵选举还是Raft协议,都强调通过多数派(majority)来确保决策的一致性和系统的容错性。在哨兵选举中,多个哨兵的共同认可使得主服务器下线的判断更加可靠;在Raft中,领导者的选举和日志的复制同样依赖于多数派的确认。 2. **领导者与跟随者角色**:两者都明确区分了领导者(Leader)和跟随者(Follower)的角色。在哨兵系统中,领导者负责执行故障转移操作;在Raft中,领导者负责处理客户端请求并复制日志到跟随者。 3. **日志复制与状态同步**:虽然哨兵系统不直接处理日志复制,但它通过心跳和选举消息来同步状态信息,确保所有哨兵对集群状态有一致的认识。Raft协议则通过日志复制机制来确保所有节点上的日志内容一致,从而维护系统状态的一致性。 4. **故障恢复与容错**:两者都具备处理节点故障和恢复的能力。哨兵系统通过自动故障转移来应对主服务器故障;Raft协议则通过领导者选举和日志复制来确保在部分节点故障时系统仍能继续运行。 #### 四、Raft协议简介(为下部分铺垫) 鉴于本章标题提及了从哨兵选举学习Raft协议实现,接下来简要介绍Raft协议的基本概念,为下部分深入解析Raft协议的实现细节做铺垫。 Raft是一种用于管理复制日志的共识算法,它通过将共识算法分解为几个相对独立的子问题(领导者选举、日志复制、安全性和日志压缩)来简化理解和实现。Raft协议中的每个节点都处于以下三种状态之一:领导者(Leader)、候选者(Candidate)或跟随者(Follower)。 - **领导者**:负责处理客户端请求,并将这些请求作为新的日志条目追加到本地日志中,然后并行地将这些条目复制到所有跟随者节点。 - **候选者**:在选举过程中,如果跟随者在一段时间内未收到领导者的心跳消息,它会转变为候选者状态,并尝试成为新的领导者。 - **跟随者**:简单地响应来自领导者或候选者的请求,如日志复制请求或投票请求。 Raft协议通过精心设计的选举机制和日志复制流程,确保了即使在部分节点故障的情况下,系统也能保持高可用性和数据一致性。 #### 结语 本章通过对比哨兵系统的Leader选举机制与Raft协议的基本概念,展示了分布式系统中领导者选举的共通之处,并为下部分深入解析Raft协议的实现细节做了铺垫。哨兵选举虽然并非Raft协议的直接应用,但它为我们理解分布式一致性算法提供了宝贵的视角。在下一部分中,我们将详细探讨Raft协议的具体实现细节,包括领导者选举的具体流程、日志复制的机制、安全性保障措施以及日志压缩等高级特性。
上一篇:
22 | 哨兵也和Redis实例一样初始化吗?
下一篇:
24 | 从哨兵Leader选举学习Raft协议实现(下)
该分类下的相关小册推荐:
Redis面试指南
Redis核心技术与实战
Redis零基础到实战
Redis的Lua脚本编程