以下是 Redis 主从复制、哨兵模式、Redis Cluster 的概述、原理及日常应用场景的详细说明:

一、Redis 主从复制

  1. ​概述​​:

    • 这是 Redis 高可用架构的基础机制。
    • 它允许一个 Redis 服务器(主节点)将其数据​​异步​​复制到一个或多个 Redis 服务器(从节点)。
    • 数据流向是​​单向​​的:从主节点复制到从节点。
  2. ​核心原理​​:

    • ​连接建立​​:

      • 从节点启动后,通过 replicaof <master-ip> <master-port> 命令或配置文件连接主节点。
      • 从节点向主节点发送 SYNCPSYNC 命令(Redis 2.8+)请求同步数据。
    • ​全量同步 (SYNC / Full Resynchronization)​​:
      • ​首次连接​​或​​主从节点复制积压缓冲区不足时​​触发。
      • 主节点执行 BGSAVE(后台保存)生成一个 RDB 快照文件。
      • 生成完成后将 RDB 文件传输给从节点。
      • 从节点清空自身旧数据,加载接收到的 RDB 文件。
      • 主节点在生成和传输 RDB 期间的新写命令,会记录在“复制缓冲区”中。
      • 从节点加载完 RDB 后,主节点再将缓冲区内的命令发送给从节点执行,使两者最终保持一致。
    • ​增量同步 (PSYNC / Partial Resynchronization)​​:
      • Redis 2.8+ 引入,提升效率,​​降低网络中断后恢复复制的成本​​。
      • 主节点会在内存中维护一个固定大小的​​复制积压缓冲区 (Replication Backlog Buffer)​​。
      • 从节点断开重连后,向主节点报告自己已复制的偏移量。
      • 如果偏移量之后的数据仍然在积压缓冲区中,主节点只需将从节点缺失的那部分增量命令发送过去。
      • 否则,降级为全量同步。
    • ​持续复制​​: 完成初始化同步(全量或增量)后,主节点接收到的每条写命令都会异步发送给所有连接的从节点执行。
  3. ​日常应用场景​​:

    • ​读写分离​​:主节点处理写操作(和部分读操作),多个从节点分担读操作负载。适用读多写少的场景。
    • ​数据热备份​​:从节点是主节点数据的实时副本,提供​​数据冗余​​,在主节点故障时,从节点是数据的恢复来源(需要手动干预)。
    • ​灾难恢复​​:可在异地部署从节点,在主数据中心故障时,作为灾备恢复点。
    • ​离线数据分析/报表​​:可以在不影响主节点性能的情况下,在从节点上运行慢查询或数据统计操作。

二、哨兵模式 (Sentinel)

  1. ​概述​​:

    • Sentinel 是 Redis ​​官方提供的原生高可用性 (HA) 解决方案​​。
    • ​不直接处理读写请求​​,而是作为一个​​分布式监控和管理系统​​运行。
    • 核心任务是​​监控​​主节点和从节点的健康状态,并在主节点发生故障时,自动执行​​故障转移​​。
    • 由多个哨兵节点(Sentinel)共同组成集群,避免单点故障。
  2. ​核心原理​​:

    • ​监控​​:

      • 每个哨兵节点通过发送 PING 命令监控所有主节点、从节点和其他哨兵节点的状态。
      • 通过配置发现主节点下的所有从节点。
    • ​通知​​:
      • 哨兵发现某个节点不可达(PING 超时且达到一定阈值)时,可以在需要时发送通知(告警)。
    • ​自动故障转移 (Failover)​​:
      • 当一个哨兵判定主节点客观下线 (Objectively Down, ODOWN) 时(需要获得多数哨兵的同意),它将发起故障转移流程:

        1. ​选举领导者哨兵​​: 多个哨兵通过 Raft 选举算法选出一个领导者来协调故障转移。
        2. ​选择新主节点​​: 领导者哨兵根据规则(优先级、复制偏移量、Run ID等)从存活的从节点中选出一个晋升为新主节点。
        3. ​提升新主​​: 向被选中的从节点发送 REPLICAOF NO ONE 命令,使其成为新的主节点。
        4. ​切换从属关系​​: 向其他所有从节点发送 REPLICAOF <new-master-ip> <new-master-port> 命令,让它们复制新的主节点。
        5. ​更新配置​​: 通知并更新客户端或其他需要使用 Redis 的应用配置信息(指向新的主节点)。
    • ​配置中心​​:
      • 哨兵充当了客户端发现 Redis 服务当前状态的权威来源。客户端连接到哨兵集群获取当前主节点的地址。
      • 哨兵本身提供主节点地址信息,客户端连接到它询问谁是主节点。
  3. ​日常应用场景​​:

    • ​自动主节点故障恢复​​: 当主节点发生硬件故障、进程崩溃、网络隔离等导致不可用时,无需人工干预,自动完成从节点晋升和新主从关系建立。
    • ​高可用集群​​: 提供近似零宕机的服务能力(故障转移时存在少量瞬断)。适用于需要持续可用性的线上服务。
    • ​服务发现​​: 客户端库(如 Java Jedis/Sentinel 客户端)可以通过询问哨兵集群来动态获取最新的主节点地址。
    • ​集群状态监控​​: 通过哨兵 API 或工具可以方便地监控主从节点的在线状态和配置信息。

