73人参与 • 2026-05-11 • Redis
前面的博客介绍了 redis的持久化方式,,redis 的持久化机制能够保障服务重启后数据不丢失,redis 重启时会自动加载硬盘上的持久化文件,将数据恢复到内存中。但持久化只能规避服务重启的数据丢失问题,无法应对服务器硬盘损坏、机器宕机等硬件故障,单节点 redis 存在严重单点故障风险,一旦节点故障会直接造成数据丢失、服务不可用。
同时,redis 本身具备高性能高并发的特性,单台 redis 服务器可以承载大量并发请求。但在电商、社交等超高并发业务场景下,海量的读写请求会集中施压单节点,即便 redis 读写性能优异,也会出现请求阻塞、服务器 cpu 和内存负载过高、性能瓶颈凸显的问题。
为了解决单点数据故障和单节点读写压力过大两大问题,redis 提供了主从复制(主从架构) 机制。主从架构采用一主多从的部署模式:主节点(master) 同时支持读、写操作,负责处理业务新增、修改、删除等写请求;从节点(slave) 仅提供只读服务,不参与写业务。所有从节点会自动异步同步主节点的数据,保持与主节点数据最终一致性。
借助主从结构,一方面实现了读写分离,海量读请求分流到从节点,极大分担主节点压力,提升整体并发承载能力;另一方面从节点作为主节点的数据副本,实现了数据异地备份,主节点硬件故障或宕机时,可快速依托从节点恢复服务,彻底解决单节点的单点故障问题。
需要注意的是主从复制过程默认非阻塞,主节点在进行数据同步时,仍可正常处理客户端请求,不影响业务可用性。
如下图:

主从复制的原理
redis 主从复制分为建立连接、全量同步、增量同步三个核心阶段,整体采用异步复制机制:
5. 从节点启动后,主动与主节点建立网络通信连接,成功握手后,向主节点发起数据同步请求。
6. 主节点接收到从节点的同步请求后,触发bgsave后台持久化,生成 rdb 快照文件;同时将生成 rdb 期间新产生的写命令暂存到缓冲区。随后主节点把完整的 rdb 文件传输给从节点。
7. 从节点接收 rdb 文件后,清空自身原有数据,加载 rdb 文件完成全量数据同步,复刻主节点当前全量数据。
8. 全量同步完成后进入增量同步阶段:主节点每执行一次写操作(增、删、改),都会将对应的命令异步复制发送给所有从节点;从节点持续执行同步过来的命令,始终保持与主节点数据一致。
补充:redis 2.8 及以上版本采用psync替代旧版sync,支持部分重同步,网络短暂断开重连后无需重新全量同步,仅同步断开期间缺失的数据,效率更高。
主从复制的核心作用
主从配置
主节点默认无需特殊配置,从节点修改配置文件,如下:

指定主节点地址和端口,redis5.0+用replicaof,5.0前用slaveof
启动各节点
需要注意的是先启动主节点生效再启动从节点生效

演示:主节点写,从节点同步主节点数据

演示:从节点只能读不能写

redis 哨兵是 redis 官方提供的高可用监控与自动故障转移组件,专门解决主从架构中主节点故障后需手动切换的问题。它本质是一个独立的 redis 进程(非主从节点),通常以集群形式部署,实现主节点故障的自动化恢复。
哨兵的核心工作原理

创建哨兵节点
mkdir -p /usr/local/src/redis/sentinel-demo/data/{26379,26380,26381}编写各个哨兵的核心配置文件(sentinel.conf)
vi sentinel_26379.conf cp sentinel_26379.conf sentinel_26380.conf cp sentinel_26379.conf sentinel_26381.conf
修改各个配置文件中的数据目录和日志文件位置

daemonize yes port 26379 bind 0.0.0.0 protected-mode no dir "/usr/local/src/redis/sentinel-demo/data/26379" logfile "/usr/local/src/redis/sentinel-demo/data/26379/sentinel.log" sentinel monitor mymaster 127.0.0.1 6380 2 sentinel down-after-milliseconds mymaster 30000 sentinel deny-scripts-reconfig yes
daemonize yes:哨兵以守护进程方式运行(后台运行);
port 26379:哨兵进程监听的端口;
bind 0.0.0.0:哨兵绑定所有网卡的 ip,允许任意地址访问;
protected-mode no:关闭保护模式,保护模式下哨兵仅允许本地连接,需要注意的是若哨兵部署在不同服务器必须设为no,否则无法跨机器哨兵通信;
dir “/usr/local/src/redis/sentinel-demo/data/26379” 存储哨兵的状态文件,哨兵本身几不持久化数据,主要用于临时文件;
logfile “/usr/local/src/redis/sentinel-demo/data/26379/sentinel.log”:哨兵的日志文件路径;
sentinel monitor mymaster 127.0.0.1 6380 2:哨兵核心监控规则,其中 mymaster 为监控的主节点名称,127.0.0.1 6380 为主节点的 ip 和端口,2 为 quorum(法定票数);
sentinel deny-scripts-reconfig yes:禁止通过脚本修改哨兵的配置,防止恶意篡改。
启动各个哨兵,需要先启动主哨兵,再启动各个从哨兵
../redis-5.0.4/src/redis-sentinel sentinel_26379.conf

展示哨兵对主节点 mymaster(127.0.0.1:6379)的监控状态
../redis-5.0.4/src/redis-cli -p 26379 127.0.0.1:26379> sentinel masters
演示:主节点关闭后开启降为从节点

![]()
到此这篇关于redis的主从结构与哨兵机制详解的文章就介绍到这了,更多相关redis主从结构与哨兵机制内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论