集群额外的延迟来源
集群模式在单机延迟之上会多出三类开销:客户端被 MOVED 或 ASK 重定向后多走一次往返、槽迁移窗口内请求的转发与 ASK 跳转、以及跨节点多键操作的分片往返。设计上把同一业务实体的键放进同一个槽(用哈希标签把部分键名固定到同一槽),能消掉大部分跨节点往返;迁移安排在业务低峰并监控重定向,能把窗口抖动控制在可接受范围。
基本信息
| 永久重定向 | MOVED(槽已属于其他节点) |
|---|---|
| 迁移期重定向 | ASK(槽正在迁移中) |
| 共槽手段 | 键名中的哈希标签 {} |
| 客户端行为 | redis-cli -c 自动跟随重定向 |
| 观测命令 | CLUSTER INFO / CLUSTER SLOTS |
| 槽级工具 | CLUSTER COUNTKEYSINSLOT |
| 相关超时 | cluster-node-timeout |
典型使用场景
- 业务从单机迁移到集群后延迟上升,需要量化重定向的影响
- 设计键命名规则,让同一业务维度的键落到同一个槽
- 做槽迁移时选择合适的窗口并监控影响面
- 排查多键命令报 CROSSSLOT 错误并改成共槽写法
- 解释集群下 MGET 类批量操作比单机慢的原因
- 评估客户端缓存与集群配合时的额外延迟收益
观测与共槽写法
观测与共槽写法
redis-cli -c CLUSTER INFO # 集群状态与节点数
redis-cli -c CLUSTER SLOTS # 槽与节点的分布
redis-cli -c CLUSTER COUNTKEYSINSLOT 1234 # 某个槽里的键数量
redis-cli -c CLUSTER GETKEYSINSLOT 1234 10 # 抽样看该槽的键
redis-cli -c SET user:{1001}:name neo # 哈希标签决定槽归属
redis-cli -c MGET user:{1001}:name user:{1001}:age # 同槽多键才可批量
redis-cli -c GET user:1002:name # 无标签:可能触发重定向延迟来源对照
| 来源 | 触发条件 | 缓解方式 |
|---|---|---|
| MOVED 重定向 | 客户端槽映射过期 | 维护映射或开启跟随 |
| ASK 重定向 | 槽处于迁移中 | 迁移安排在低峰 |
| 跨节点多键 | 键分散在不同节点 | 哈希标签共槽 |
| 心跳与故障判定 | 节点间网络抖动 | 合理设置节点超时 |
重定向速率是集群健康的早期信号:它突增通常早于业务延迟表现出问题。
哈希标签要落在业务实体的稳定标识上,把整个业务都塞进一个槽会重新制造单点热点。