外观
一句话答案
Pipeline 将多个命令打包一次发送,减少网络往返次数(RTT),批量操作性能提升数倍。
核心要点
扩容(添加新节点 + 分配 slot):
场景:现有 3 主 3 从,新增 Node D(主) + Node D'(从)
1. 添加节点到集群:
redis-cli --cluster add-node <新节点ip:port> <集群任意节点ip:port>
2. 分配 slot(resharding):
redis-cli --cluster reshard <集群节点ip:port>
→ 指定要迁移的 slot 数量(如从 A/B/C 各迁出部分 slot 给 D)
→ 工具自动完成 slot 迁移
3. 为新主节点添加从节点:
redis-cli --cluster add-node <从节点ip:port> <集群节点ip:port> \
--cluster-slave --cluster-master-id <Node D的ID>Slot 迁移的详细过程(单个 slot):
将 slot X 从 Node A 迁移到 Node D:
1. Node D: CLUSTER SETSLOT X IMPORTING <A的nodeId>
→ D 准备导入 slot X 的数据
2. Node A: CLUSTER SETSLOT X MIGRATING <D的nodeId>
→ A 将 slot X 标记为迁移中
3. 循环迁移 key:
① CLUSTER GETKEYSINSLOT X 100 # 从 A 获取 slot X 中的 100 个 key
② MIGRATE <D的ip> <D的port> "" 0 5000 KEYS key1 key2 ... # 原子迁移到 D
③ 重复直到该 slot 的所有 key 迁移完毕
4. 通知所有节点 slot X 现在属于 D:
CLUSTER SETSLOT X NODE <D的nodeId> # 向所有节点广播
迁移期间的数据访问:
客户端访问 slot X 的 key:
├─ key 还在 A → A 正常返回
└─ key 已迁移到 D → A 返回 ASK 重定向 → 客户端向 D 查询缩容(移除节点):
1. 将待移除节点的 slot 迁移到其他节点(resharding)
2. 确认该节点 slot 为空后:
redis-cli --cluster del-node <集群节点ip:port> <待移除节点ID>
3. 如果移除的是主节点,其从节点会自动挂到其他主节点下追问与易错
追问方向:
- Pipeline 和事务的区别?
- Pipeline 命令数量有限制吗?
- Pipeline 可以跨 Cluster 节点吗?
易错点:
- ❌ Pipeline 是原子的——不是,只是批量发送
- ❌ Pipeline 中某条失败会回滚——不会
💡 记忆锚点
Pipeline = 攒快递:一个个寄(逐条命令)太慢,攒一箱一起寄(批量发送),省的是跑邮局的路费(RTT),但箱子里每件包裹仍然独立,丢一个不影响其他。