这是 Beta 探索课程,内容结构、实验步骤和示例可能会继续调整。
Redis 集群方案
在 Redis Cluster 环境下生成分布式 ID 需要考虑集群的特殊性。
1. 数据分片
问题:
Redis Cluster 自动分片数据
INCR 命令必须路由到正确的节点
不同业务类型使用不同的键
2. Slot 计算
原理: Redis Cluster 使用 CRC16 算法计算键的 slot。
实现:
1. 读写分离
Redis Cluster 的每个分片都是一个主从组:主节点负责写,从节点负责读。写命令只能发给主节点,读命令可以发给从节点,从节点通过主从复制异步同步数据。
客户端
│ 写
▼
┌──────────┐ 异步复制 ┌──────────┐
│ 主节点 │ ─────────▶ │ 从节点 │
└──────────┘ └──────────┘
▲ 读,可能读到旧数据
│
客户端
读写分离能扛住读多写少的场景,但有三个前提要满足:
| 前提 | 说明 | 不满足的后果 |
|---|---|---|
| 复制延迟可接受 | 主从复制是异步的,从节点可能落后几十毫秒 | 刚写完立刻读会读到旧值 |
| 关键读走主节点 | 写后立即读必须读主节点 | 用户看到「刚提交的数据没生效」 |
| 从节点数量足够 | 每个分片通常配 1 到 2 个从节点 | 从节点太少,读请求压回主节点 |
对 ID 生成还要额外注意一点:读请求不参与发号,所以读写分离对写压力没有帮助——Redis 方案的瓶颈在写(INCR),把读分出去并不会提升发号能力。
2. 故障转移
主节点挂掉之后需要有机制把从节点提升为新的主节点,否则整个分片不可写。
两种常见模式:
| 模式 | 机制 | 典型配置 | 故障检测时间 |
|---|---|---|---|
| Cluster 模式 | 集群内部节点之间协商,失败节点被标记为下线 | cluster-node-timeout | 默认 15 秒 |
| Sentinel 模式 | 哨兵进程监控主从,主节点下线后执行提升 | down-after-milliseconds | 默认 10 秒 |
Cluster 模式的关键参数:
cluster-node-timeout 15000 # 节点多久无响应就认为下线
cluster-require-full-coverage yes # 有分片缺失时是否停止服务
min-replicas-to-write 1 # 写操作至少要有几个从节点在线
min-replicas-max-lag 10 # 从节点允许的最大复制延迟(秒)
Sentinel 模式的关键参数:
down-after-milliseconds 10000 # 多久联系不到主节点就判定下线
failover-timeout 60000 # 故障转移的超时时间
parallel-syncs 1 # 故障转移后同时同步的从节点数
对 ID 生成来说,故障转移要盯两个点:
- 被提升为新主的那个从节点,计数器里已同步的值必须是最新的,否则会发出重复 ID。
min-replicas-to-write就是为此设的:可用从节点不足时直接拒绝写入,宁可报错也不要发出重复 ID。 - 故障转移期间(通常几秒到几十秒)该分片不可写,发号请求会失败,这一层要有降级方案兜底。
降级兜底:
1. 号段模式:本地还有备用号段,可以继续发号
2. 雪花算法:机器 ID 唯一的前提下可以本地生成
3. UUID:最后兜底,不保证有序
✅ 适合使用
- 已有 Redis Cluster
- 需要高可用
- 中高并发系统
❌ 不适合使用
- 无 Redis 基础设施
- 超高并发系统
了解了 Redis 集群方案后,我们学习性能优化。
👉 下一节:性能优化
发现内容有问题?
告诉我们哪里需要改进。