三、Redis Cluster

  1. ​概述​​:

    • 这是 Redis 原生提供的分布式数据库解决方案。
    • 核心目标是​​水平扩展​​,通过​​分片 (Sharding)​​ 机制将数据自动分散存储在​​多个节点​​上,解决​​单机内存容量、网络带宽、计算能力的瓶颈​​。
    • ​结合了主从复制(每个分片内部)和高可用(类似哨兵的自动故障转移)​​。
    • ​无中心节点​​,数据被划分为 16384 个​​哈希槽 (Hash Slot)​​,由集群中的所有主节点共同分担存储。
  2. ​核心原理​​:

    • ​数据分片 (Sharding)​​:

      • 集群的所有键会被映射到固定的 16384 个槽中 (CRC16(key) mod 16384)。
      • 集群上线前,管理员需将槽位分配给各主节点(可以手动指定或自动平衡)。
      • 集群会自动跟踪槽位的分布情况。
    • ​节点结构​​:
      • 集群由多个 Redis 节点组成,每个节点要么是主节点,要么是从节点。
      • ​主节点​​:
        • 负责存储和管理分配给它的槽位中的数据。
        • 处理客户端对这些槽位中数据的读写请求。
        • 参与集群状态决策(如故障检测、选举)。
      • ​从节点​​:
        • 异步复制其主节点的数据,提供数据副本。
        • 在主节点故障时,有可能被选为新的主节点(参与主节点选举)。
        • 可以处理读请求分担负载。
    • ​请求路由 (Gossip Protocol & Smart Client)​​:
      • ​MOVED / ASK重定向​​:

        • 客户端直接连接集群中的任意节点。
        • 如果请求的键所在的槽不由该节点处理,节点会返回一个 MOVED <slot> <node-ip>:<node-port> 错误,告诉客户端正确的节点地址。
        • 在集群迁移槽位时,请求的键可能已经迁移走但节点还不知道最新位置(或正在迁移中),会返回 ASK 错误进行重定向。
      • ​Smart Client​​: 成熟的 Redis Cluster 客户端库会缓存槽位与节点的映射关系,并根据 MOVED/ASK 响应动态更新缓存,减少重定向次数。
    • ​集群总线 (Cluster Bus)​​:
      • 节点间通过专用的二进制协议(TCP端口通常是节点端口号+10000)进行通信(通过 Gossip 协议)。
      • 用于故障检测、节点间状态信息传播(PING/PONG)、配置更新通知(如槽位迁移完成、新主节点生效)等。
    • ​故障检测与转移 (基于Gossip)​​:
      • 节点定期(秒级)与其他节点交换PING/PONG消息。
      • 如果一个节点在一定时间内未被其他节点响应,它会被该节点标记为​​疑似下线 (PFAIL)​​。
      • 当集群中多数主节点都将某个主节点 X 标记为 PFAIL 时,X 被标记为​​客观下线 (FAIL)​​。
      • ​触发选举​​: X 的从节点检测到其主节点 FAIL,会尝试发起选举成为新主节点:
        1. ​资格检查​​: 从节点距离上次与主节点通信不能太久。
        2. ​延迟选举​​: 稍作等待(RAND 范围内的延迟),让主节点下线信息更充分传播。
        3. ​选举请求​​: 向所有其他主节点广播 FAILOVER_AUTH_REQUEST 消息请求投票。
        4. ​投票授权​​: 收到请求的主节点给第一个请求投票(每个纪元只投一票)。
        5. ​成为主节点​​: 获得​​超过半数主节点​​投票的从节点,执行 REPLICAOF NO ONE 成为新主。
        6. ​接管槽位​​: 新主节点接管其旧主节点负责的所有槽位。
        7. ​广播更新​​: 通知整个集群配置已变更。
      • ​集群完整性保障​​:
        • 只有当集群中超过半数的槽位(严格说是主节点)可用时,集群才继续可用(接受写请求)。
        • 否则,集群将进入 FAIL 状态,拒绝写操作。
  3. ​日常应用场景​​:

    • ​海量数据存储​​: 当数据集大小远超单台服务器内存容量(几十上百 GB 甚至 TB 级),需要分布式存储。
    • ​超高并发访问​​: 当单机 Redis 实例的处理能力(每秒 OPS 或网络带宽)成为瓶颈时,多个主节点可以分摊读写压力。
    • ​业务隔离​​: 可以将不同业务的数据分散在不同的主节点上(通过配置键前缀等方式),实现某种程度的逻辑隔离。
    • ​追求原生分布式与高可用结合​​: 需要同时满足数据量大、高并发和高可用的严苛场景,并且希望使用官方原生方案。
    • ​规避代理层​​: 相比于使用 Twemproxy/Codis 等代理分片方案,Redis Cluster 消除了代理层可能带来的瓶颈和复杂性。

