首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 基本架构:一个键值数据库包含什么?
02 | 数据结构:快速的Redis有哪些慢操作?
03 | 高性能IO模型:为什么单线程Redis能那么快?
04 | AOF日志:宕机了,Redis如何避免数据丢失?
05 | 内存快照:宕机后,Redis如何实现快速恢复?
06 | 数据同步:主从库如何实现数据一致?
07 | 哨兵机制:主库挂了,如何不间断服务?
08 | 哨兵集群:哨兵挂了,主从库还能切换吗?
09 | 切片集群:数据增多了,是该加内存还是加实例?
10 | 第1~9讲课后思考题答案及常见问题答疑
11 | “万金油”的String,为什么不好用了?
12 | 有一亿个keys要统计,应该用哪种集合?
13 | GEO是什么?还可以定义新的数据类型吗?
14 | 如何在Redis中保存时间序列数据?
15 | 消息队列的考验:Redis有哪些解决方案?
16 | 异步机制:如何避免单线程模型的阻塞?
17 | 为什么CPU结构也会影响Redis的性能?
18 | 波动的响应延迟:如何应对变慢的Redis?
20 | 删除数据后,为什么内存占用率还是很高?
21 | 缓冲区:一个可能引发“惨案”的地方
22 | 第11~21讲课后思考题答案及常见问题答疑
23 | 旁路缓存:Redis是如何工作的?
24 | 替换策略:缓存满了怎么办?
25 | 缓存异常(上):如何解决缓存和数据库的数据不一致问题?
26 | 缓存异常(下):如何解决缓存雪崩、击穿、穿透难题?
27 | 缓存被污染了,该怎么办?
28 | Pika:如何基于SSD实现大容量Redis?
29 | 无锁的原子操作:Redis如何应对并发访问?
30 | 如何使用Redis实现分布式锁?
31 | 事务机制:Redis能实现ACID属性吗?
32 | Redis主从同步与故障切换,有哪些坑?
33 | 脑裂:一次奇怪的数据丢失
34 | 第23~33讲课后思考题答案及常见问题答疑
35 | Codis VS Redis Cluster:我该选择哪一个集群方案?
36 | Redis支撑秒杀场景的关键技术和实践都有哪些?
37 | 数据分布优化:如何应对数据倾斜?
38 | 通信开销:限制Redis Cluster规模的关键因素
39 | Redis 6.0的新特性:多线程、客户端缓存与安全
40 | Redis的下一步:基于NVM内存的实践
当前位置:
首页>>
技术小册>>
Redis核心技术与实战
小册名称:Redis核心技术与实战
### 07 | 哨兵机制:主库挂了,如何不间断服务? 在Redis的高可用架构中,哨兵(Sentinel)机制扮演着至关重要的角色,它确保了Redis主从复制架构下的高可用性和故障自动转移能力。当主数据库(master)因故障无法提供服务时,哨兵系统能够自动检测这一状态,并触发一系列操作,包括选举新的主库、重新配置从库(slave)以及通知客户端更新连接信息,从而在不中断服务的前提下实现故障恢复。本章将深入解析Redis哨兵机制的工作原理、配置方法、最佳实践以及常见问题与解决方案。 #### 一、哨兵机制概述 Redis哨兵是一个独立的进程,它监控一个或多个Redis主服务器以及这些主服务器下的所有从服务器。哨兵系统通过发送命令给Redis服务器来检查其运行状态,包括服务器是否在线、主从复制是否正常运行等。当哨兵检测到主服务器出现故障(如宕机、无法响应等)时,它会执行一系列自动化操作来恢复服务的高可用性。 #### 二、哨兵机制的工作原理 1. **监控(Monitoring)**:哨兵会定期向所有被监控的Redis服务器发送PING命令,以检查它们是否在线。同时,哨兵也会订阅这些服务器的`__sentinel__:hello`频道,以获取其他哨兵的信息,实现哨兵之间的互相发现和通信。 2. **自动发现(Auto-discovery)**:哨兵通过读取Redis服务器的配置文件或询问Redis服务器本身来自动发现从服务器。这使得哨兵能够监控整个Redis集群的状态。 3. **主观下线(Subjective Down)**:如果哨兵在给定的时间内(由配置项`down-after-milliseconds`指定)没有收到某个Redis服务器的有效回复,那么它会将该服务器标记为主观下线。主观下线是哨兵自己的判断,可能由于网络分区等原因导致误判。 4. **客观下线(Objective Down)**:当足够数量的哨兵(由配置项`quorum`指定)都将同一个Redis服务器标记为主观下线时,该服务器会被标记为客观下线。客观下线的判断更加可靠,是触发故障转移的前提。 5. **选举领导者(Leader Election)**:在确认主服务器客观下线后,哨兵之间会进行领导者选举。选举出的领导者哨兵将负责执行故障转移操作。 6. **故障转移(Failover)**:领导者哨兵会选择一个从服务器作为新的主服务器,并更新其他从服务器和客户端的配置,使它们指向新的主服务器。同时,领导者哨兵还会发布新的配置信息到所有哨兵和Redis服务器,确保整个集群的一致性。 7. **持续监控(Continuous Monitoring)**:故障转移完成后,哨兵会继续监控新的主服务器和其他从服务器,确保系统的稳定性和可靠性。 #### 三、哨兵配置 配置哨兵主要涉及编辑哨兵的配置文件(通常为`sentinel.conf`),该文件包含了哨兵的基本信息和监控的Redis服务器列表。以下是一个基本的哨兵配置示例: ```bash # 哨兵标识符 sentinel monitor mymaster 127.0.0.1 6379 2 # 哨兵认为服务器已经下线所需要的毫秒数 sentinel down-after-milliseconds mymaster 60000 # 如果在这个时间内未能完成failover操作,则认为本次failover失败 sentinel failover-timeout mymaster 180000 # 平行执行的从服务器数量 sentinel parallel-syncs mymaster 1 # 通知配置(可选) # sentinel notification-script mymaster /path/to/your/script.sh # sentinel client-reconfig-script mymaster /path/to/your/script.sh ``` 在这个配置中,`sentinel monitor`命令用于指定哨兵监控的Redis主服务器,其中`mymaster`是哨兵监控组的名称,`127.0.0.1 6379`是主服务器的IP地址和端口号,`2`是执行故障转移操作所需的哨兵数量(即quorum值)。 #### 四、最佳实践 1. **部署多个哨兵实例**:为了提高系统的容错能力,建议部署多个哨兵实例,并确保它们分布在不同的物理或虚拟机器上。 2. **合理配置哨兵参数**:根据实际情况调整`down-after-milliseconds`、`failover-timeout`等参数,以避免误判或延长故障恢复时间。 3. **使用持久化**:确保Redis主服务器开启了RDB或AOF持久化,以便在故障转移后能够恢复数据。 4. **监控与告警**:结合使用第三方监控工具(如Prometheus、Grafana等)和哨兵自身的通知脚本,实现对Redis集群状态的实时监控和告警。 5. **定期演练**:定期进行故障转移演练,以验证哨兵机制的有效性和配置的合理性。 #### 五、常见问题与解决方案 1. **哨兵无法检测到主服务器故障**: - 检查哨兵与Redis服务器之间的网络连接。 - 确认哨兵配置文件中的Redis服务器地址和端口号是否正确。 - 检查哨兵的`down-after-milliseconds`参数设置是否合理。 2. **故障转移失败**: - 检查是否有足够的哨兵实例参与故障转移决策(达到quorum值)。 - 查看哨兵日志,分析故障转移失败的具体原因。 - 确保从服务器能够正常连接到新的主服务器,并开始数据同步。 3. **客户端连接问题**: - 确保客户端在连接Redis时使用了哨兵提供的服务发现机制,而不是直接连接到固定的Redis服务器地址。 - 在客户端配置中设置合理的重试和超时策略,以应对网络波动和Redis服务器故障。 4. **数据一致性问题**: - 确保Redis主服务器开启了持久化,并在故障转移后检查数据完整性。 - 对于关键业务数据,考虑使用Redis集群或其他分布式数据库解决方案来提高数据的安全性和可用性。 通过深入理解Redis哨兵机制的工作原理、合理配置哨兵参数、遵循最佳实践以及及时解决常见问题,可以构建出高可用、稳定的Redis服务架构,确保在主库故障时能够不间断地提供服务。
上一篇:
06 | 数据同步:主从库如何实现数据一致?
下一篇:
08 | 哨兵集群:哨兵挂了,主从库还能切换吗?
该分类下的相关小册推荐:
Redis的Lua脚本编程
Redis面试指南
Redis零基础到实战