Redis 集群方案

在 Redis Cluster 环境下生成分布式 ID 需要考虑集群的特殊性。

Redis Cluster 挑战

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 集群方案后,我们学习性能优化。

👉 下一节:性能优化

发现内容有问题?

告诉我们哪里需要改进。