2. Redis部署模式与选型

Redis 的部署模式决定了系统的可用性上限、扩展方式以及后续自动化治理的复杂度。很多线上事故并非源于命令用错,而是部署模式与业务需求不匹配:用单机承载核心缓存、用主从代替高可用、在 Cluster 上执行跨槽事务。理解四种模式的本质差异,是选型与自动化建设的第一步。

四种模式的核心机制

单机模式只有一个 Redis 进程,所有数据与读写压力集中在一个实例上。它没有复制、没有故障转移,进程退出或宿主机宕机即服务中断。优点是部署简单、无额外网络开销、支持全部命令与多 DB。适合本地开发、单元测试、非关键缓存、以及可容忍分钟级重建的临时数据。

主从模式(Replication)通过 replicaof 建立一主多从的复制关系。主节点处理写与读,从节点异步接收主节点的数据变更,可承担只读查询、备份、离线分析等流量。复制是异步的,主节点故障时从节点数据可能滞后,且主从本身不具备自动故障转移能力,主挂了需要人工把某个从提升为主。因此主从解决的是读扩展与数据冗余,不是高可用。

哨兵模式(Sentinel)在主从基础上引入一组 Sentinel 进程,负责监控、主观/客观下线判定、领导者选举与自动故障转移。当多数 Sentinel 认为主节点客观下线后,会选出一个 Sentinel 执行故障转移:挑选数据最新的从节点提升为主,并通知其余从节点复制新主,同时向客户端推送新拓扑。哨兵把“人工切换”变成“自动切换”,但数据仍是单主写入,容量与写性能受单机限制。

Cluster 模式采用分片(sharding)架构,把整个键空间划分为 16384 个哈希槽,每个主节点负责一部分槽,槽内数据由该主及其从节点管理。客户端根据 CRC16(key) mod 16384 计算槽位并路由请求,遇到 MOVED/ASK 重定向时更新本地槽映射。Cluster 支持在线扩缩容(迁移槽)、自动故障转移,写能力与容量可水平扩展。代价是:只支持 DB 0、多键操作要求同槽(可用 hash tag 强制同槽)、事务与 Lua 脚本不能跨槽、运维复杂度显著上升。

单机 Standalone Redis 进程 全部数据 + 读写 无复制 · 无故障转移 支持多 DB / 全部命令 适用:开发测试 / 非关键缓存 可用性:单点,宕机即中断 主从 Replication Master 写 + 读 Replica 只读 异步 读扩展 · 数据冗余 · 备份 主故障需人工提升从节点 适用:读多写少 / 报表分析 可用性:依赖人工,非高可用 哨兵 Sentinel S1 S2 S3 Master Replica Replica 监控 · 客观下线 · 自动切换 多数派仲裁,客户端订阅新拓扑 适用:单主高可用 / 中小规模 Cluster 分片 M1 槽0-5460 M2 槽5461-10922 M3 槽10923-16383 R1 R2 R3 16384 槽 · MOVED/ASK 重定向 在线扩缩容 · 自动故障转移 适用:大数据量 / 高并发写入 选型决策:从三个维度收敛 ① 数据量与写吞吐 单实例内存可容纳 → 单机/主从/哨兵 超出单机或写 QPS 触顶 → Cluster ② 可用性要求 可容忍中断 → 单机/主从 要求自动切换 → 哨兵/Cluster ③ 命令与事务约束 需多 DB / 跨键事务 / 全命令 → 非 Cluster 可接受同槽约束 → Cluster 治理差异:单机/主从靠脚本与人工;哨兵需维护 Sentinel 集群与客户端拓扑感知; Cluster 需管理槽分配、节点握手、在线迁移与重定向处理,自动化投入最高

选型的三个收敛维度

