Redis高可用(主从复制、哨兵模式)详解
Redis是一种高性能的键值存储系统,能够通过多种机制来实现高可用性,这些机制主要包括主从复制(Replication)和哨兵模式(Sentinel)。
Redis 主从复制(Replication)
一、主从复制简介
Redis的主从复制是一种实现数据冗余和读写分离的机制,通过将数据从主节点(Master)复制到一个或多个从节点(Slave),确保系统中有多个副本以提高数据可靠性和读取性能。
二、工作原理
1. 主节点和从节点
- 主节点(Master):处理所有的写操作,并将数据变化传播到从节点。
- 从节点(Slave):复制主节点的数据,并提供只读访问。当主节点发生变化时,从节点会同步这些变化。
2. 数据传输方式:异步复制
- Redis的主从复制主要是异步的,即主节点在完成写操作后并不等待从节点的确认。
- 从节点会周期性地向主节点请求同步数据。
三、主从复制过程
1. 初次同步(全量复制)
当一个从节点第一次连接到主节点或重新连接时,会进行全量复制:
- 从节点发送同步命令:从节点向主节点发送
PSYNC
命令,请求同步数据。 - 主节点生成RDB文件:主节点执行一个后台保存操作(
BGSAVE
),并生成一个新的RDB快照文件。 - 主节点发送RDB文件:生成的RDB文件通过网络发送到从节点,从节点接收后加载到内存中。
- 主节点发送缓冲区数据:在主节点生成RDB文件期间,所有写操作的命令会被暂存在缓冲区中。RDB文件发送完毕后,这些缓冲区中的命令会被依次发送给从节点。
- 从节点应用命令:从节点将接收到的增量命令应用到自身的数据集中,以保持与主节点的数据一致。
2. 增量同步(部分复制)
在全量复制之后,主从节点之间进行的是增量同步,也称为部分复制:
- 增量复制:主节点将所有新的写操作命令发送给从节点。
- 命令传播:主节点会对每个写操作生成相应的Redis命令,并通过复制流发送给从节点。
- 从节点执行命令:从节点接收到命令后,立即执行这些命令来更新自身数据。
3. 断线重连
- 在网络故障或其他原因导致主从断线时,从节点会自动尝试重新连接主节点。
- 如果重新连接成功,并且主节点的复制积压缓冲区(
Replication Backlog
)中仍然有未发送给从节点的数据,则可以进行部分复制,避免重新进行全量复制。
四、配置步骤
1. 主节点配置
主节点不需要特别配置,只需启动一个Redis实例即可。
2. 从节点配置
在从节点的配置文件(redis.conf)(永久的)中,设置以下参数:
replicaof <master-ip> <master-port>
如果主节点的IP地址为192.168.1.100,端口为6379,配置如下:
replicaof 192.168.1.100 6379
或者在从节点运行时(暂时的)使用命令:
SLAVEOF 192.168.1.100 6379
五、复制细节和优化
1. 复制积压缓冲区(Replication Backlog)
- 定义:这是一个固定大小的环形缓冲区,用于存储最近的写操作命令。
- 作用:在从节点短时间断开后重连时,可以利用缓冲区中的数据进行部分复制,避免全量复制。
- 配置:可以通过
repl-backlog-size
参数设置缓冲区大小。
2. 心跳机制
- 作用:保持主从节点之间的连接存活,并监控复制状态。
- 机制:从节点周期性地发送
PING
命令给主节点,主节点响应PONG
。如果主节点长时间没有收到从节点的心跳,会标记该从节点为失效。
3. 复制延迟
- 定义:从节点同步数据的速度可能会滞后于主节点,产生延迟。
- 原因:网络状况、从节点负载等。
- 监控:可以通过
INFO replication
命令查看复制延迟。
二、Redis哨兵模式(Sentinel)
Redis Sentinel是一个健壮的分布式系统,其中多个Sentinel需要就给定的主节点不再可用的事实达成一致。然后,故障转移过程开始选择一个新的主节点。
一、工作原理
哨兵模式通过一组哨兵进程来监控主从结构的健康状态,确保系统的自动化故障转移和通知功能。
哨兵(Sentinel)是一个重要的组件,负责监控Redis集群中的主节点(Master)和从节点(Slave),并在主节点失效时自动进行故障转移。
1. 监控
- 哨兵群集:通常由多个哨兵节点组成,它们通过选举形成一个领导者,负责执行监控任务。
- 监控对象:哨兵节点定期向Redis主节点和从节点发送
PING
命令,检查它们是否可达。
2. 故障检测
- 主节点失效检测:当哨兵节点检测到主节点不可达时,会将其标记为下线。
- 从节点失效检测:如果一个从节点失效,哨兵会通知主节点,并在必要时将其重新配置为新的从节点。
3. 故障转移
- 选举领导者:哨兵群集中的哨兵会进行选举,选择一个哨兵作为领导者负责执行故障转移操作。
- 选举条件:通过Raft算法进行选举,选举条件包括优先级、运行ID等。
4. 自动故障转移
- 故障转移过程:
- 哨兵检测到主节点失效后,从当前的从节点中选举一个升级为新的主节点。
- 哨兵更新集群中其他从节点的配置,使它们成为新主节点的从节点。
- 客户端和应用可以通过哨兵的监听地址连接到新的主节点。
5. 手动故障转移
- 手动干预:管理员可以通过哨兵提供的命令手动触发故障转移过程,以便在维护期间进行控制和调整。
二、哨兵选举机制
在Redis Sentinel中,选举机制是确保在主节点(Master)失效后,哨兵群集能够协作选举出一个新的主节点的关键过程。
1. 哨兵领导者选举
Redis Sentinel中的哨兵节点在运行时会进行领导者选举,领导者负责执行故障检测和故障转移操作。选举过程基于Raft算法的思想,但具体实现可能有所不同。
-
哨兵运行ID(runid):每个哨兵节点在启动时生成一个唯一的runid,用于标识该哨兵节点的身份。
-
优先级(priority):哨兵节点可以配置一个优先级,用于决定在选举领导者时的重要性。
选举条件:
-
单一领导者:在任何时刻,哨兵群集中应该只有一个领导者,以确保操作的一致性和可靠性。
-
运行ID比较:哨兵根据各自的运行ID来决定谁应该成为领导者。通常,具有最新运行ID的哨兵会有更高的优先级。
-
优先级考量:如果多个哨兵具有相同的运行ID,优先级较高的哨兵将更有可能被选为领导者。
2. 主节点故障后的选举过程
当哨兵检测到Redis的主节点失效时,选举新的主节点的过程通常如下:
-
哨兵检测失效:一旦哨兵节点检测到主节点不可用(例如通过心跳检测),它会开始选举新的主节点。
-
选举领导者:哨兵群集中的哨兵节点开始通信,以决定哪一个哨兵节点将负责执行故障转移。通常,哨兵节点会互相通信,比较彼此的优先级和运行ID来决定新的领导者。
-
执行故障转移:一旦新的领导者选举出来,它将负责将一个从节点提升为新的主节点,并更新其他哨兵节点和从节点的配置,确保整个Redis集群能够继续工作。