redis主从架构和集群---java

发布于:2025-03-20 ⋅ 阅读:(21) ⋅ 点赞:(0)

主从架构和集群

Redis 的 主从架构 和 集群(Redis Cluster) 是两种不同的分布式部署方式。

  • 主从架构(Master-Slave Replication)是一种简单的复制机制,一个主节点(Master)负责写操作,多个从节点(Slave)同步主节点的数据,只负责读操作
  • Redis 集群是一种分布式架构,通过数据分片(sharding)将数据分散到多个节点,每个节点负责一部分数据,同时支持高可用和自动故障转移。
  • 主从是集群的基础,Redis 集群内部每个 Master 和其 Slave 之间,实际上就是主从复制的关系

主从复制(同步)

是描述主节点(Master)将数据同步到从节点(Slave)的过程,Redis 的主从复制分为两个阶段:全量同步和增量同步

1. 全量同步

触发场景:

  • 从节点初次连接主节点。
  • 从节点与主节点中断后数据差距太大。

流程:

  1. 从节点发送 PSYNC 命令给主节点,请求同步。
  2. 主节点执行 BGSAVE,生成 RDB 文件(内存快照)。
  3. 主节点将 RDB 文件发送给从节点。
  4. 从节点加载 RDB 文件,清空自身数据并恢复主节点的状态。
  5. 主节点将生成 RDB 期间的写命令(缓冲区)发送给从节点,从节点执行这些命令。

结果:从节点的数据与主节点完全一致。
全量同步

2. 增量同步

增量同步允许从服务器从断点处继续同步,而不是每次从头开始同步。

关键机制

  • 复制偏移量(Replication Offset):主从节点记录各自处理的命令字节数,用于判断数据差距。
  • 复制积压缓冲区(Replication Backlog):主节点维护一个固定大小的缓冲区,存储最近的写命令,支持断线重连后的增量同步。
  • 运行 IDRun ID):主节点的唯一标识,重启后变化。从节点用它判断是否连接的是同一个主节点。

断线重连的增量同步

  1. 从节点断开:
    • 从节点网络中断,偏移量停在 120。
  2. 主节点继续写:
    • 客户端发送:SET city “Beijing”(20 字节)。
    • 主节点偏移量变为 140,缓冲区追加 SET city “Beijing”。
  3. 从节点重连:
    • 从节点发送 PSYNC <runid> 120
  4. 主节点检查:
    • 偏移量 120 在缓冲区内。
    • 从缓冲区提取 120 到 140 的命令:SET city “Beijing”。
    • 主节点发送给从节点。
  5. 从节点执行:
    • 执行 SET city “Beijing”,偏移量变为 140。
  6. 结果:
    • 主从一致:name: “Alice”, age: 25, city: “Beijing”。

在这里插入图片描述

哨兵模式

哨兵模式(Sentinel)是 主从架构 下的一个增强机制,而不是直接属于集群模式。

哨兵模式是一组运行 redis-sentinel 的进程,负责监控 Redis 主从节点的健康状态,管理故障转移和配置更新。如果发现主节点挂了,它就会选举一个从节点切换为主节点,并且把新主节点的相关信息通知给从节点和客户端。

哨兵是一个额外的进程,可以在已有的 redis 上配置,也可以在独立机器上运行哨兵(更推荐,不会哨兵节点一起挂)

机器 A: Master (6379) + Sentinel1 (26379)
机器 B: Slave1 (6380) + Sentinel2 (26380)
机器 C: Slave2 (6381) + Sentinel3 (26381)

哨兵选新节点

  1. 主节点下线 :每个哨兵定期向主节点发送 PING,规定时间没回这个哨兵就认为主节点挂了。该哨兵向其他哨兵询问:“你们觉得主节点下线了吗?”。如果达到法定人数,主节点就被标记为“客观下线”。
  2. 选举领导者哨兵 :哨兵发现主节点挂了就请其他哨兵选自己当领导者,其他哨兵遵循 “先到先得” 的原则投票,最后票高者得。
  3. 领导者哨兵选新节点 :领导者选一个新主节点,通知其他哨兵和从节点。
    选择标准:【1.配置优先级—>2.复制偏移量 offset 大—>3.运行 ID看随机】

redis 集群

16384 个槽分配给多个 Master,key 通过 CRC16 哈希映射到槽。每个 Master 有 Slave,主故障时 Slave 自动晋升

接下来的问题就是,这些哈希槽怎么被映射到具体的 Redis 节点上的呢?有两种方案:

  • 平均分配: 在使用 cluster create 命令创建 Redis 集群时,Redis 会自动把所有哈希槽平均分布到集群节点上。比如集群中有 9 个节点,则每个节点上槽的个数为 16384/9 个。
  • 手动分配: 可以使用 cluster meet 命令手动建立节点间的连接,组成集群,再使用 cluster addslots 命令,指定每个节点上的哈希槽个数。

优点

  1. 数据分片,容量可扩展
  2. 多点写,提升写性能
  3. 高可用,自动故障转移
  4. 分布式存储,负载均衡
  5. 支持动态扩缩容

缺点

  1. 部署和维护较复杂
  2. 集群同步问题: 当某些节点失败或者网络出故障,集群中数据同步的问题也会出现。数据同步的复杂度和工作量随着节点的增加而增加,同步时间也较长,导致一定的读写延迟。

网站公告

今日签到

点亮在社区的每一天
去签到