选型不应凭经验拍板,建议按三个维度依次收敛。第一是数据量与写吞吐:若数据集能稳定放入单实例内存(例如 20GB 以内)且写 QPS 未触顶,单机、主从或哨兵即可;若数据量持续增长或写 QPS 超过单实例能力,必须考虑 Cluster。第二是可用性要求:可容忍分钟级中断的场景用单机或主从;要求自动切换、RTO 在秒级到十几秒的场景用哨兵或 Cluster。第三是命令与事务约束:需要多 DB、跨键事务、跨槽 Lua 的业务,应避免 Cluster,或通过 hash tag 把相关键强制到同一槽。

一个常见的误判是“上了哨兵就等于高可用”。哨兵只解决主节点故障转移,不解决容量与写瓶颈;当写 QPS 已经打满单主时,哨兵切换后新主依然会被打满。另一个误判是“Cluster 一定比哨兵强”。Cluster 的运维成本、客户端改造、跨槽限制都是真实代价,中小规模业务用哨兵往往更划算。

自动化部署需求的差异

不同模式对自动化的诉求完全不同。单机几乎不需要编排,一条 redis-server 加配置文件即可,自动化重点在配置模板与进程守护。主从需要自动化建立复制关系、校验复制偏移量、在扩容时把新从节点挂到正确的主上。哨兵需要自动化部署奇数个 Sentinel、统一监控配置、验证仲裁多数派,并确保客户端能感知拓扑变化。Cluster 的自动化最重:节点发现与握手、槽分配、主从配对、在线迁移、故障后槽归属校验,任何一步手工操作都容易留下不一致状态。

# 主从建立复制的关键配置(示例)
# 在从节点 redis.conf 中
replicaof 10.0.1.11 6379
replica-read-only yes
repl-backlog-size 64mb

# 哨兵监控配置(示例,sentinel.conf)
sentinel monitor mymaster 10.0.1.11 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

# Cluster 创建与槽检查(示例)
redis-cli --cluster create 10.0.2.11:6379 10.0.2.12:6379 \
  10.0.2.13:6379 10.0.2.14:6379 10.0.2.15:6379 10.0.2.16:6379 \
  --cluster-replicas 1
redis-cli --cluster check 10.0.2.11:6379

注意哨兵的 quorum 参数(示例中为 2)表示判定客观下线所需的最少 Sentinel 票数,它不等于故障转移所需的多数派票数。故障转移还需要 Sentinel 总数过半的授权,因此 Sentinel 数量必须是奇数且至少 3 个。这是哨兵部署中最容易被忽略的约束。

治理差异与日常关注点

治理层面,四种模式的关注点逐级增加。单机关注内存使用率、慢查询、持久化是否正常;主从额外关注复制延迟(master_repl_offset 与从节点偏移的差值)、全量同步频率、从节点只读是否被误改;哨兵额外关注 Sentinel 之间的通信、主观下线误判、切换后客户端是否及时更新连接;Cluster 则要持续关注槽覆盖是否完整、节点是否全部握手、迁移任务是否卡住、以及 cluster_state 是否为 ok。

判断 Cluster 是否健康的快速方法:执行 redis-cli --cluster check,确认 16384 个槽全部被覆盖、每个主节点都有对应从节点、没有处于 fail 状态的节点。若出现槽未覆盖,客户端会收到 CLUSTERDOWN 错误。

选型参考表

模式数据容量写扩展故障转移典型场景自动化重点
单机单实例内存无无开发测试、非关键缓存配置模板、进程守护
主从单实例内存无(读可扩展)人工读多写少、备份分析复制关系、偏移校验
哨兵单实例内存无(读可扩展)自动单主高可用、中小规模Sentinel 集群、拓扑感知
Cluster多节点内存之和水平扩展自动大数据量、高并发写入槽管理、迁移、重定向

实际落地时,很多团队采用混合策略:核心交易缓存用哨兵保证高可用,海量会话或商品缓存用 Cluster 承载容量,离线分析走主从只读副本。选型不是一次性决策,随着数据量与并发增长,从主从演进到哨兵、再演进到 Cluster 是常见路径,关键是每一步都保留可回退的迁移方案与数据校验手段。