主从、哨兵与 Cluster
单机 Redis 有容量与可用性上限。复制解决可用性,哨兵解决自动切换,Cluster 解决水平扩展。
主从复制
- 复制是异步的:主节点写入后异步同步给从节点。
- 首次同步会做全量同步(
RDB+ 复制缓冲区),之后是增量同步(offset 续传)。 - 从节点默认只读,可分担读请求(需客户端配置)。
Warning
异步复制意味着主节点故障时可能丢失尚未同步的写入。Redis 默认不保证强一致——若缓存数据丢失可接受,这没问题;若把 Redis 当唯一存储,需评估数据丢失风险。
Sentinel:自动故障切换
Sentinel 是独立进程集群,负责监控、通知与自动选主。
- 哨兵以奇数个部署(如 3 个),避免投票僵局。
- 判定主观下线(单个哨兵)→ 客观下线(达到 quorum)→ 选举 leader → 执行故障转移 → 通知客户端新主。
客户端需支持 Sentinel,才能自动感知主节点变更:
Cluster:分片集群
当单机内存放不下数据时,用 Cluster 把数据分片到多个主节点。
- 数据划分为 16384 个哈希槽(slot),
slot = CRC16(key) % 16384。 - 每个主节点负责一部分槽,每个主节点可带从节点做高可用。
- 客户端请求到错误节点时,会收到
MOVED/ASK重定向。
多键操作的槽限制:涉及多个 key 的命令要求它们在同一槽。可用 hash tag 强制同槽:
Warning
Cluster 模式下跨槽的多键命令会失败(如 MGET k1 k2、跨槽事务/Lua)。设计 key 时用 hash tag 把需要一起操作的 key 绑定到同一槽。另外集群的节点数一旦确定,扩容需做槽迁移,规划时留出余量。
Go 客户端:go-redis
Tip
redis.Nil 是正常的「key 不存在」信号,不是错误,必须单独判断。此外,所有操作都应带 context 超时,避免慢请求拖垮调用方。连接池大小按并发量与实例规格调整。
方案选择
小结
- 主从复制异步,用于读扩展与容灾,但可能丢少量数据。
- Sentinel 解决自动故障切换,需奇数部署并配置 quorum。
- Cluster 用 16384 槽分片,跨槽操作受限,用 hash tag 绑定相关 key。
- Go 用 go-redis,注意
redis.Nil与 context 超时;生产优先云托管。