找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

618

积分

0

好友

78

主题
发表于 3 小时前 | 查看: 0| 回复: 0

这篇文章分享我职业生涯中经历的五种 Redis 部署模式,希望对大家的技术选型有所启发。

1 单实例

这是 Redis 最简单、最基础的部署方式,即:整个 Redis 服务运行在单个服务器单个进程中。

我首次在生产环境使用 Redis,是在艺龙红包系统中,用于实现分布式锁。因为上线时间要求比较紧张,运维告知有一个现成的实例可以直接使用,于是便采用了单实例模式。当时我还特意嘱咐运维,如果 Redis 挂掉,就通过 Linux 的 CronTab 定时任务脚本将其重新启动。

Redis单实例监控架构

单实例模式的优点显而易见:简单(部署、配置、维护),但缺点同样突出:一旦服务器宕机,服务将完全不可用,同时可用内存大小也严格受限于单台服务器的物理内存。

2 主从 + 哨兵

在艺龙红包系统初版上线后,团队架构师向我介绍了Redis的高可用方案——主从复制+哨兵集群模式。这种部署模式通过主从数据同步实现数据备份,配合哨兵集群的自动故障检测与主从切换能力,能够有效保障服务的高可用性

在如图所示的架构中:

Redis主从哨兵架构

  1. 主节点(Master)负责处理所有写请求
  2. 从节点(Slave)实时同步主节点数据,可分担读请求
  3. 哨兵(Sentinel)集群持续监控主从节点的健康状态
  4. 当主节点发生故障时,哨兵会自动选举出一个新的从节点升级为主节点

通过这种改造,红包系统的缓存架构获得了质的提升:不仅避免了单点故障风险,还实现了读写分离,整体系统的稳定性和可用性都得到了显著增强。即便在突发故障情况下,也能保证核心业务持续稳定运行。

3 分片集群 + 一致性 Hash

「主从 + 哨兵」模式非常健壮,但如果缓存数据量非常大,单组主从实例的内存容量就会成为瓶颈。这时就需要部署多组 Redis 实例来共同承载业务数据。

艺龙的流式计算服务在计算过程中就大量依赖这种多实例模式,架构如下图所示:

多Redis实例分片架构

为了将数据均匀分布到多个实例上,我们可以采用一致性哈希算法来实现数据分片与路由:

一致性哈希算法示意图

  1. 哈希环构建:将整个哈希空间(0 ~ 2^32-1)组织成一个首尾相连的虚拟环。
  2. 节点映射:对每个物理Redis节点计算多个虚拟节点的哈希值,并将其均匀地映射到哈希环上。
  3. 数据路由:对每个要存储的key计算其哈希值,然后在哈希环上顺时针查找,将数据存储到找到的第一个虚拟节点所对应的物理节点上。

需要注意的是,上面流式计算服务中的Redis集群仅采用了单主模式,存在一定的高可用风险。例如,某个分片挂掉,其负责的数据就不可用了。

解决方案其实很直接:

  • 将每个分片都改造成主从模式。
  • 部署哨兵集群来监控每个分片内的主从节点,实现自动故障切换。

改造后的架构图如下(类似于神州专车订单缓存的部署架构):

具备高可用的分片集群架构

4 分片集群 + 预分配

我们再审视「分片集群 + 一致性 Hash」这种模式,虽然看起来很完美,但它存在一个隐形的缺点:

当需要新增分片节点时,如何做到数据可以平滑地迁移到新的节点上?

解决这个问题的有效方案之一是:预分配槽位

我曾经介绍过专车的分库分表算法。假设需要将订单表平均拆分到 4 个分库:shard0, shard1, shard2, shard3。
首先将 [0-1023] 这个区间平均分为4个区段:[0-255], [256-511], [512-767], [768-1023]。然后对业务键(例如用户ID)做哈希计算,结果对 1024 取模,得到一个 slot 值。最终这个 slot 值落入哪个区段,数据就被路由到哪个分库。

预分配槽位的分库分表示意图

我们可以将这种分库分表的预分配理论应用到 Redis 分片集群中,架构见下图:

基于预分配的Redis分片集群

大名鼎鼎的开源项目 Codis 就使用了预分配的技巧。「分片集群 + 预分配」既可以保留分片集群水平扩展的优势,也能通过预分配和管理槽位来实现相对平滑的数据迁移。 不过,数据迁移的具体实现和运维仍然非常考验架构师的功底。

那么,有没有一种方案可以原生支持高可用、数据分片、平滑扩缩容等所有特性呢?
答案是肯定的,它就是:官方 Redis Cluster

5 官方 Redis Cluster

我在花生好车和科大讯飞的项目中都使用过 Redis Cluster 模式。

官方Redis Cluster架构

Redis Cluster 集群具有如下几个核心特点:

  • 去中心化架构:集群完全去中心化,采用多主多从模式;每个分区(分片)由一个主节点和多个从节点组成,分片之间相互平行。
  • 内置高可用:无需额外部署哨兵集群。集群内的 Redis 节点通过 Gossip 协议互相通信,探测彼此的健康状态,在检测到主节点故障时可自动发起故障转移。
  • 预分片槽位:Redis Cluster 将所有数据划分为 16384 个哈希槽,集群中的每个主节点负责管理其中一部分槽位。
  • 智能路由:当客户端向集群发送请求时,集群会根据键的哈希值(使用 CRC16 算法计算,然后对16384取模)将请求自动路由到负责该槽位的对应节点。
  • 客户端集成:Redis Cluster 提供了配套的 SDK。只要业务端升级客户端 SDK,就能与集群无缝集成。SDK 会自动处理寻找正确节点、读写操作以及节点变更(增删)的适配,对业务代码几乎无感知。

从功能上讲,Redis Cluster 已经非常完善,在提供高可用性的同时,实现了数据自动分片和负载均衡,非常适用于大规模数据存储和高性能要求的场景。当然,它的配置和运维相对复杂一些,并且一些涉及多个键的复杂操作可能会受到限制。

6 真的有银弹吗

在 Redis 的部署模式演进过程中,从单实例到主从哨兵,再到各种分片集群,最后到官方的 Redis Cluster,我们看到了不同架构为解决特定问题而做的设计。

没有一种方案是完美的“银弹”,每种模式都有其独特的适用场景和相应的局限性。

五种Redis部署模式对比表格

(上图清晰地对比了五种模式在高可用、扩展性、数据分片、运维复杂度等方面的差异。)

因此,作为技术人员,我们需要深入理解自身的业务需求,仔细权衡性能、扩展性、成本以及运维复杂度,才能为项目选择最合适的 Redis 部署架构。技术选型永远是一场关于平衡的艺术。如果你想就这些架构进行更深入的交流,欢迎到云栈社区与大家一同探讨。




上一篇:LuatOS驱动合宙Air780E开发板:GPIO按键输入与ADC电压测量手把手教程
下一篇:Claude Code 高级配置详解:黑客松冠军如何通过子代理与自动化提升 AI 编程效率
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-24 16:14 , Processed in 0.233737 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表