Redis:主从复制与哨兵模式解析
在分布式系统中,保证数据高可用和服务不间断是核心需求。Redis通过主从复制(Replication) 实现数据的多副本备份,再通过哨兵模式(Sentinel) 实现故障的自动发现与转移,共同构成了Redis高可用架构的坚实基础。
一、主从复制:数据同步的根基
主从复制是Redis实现数据冗余、读写分离和高可用的基础。它允许一个Redis服务器(Slave/Replica)精确地复制另一个Redis服务器(Master)的数据。
1. 核心概念
主节点(Master):负责处理写操作(如SET, DEL),并将数据变化同步给从节点。一个主节点可以有多个从节点。
从节点(Slave/Replica):复制主节点的数据,默认处理读操作。一个从节点只能有一个主节点。
2. 工作流程与原理
主从复制的过程主要分为建立连接、数据同步、命令传播三个阶段。
建立连接:
在从节点配置文件中指定主节点的IP和端口或启动后使用
REPLICAOF
命令。从节点会与主节点建立一个Socket连接,用于后续命令传输。
数据同步(关键步骤):
连接建立后,从节点会向主节点发送
PSYNC
命令请求同步。主节点执行
BGSAVE
,在后台生成一个RDB快照文件,同时用一个复制缓冲区 记录在生成RDB期间的所有写命令。主节点将RDB文件发送给从节点,从节点先清空自身旧数据,然后加载RDB文件来恢复数据。
主节点再将复制缓冲区中记录的写命令发送给从节点执行,从而保证数据一致性。
命令传播:
完成初始同步后,主节点会异步地将每一个收到的写命令实时地发送给所有从节点。
从节点接收并执行这些命令,从而与主节点保持数据最终一致。
3. 主要作用
数据冗余:实现数据的热备份,是持久化之外的一种数据冗余方式。
读写分离:主节点负责写,从节点可以分担读流量,大幅提升系统读能力。
故障恢复:是后续哨兵和集群模式实现高可用的基础。
二、哨兵模式:自动化的故障转移与治理
主从复制奠定了数据冗余的基础,但未能解决核心问题:当主节点故障时,如何自动进行故障切换并通知客户端? 手动干预效率低下且风险极高。Redis Sentinel(哨兵模式)正是为了解决这一自动化治理问题而设计的分布式系统。
1. 哨兵的本质:独立的监控与治理节点
哨兵是一个独立运行的进程,
redis-sentinel
或redis-server --sentinel
。其核心职责不是存储数据,而是监控Redis主从节点的健康状态,并在主节点故障时自动执行故障转移(Failover) 操作。
为实现决策的可靠性,必须部署多个哨兵实例(通常为3个或以上奇数个),组成一个哨兵集群,以避免自身单点故障。
2. 深入哨兵的工作核心机制
(1)持续监控
每个哨兵节点会以每秒一次的频率向所有被监控的主节点、从节点以及其他哨兵节点发送
PING
命令。通过是否收到有效的
PONG
回复来判断实例是否在线。
(2)主观下线
如果某个哨兵在配置的
down-after-milliseconds
时间内未收到主节点的有效响应,该哨兵会主观地将该主节点标记为“下线”。这是一个局部观点,仅代表这个哨兵自己认为主节点挂了。
(3)客观下线与投票仲裁
主观判断不足为信,因为可能是网络问题导致该哨兵自己与主节点失联。
为了确认主节点是否真的宕机,该哨兵会向其他哨兵节点发送命令,询问它们是否也认为该主节点下线。
当超过法定数量(通常为
quorum
,可配置,例如至少2个)的哨兵都报告主节点主观下线时,领头哨兵才会将主节点状态标记为客观下线(ODOWN)。这是从局部观点上升到集群共识的关键一步,确保了故障判断的准确性。
(4)选举领导者哨兵
一旦确认主节点客观下线,哨兵集群需要选举出一个领导者(Leader) 来负责执行故障转移操作。
选举基于Raft算法类似的思想,每个发现主节点客观下线的哨兵都会要求其他哨兵将自己设为领导者。哨兵们会进行投票,第一个获得多数票的哨兵成为领导者。
由领导者执行后续操作保证了只有一个哨兵来执行故障转移,避免混乱。
(5)故障转移
由选举出的领导者哨兵执行:
筛选新主:领导者会从原主节点的从节点列表中,根据规则(如优先级
slave-priority
、复制偏移量、运行ID等)筛选出一个数据最完整、最健康的从节点作为候选新主节点。提升新主:向候选从节点发送
SLAVEOF NO ONE
命令,使其脱离从节点角色,晋升为新的主节点。切换从属:向其他所有从节点发送
SLAVEOF
命令,让它们转而复制新的主节点。同时,更新配置文件,将已下线的主节点标记为新主节点的从节点,待其恢复后自动以从节点身份重新接入。
(6)服务发现与通知
故障转移完成后,哨兵会自行更新其维护的集群元数据,将新的主节点信息记录下来。
客户端程序(如Jedis、Lettuce)通过订阅哨兵的频道或定时查询哨兵来获取最新的主节点地址,从而自动切换到新的主节点上,整个过程对应用程序透明。
三、总结:主从+哨兵的价值
主从复制(Replication):解决了数据备份和读扩展的问题,是架构的数据层。
哨兵模式(Sentinel):解决了高可用和自动化故障转移的问题,是架构的大脑和神经系统。它通过多实例部署、主观下线、客观下线、领导者选举、故障转移这一套精密的分布式协作流程,实现了对Redis高可用集群的自动化治理。
二者结合,共同构成了一个具备读写分离、数据冗余、自动容灾的完整高可用Redis解决方案。这套方案架构相对简单、易于理解,是构建中小规模、高可用Redis系统的经典选择。