KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA
Redis 部署形态课 · 课程导读 — keel 龙骨
Redis 部署形态:主从、哨兵与集群 的参考信息:Redis 部署形态课 · 课程导读
单机 Redis 到生产 Redis 之间隔着三个问题:读撑不住怎么办、主库挂了怎么办、单机内存和 QPS 到顶了怎么办。这门课讲的就是回答这三个问题的三套机制:主从复制(读写分离的地基)、哨兵(自动故障切换)、集群(分片扩容)——以及每一套机制在应用代码里要怎么写,才算真的用上。
你现在的起点
- 会用 Redis 做缓存、队列、锁,命令层面没问题;
- 部署形态是「一个 redis-server 起在 6379」,没配过复制;
- 听说过读写分离、哨兵、Cluster,但说不清什么时候该上哪一套,也不知道上了之后应用代码要改什么。
如果你符合这三条,这门课就是为你写的。
一条能走通的学习路径
00 三套形态与选型(先搞清楚该上哪一套,再动手)
→ 01 复制是怎么跑起来的(全量/增量、replid/offset/backlog、WAIT)
→ 02 读写分离(收益、延迟、写后读不一致与应用侧解法)
→ 03 哨兵切换(判定 → 选举 → 提升 → 客户端如何跟上)
→ 04 高可用的诚实边界(丢数据窗口、脑裂、锁在切换后失效)
→ 05 集群分片(槽、hash tag、MOVED/ASK、多键限制)
→ 06 在线扩容与槽迁移(迁移期间请求怎么处理、中断怎么办)
→ 07 生产落地(监控指标、故障手册、四类角色的形态选择)
本课的实验证据
正文里的命令输出都在本机实测过,环境是 Redis 5.0.14.1(Windows 构建)与 redis-py 8.1.0。两个版本差异会在正文里显式标注:
- 术语:Redis 5 的日志和 INFO 字段仍写 slave(slave0、slave_repl_offset),Redis 7 起改为 replica。命令一律用新写法 REPLICAOF,输出保留实测原样。
- 协议:redis-py 5+ 默认试 RESP3(HELLO 3),Redis 5 不认这条命令,会报 unknown command 'HELLO'。所以本课示例显式传 protocol=2——你连 Redis 6+ 时这行可以删掉。
- 哨兵在这份 Windows 构建上跑完一次切换后会崩(内存分配问题),所以 03 章的哨兵日志来自崩溃前那次完整切换,客户端侧的观察是完整的。别拿这个构建当部署目标,生产一律用 Linux 官方 Redis。
全课共用一个主案例
一个内容站点,Redis 承担四类角色:
| 角色 | 典型 key | 关心什么 |
|---|---|---|
| 缓存 | article:{1001}:detail | 读 QPS 高,能容忍短暂陈旧 |
| 队列(ARQ) | arq:job:{id}、Stream arq:queue | 不能丢任务、不能重复执行 |
| 锁 | lock:index:{1001} | 互斥必须成立,切换后还成立吗 |
| 事件流 | site:events(Stream) | 断线可续、顺序 |
后面每一章的现场、破坏实验和验收,都回到这四类 key 上,看同一套形态对它们各自意味着什么。
三个必须先纠偏的认知
- 读写分离不是配出来的,是路由出来的。复制只负责把数据搬过去,把读打到从库是应用客户端的事——不理解这点,就会出现「配好了主从,压力还全在主库」。
- 高可用不等于不丢数据。复制是异步的,主库返回 OK 时从库可能还没收到。哨兵解决的是「多久恢复可写」,不是「写入是否安全」。
- 集群主要解决容量问题,不是高可用的升级版。集群自带副本切换,但它真正的买点是分片;如果瓶颈只是读 QPS,主从加哨兵就够了,上集群反而会失去多键操作和事务的能力。
学完这门课你能做什么
- 面对「读撑不住 / 主库会挂 / 内存到顶」,能说出该上哪套形态、代价是什么、不上会怎样;
- 能配出主从,解释全量与增量同步的触发条件,用 INFO replication 和 WAIT 量化复制延迟;
- 能在应用里正确实现读写分离(区分哪些读必须走主库),并让客户端在故障切换后自动跟上新主;
- 能说清哨兵方案会丢什么数据、锁在什么时刻会失效,并给出兜底(fencing token 等);
- 能搭出三主集群、解释 MOVED 与 ASK 的区别、设计 hash tag,并完成一次在线扩容与验证。
前置要求
- 会用 Redis 基本数据类型与 TTL;
- 建议先读 Redis 工程课——那里关于「分布式锁不保什么」的结论,是 04 章讨论「切换后锁是否还成立」的直接前提。