Redis 高可用与容灾
Redis 宕机时的容灾能力有哪些
Redis 宕机后的容灾能力主要来自四层:
- 持久化:RDB / AOF 用于重启恢复数据。
- 主从复制:从节点保留主节点副本,主挂后可以提升从节点。
- 哨兵模式:自动监控主从状态,主观下线、客观下线后完成故障转移。
- Redis Cluster:按 slot 分片,每个分片可以有主从,主节点故障后自动从副本里选新主。
需要注意 Redis 复制通常是异步的,故障切换可能丢少量已写入旧主但尚未复制到从节点的数据。高可用不等于强一致。
Redis 集群主从复制原理
主从复制分为全量复制和部分复制。
第一次同步或复制偏移量差距太大时,从节点发起全量复制:主节点 bgsave 生成 RDB,把 RDB 发给从节点;同时把同步期间的新写命令写入复制缓冲区;从节点加载 RDB 后,主节点再把缓冲区里的增量命令发过去。
网络短暂断开后,如果主节点复制积压缓冲区里还保留着从节点缺失的增量数据,就可以部分复制。部分复制依赖主节点 runid、复制偏移量 offset 和复制积压缓冲区。
主从复制是异步的,所以读从库可能有延迟,主节点故障时也可能丢失尚未复制的写入。
Redis 哨兵机制是什么?解决什么问题
Sentinel 是 Redis 的高可用监控和故障转移机制,主要解决主从模式下“主节点挂了谁来切主、客户端怎么知道新主”的问题。
它做四件事:
- 监控:定期检查主从节点是否存活。
- 通知:节点状态变化时通知管理员或客户端。
- 自动故障转移:主节点客观下线后,从从节点中选出新主。
- 配置提供者:客户端可以向哨兵询问当前主节点地址。
哨兵判断下线分两步:单个哨兵认为主节点不可达叫主观下线;多个哨兵达成一致后叫客观下线。之后哨兵之间选 leader,由 leader 执行故障转移。
Redis 如何保证高可用
Redis 高可用通常靠复制 + 自动故障转移:
- 单机 Redis 只能靠持久化恢复,恢复期间不可用。
- 主从复制可以提供副本,但主挂了需要切主。
- 哨兵可以自动切主,适合不需要分片的小中规模场景。
- Cluster 同时提供分片和故障转移,适合数据量或吞吐超过单机能力的场景。
为了降低故障损失,还要合理配置持久化、主从副本数、客户端重连、超时重试、降级方案和监控告警。
Redis 集群模式是如何实现数据分片的
Redis Cluster 把整个 key 空间划分为 16384 个 hash slot。每个 key 通过 CRC16 计算后对 16384 取模,落到某个 slot,slot 再分配给具体主节点。
客户端访问时,如果请求打到错误节点,Redis 会返回 MOVED 重定向,告诉客户端正确节点。迁移 slot 过程中可能出现 ASK 重定向,表示临时去目标节点请求一次。
Cluster 不支持普通跨 slot 多 key 原子操作。需要把多个 key 放到同一个 slot 时,可以使用 hash tag,例如 order:{1001}:info 和 order:{1001}:items 都会按 {1001} 计算 slot。