最直接的方案是redis-cli --cluster import,但需清空集群、确认slot分布、关闭protected-mode、调大repl-backlog-size,并配合redis-shake增量同步+切流机制才能平滑过渡。

redis-cli --cluster import 是最直接的方案,但“无缝”不等于“无感知”——它无法规避客户端切换、slot 分配逻辑变更和写入重定向带来的行为差异。真正能支撑业务平滑过渡的,是配合 redis-shake 的增量同步 + 切流机制。
用 redis-cli --cluster import 迁移前必须清空集群并确认 slot 分布
这个命令本质是单次全量导入,不会自动做 slot 预分配,也不会处理目标集群已有数据冲突(除非加 --cluster-replace)。常见错误现象是:导入后 key 看不见、GET 返回 (error) MOVED、或部分 key 写入失败。
- 必须先用
redis-cli --cluster info查集群 slot 分布,确保所有 master 节点都处于connected状态且总 slots = 16384 - 导入前建议对集群执行
FLUSHALL(逐节点连,不能只连一个);否则--cluster-replace只覆盖同名 key,不清理旧数据 -
--cluster-from指向的单机 Redis 必须可直连,且不能启用protected-mode yes(否则连接被拒) - 如果单机 Redis 有密码,
-a参数要放在集群地址前,例如:redis-cli -a mypass --cluster import 10.0.0.1:7000 --cluster-from 10.0.0.1:6379 --cluster-copy
redis-shake 同步时必须关闭 protected-mode 并调大 repl-backlog-size
很多迁移卡在 connect timeout 或同步中断,根本原因不是网络,而是源 Redis 的安全配置和复制缓冲区太小。同步启动后若发现 INFO replication 中 master_repl_offset 停滞、或日志反复报 ERR unknown command 'psync',基本就是这俩配置没调。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 源 Redis 配置中必须设
protected-mode no,否则redis-shake无法建立初始连接 -
repl-backlog-size建议 ≥512mb(尤其当单机数据量 >1GB 或同步耗时 >10 分钟时),否则断网重连后无法续传,只能重做全量 - 目标集群若启用了 ACL,账号必须有
+@all +allkeys权限;仅allkeys不够,因为redis-shake会发CLUSTER SLOTS和CLUSTER KEYSLOT等管理命令 -
sync_mode = sync是强制项,不能用restore模式——后者会尝试发SLAVEOF,而集群节点拒绝该命令
导入后必须验证 key 的 slot 分布是否符合 CRC16 计算结果
Redis Cluster 按 CRC16(key) & 16383 自动分 slot,redis-shake 和 import 都依赖这个逻辑。但如果你的单机数据里大量使用了 hash tag(如 {user1001}:name)或 Lua 脚本批量操作跨 slot key,就可能触发 ASK 或 MOVED 错误,导致部分 key 同步失败或写入被丢弃。
- 抽样检查:在目标集群任一节点执行
CLUSTER KEYSLOT some_key_name,再用 Python 或在线工具算一遍 CRC16,确认一致 - 含
{}的 key 会被截取括号内内容做 hash,所以{user}:1和{user}:2一定落在同一 slot;但user:1和user:2可能分散 - 避免在同步期间执行
MSET或含多个redis.call('set', ...)的 Lua 脚本——集群不支持跨 slot 原子操作,redis-shake无法拆解,直接报错 - 验证脚本可用:
redis-cli -c -h 10.0.0.1 -p 7000 --scan | head -n 100 | xargs -I{} redis-cli -c -h 10.0.0.1 -p 7000 CLUSTER KEYSLOT {} 2>/dev/null | sort | uniq -c
客户端切流前必须改用支持集群协议的驱动并禁用 pipeline 批量写
即使数据全量导入成功,老客户端继续用单机模式连集群任意节点,也会因重定向失败而报错。这不是数据问题,是协议层不兼容。
- Python 用户必须换
redis-py-cluster(非原生redis),且初始化时指定全部节点地址,不能只写一个 - Java 用户需用
JedisCluster或LettuceClusterClient,禁用pipeline的批量SET——集群下 pipeline 仍受限于单个 slot - 切流必须灰度:先切 5% 流量,观察
CLUSTER INFO中cluster_stats_messages_ask_received和cluster_stats_messages_moved_received是否突增;突增说明客户端没正确处理重定向 - 不要依赖
redis-cli -c测试业务逻辑——它的重定向是 shell 层自动补全的,不代表应用代码能正确处理










