PSYNC 返回 -ERR unknown command 是因 Redis 2.8 前不支持该命令,主从版本均需 ≥2.8;若从节点为 2.6 或更早,只能降级使用 SYNC(需 Redis 4.0+ 显式启用 slave-serve-stale-data yes)。

PSYNC 命令返回 -ERR unknown command 怎么办
Redis 2.8 之前不支持 PSYNC,集群中混用旧版本主从节点时会直接报这个错。不是配置问题,是协议不兼容。
- 先确认版本:
redis-cli --version,主从双方都得 ≥ 2.8 - 若从节点是 2.6 或更早,
PSYNC会被拒绝,此时只能降级用SYNC(全量同步,无增量能力) - Redis 4.0+ 默认禁用
SYNC,需在配置里显式开启slave-serve-stale-data yes并重启
执行 PSYNC 后返回 FULLRESYNC 但没后续数据流
说明主节点同意全量同步,但从节点卡在 RDB 传输阶段。常见于网络或磁盘瓶颈,而非命令本身失败。
- 检查主节点日志是否有
Failed to write to RDB file或fork() failed - 从节点执行
redis-cli info replication,看master_sync_in_progress:1是否长期为 1 - 确认从节点磁盘剩余空间 ≥ 主节点当前
used_memory_peak_human的 1.5 倍(RDB + AOF buffer) - 若主节点启用了
rdbcompression no,RDB 文件体积可能陡增,加剧网络/IO 压力
PSYNC 返回 +CONTINUE 但 offset 不更新
这是典型的“假同步”:从节点认为自己在增量同步,但主节点实际没发新命令。根本原因是复制缓冲区(repl-backlog)被覆盖或从节点断连太久。
- 查主节点
redis-cli info replication中的repl_backlog_active和repl_backlog_size - 计算偏移差:
master_repl_offset - slave_repl_offset,若超过repl_backlog_size,必然触发全量重同步 -
repl-backlog-size默认仅 1MB,高写入场景下极易溢出;建议设为写入峰值 QPS × 命令平均大小 × 60 秒 - 从节点日志若频繁出现
Partial resynchronization not possible,就是 backlog 不够用了
CLUSTER NODES 显示节点状态正常,但 INFO REPLICATION 的 master_link_status=down
集群拓扑和复制链路是两套独立机制。节点在 CLUSTER NODES 里显示 connected,只代表 Cluster Bus 通,不代表复制 TCP 连接活着。
- 用
netstat -tnp | grep :6379(主节点端口)确认从节点 IP 是否有 ESTABLISHED 连接 - 检查主节点
tcp-keepalive配置,默认 0(禁用),NAT 环境下连接易被中间设备静默断开 - 防火墙可能放行了 Cluster Bus 端口(如 16379),但拦截了复制端口(默认 6379)
- 从节点配置的
slaveof地址必须是主节点的bind地址之一,不能是127.0.0.1或未 bind 的网卡 IP
复制进度不是靠一次 PSYNC 调用就能判断的,关键在持续观察 master_repl_offset 和 slave_repl_offset 的收敛趋势。最容易被忽略的是 repl-backlog 大小和主从时钟漂移——后者会导致 PSYNC ? -1 请求被主节点拒绝,错误日志里却只字不提。

