对比总结与选择建议

特性 主从复制 哨兵模式(Sentinel) RedisCluster
​核心目的​ 数据冗余、读写分离、数据备份 主节点故障时 ​​自动高可用​ 水平扩展 (​​分片​​) + 高可用
​数据分布​ 单主或多主(独立) 单主(可能多级链式复制) ​多主​​ (数据分片到多个主节点)
​扩展性​ 仅能水平扩展读(添加从节点) 同样只能水平扩展读(添加从节点) ​能水平扩展读写和存储​​(添加节点)
​高可用性​ 无自动故障转移(需手动) ​提供自动故障转移 (Failover)​ ​内建自动故障转移​
​复杂性​ 最简单 较简单 ​最复杂​​ (分片、路由、集群管理)
​客户端​ 简单,直接连主从节点 需要支持 Sentinel 的客户端获取主节点 需要支持 Cluster 协议的 ​​智能客户端​
​数据量​ 受限于单机内存 受限于单机内存 可水平扩展(理论上可突破单机限制)
​网络分区处理​ 弱(多数哨兵存活即可决策) 相对强(需多数主节点存活才能提供写服务)
​典型场景​ 数据备份、读写分离、小型应用 高可用性要求高、但数据量/写并发适中 ​大数据量、高并发、高可用三者兼备​
​限制​ 主节点单点故障(无自动转移) 写性能和存储容量无法水平扩展 部分多键操作限制(需在同分片)、迁移阻塞

​选择指南​​:

  1. ​仅需读写分离或数据备份​​: ​​主从复制​​(最轻量级)。

  2. ​需要高可用但数据量/写压力不大​​: ​​主从复制 + 哨兵模式​​。

  3. ​数据量巨大(超过单机内存)或写并发极高、且要求高可用​​: ​​Redis Cluster​​。

  4. ​想使用主从复制但需要手动干预故障转移(简单维护)​​: 单独使用​​主从复制​​。

​重要提醒​​:

  • ​Redis Cluster 的限制​​:

    • 多键操作(如 MSETMGET 跨多个键、Lua 脚本访问多个键)要求所有键必须在同一个哈希槽(分片)中。需要用 {hash_tag}(花括号)保证键映射到同一槽位。
    • 数据库只能使用 DB0。
    • 在集群扩缩容(槽位迁移)时,部分请求可能被阻塞或短暂不可用。
    • 运维复杂性高于哨兵模式。

理解这些模式的核心区别和适用场景,能帮助你根据业务的具体需求(数据量、并发量、高可用级别、运维复杂度)做出正确的架构选择。

Redis 主从复制、哨兵模式、Redis Cluster集群概述与原理的更多相关文章

  1. HA 高可用集群概述及其原理解析

    HA 高可用集群概述及其原理解析 1. 概述 1)所谓HA(High Available),即高可用(7*24小时不中断服务). 2)实现高可用最关键的策略是消除单点故障.HA严格来说应该分成各个组件 ...

  2. Redis 单机模式,主从模式,哨兵模式(sentinel),集群模式(cluster),第三方模式优缺点分析

    Redis 的几种常见使用方式包括: 单机模式 主从模式 哨兵模式(sentinel) 集群模式(cluster) 第三方模式 单机模式 Redis 单副本,采用单个 Redis 节点部署架构,没有备 ...

  3. Redis系列5:深入分析Cluster 集群模式

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) 1 背景 前面我们 ...

  4. Redis哨兵、复制、集群的设计原理与区别

    一 前言 谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制. 哨兵(Sentinel):可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转 ...

  5. Redis的高可用详解:Redis哨兵、复制、集群的设计原理,以及区别

    谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制. 哨兵(Sentinel):可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能. ...

  6. Redis哨兵、复制、集群的设计原理,以及区别

    广西SEO:谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制. **哨兵(Sentinel):**可以管理多个Redis服务器,它提供了监控,提醒以及自 ...

  7. redis源码分析(五)--cluster(集群)结构

    Redis集群 Redis支持集群模式,集群中可以存在多个master,每个master又可以拥有多个slave.数据根据关键字映射到不同的slot,每一个master负责一部分的slots,数据被存 ...

  8. Redis 超详细自动管理Cluster集群工具上手 redis-trib.rb (多图,手把手)

    安装介绍 ​ redis-trib.rb是一款由Redis官方提供的集群管理工具,能够大量减少集群搭建的时间. ​ 除此之外,还能够简化集群的检查.槽迁徙.负载均衡等常见的运维操作,但是使用前必须要安 ...

  9. (四)Redis主从复制(单机版,不集群)

    持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可 ...

  10. Redis进阶实践之十二 Redis的Cluster集群动态扩容

    一.引言     上一篇文章我们一步一步的教大家搭建了Redis的Cluster集群环境,形成了3个主节点和3个从节点的Cluster的环境.当然,大家可以使用 Cluster info 命令查看Cl ...

随机推荐

  1. .NET 8 开发的跨平台多商户第三方支付SDK

    前言 快速发展的互联网应用开发中,支付功能已成为各类平台不可或缺的一环.为了帮助大家更高效地接入主流支付渠道,推荐一套基于 .NET 开发的第三方支付 SDK.该 SDK 支持跨平台运行,适用于多种操 ...

  2. CSS 之overflow属性简结

    CSS的overflow 属性用来处理一个元素的尺寸超出其容器尺寸的情况.当一个元素包含的内容超粗自身的大小时,就会发生内容溢出,这种情况,可以对内容进行"裁剪",只让一部分内容可 ...

  3. codeup之分数序列求和

    Description 有如下分数序列 求出次数列的前20项之和. 请将结果的数据类型定义为double类型. Input 无 Output 小数点后保留6位小数,末尾输出换行. Sample Inp ...

  4. Java 记录操作日志|对象修改细节

    背景描述   由于业务涉及收入敏感信息,需记录数据变更前的内容和变更后的内容,但是不能为完成任务而硬编码,要适用于不同bean.针对这种情况,本文使用泛型.反射和基于AOP的自定义注解技术来完成,对对 ...

  5. Gitee、Github上star星星数获取到一个图片里,用于MD文档

    记录一下 Gitee 用这个链接当图片地址即可 https://gitee.com/用户名/仓库名/badge/star.svg?theme=white https://gitee.com/用户名/仓 ...

  6. C++项目属性配置Tips

    1.项目属性->VC++目录->包含目录 & 库目录 这里的"包含目录"."库目录"编辑之后是全局的: 2.项目属性->C/C++-& ...

  7. 跨平台之 KMP / KMM 详解

    任何事情,急于求成都是幼稚的幻想,急于求成的结果一定是不成,对此不应该有任何怀疑. 一. KMP 和 Compose Multiplatform 摘要:减少为不同平台编写和维护相同业务逻辑代码所花费的 ...

  8. 基于Fastapi的区分聊天房间的聊天转发功能接口示例

    基于房间码(eCode)和用户uid,区分不同的聊天房间进行消息转发. 前端将收到的消息根据房间码(eCode)过滤到不同的聊天记录显示页面 后端demo代码如下: from fastapi impo ...

  9. 指标+AI:迈向智能化,让指标应用更高效

    近日,以"Data+AI,构建新质生产力"为主题的袋鼠云春季发布会圆满落幕,大会带来了一系列"+AI"的数字化产品与最新行业沉淀,旨在将数据与AI紧密结合,打破 ...

  10. html背景图片居中

    * { margin: 0; padding: 0 } .box { width: 100%; height: 1728px; border: 1px solid rgba(0, 128, 0, 1) ...