Redis 6.x → 7.2 滚动升级

迁移第一步「版本升级」的落地步骤。采用 Redis 官方推荐的滚动升级:用新版本副本逐个替换旧节点,再计划性切主,全程不停服。

主线以 单实例主从 讲清核心流程;Redis Cluster 的差异见文末补充章节。

参考 Redis 官方《Redis administration · Upgrading without downtime》。


适用与前提

  • 场景:Redis 6.x(先在同大版本内对齐到 6.2.x)滚动升级到 7.2.x。
  • 前提:主从复制正常、可计划性切主;主节点已开启持久化或不设崩溃自动重启(避免空库回灌副本)。

升级前准备

  • 配置对齐(新旧节点一致):maxmemory 与淘汰策略、AOF / RDB 策略、requirepass / masterauth、连接数与超时、TLS、复制 backlog(按内存规模留足)。
  • 兼容性核对(高层):用真实命令日志盘点线上实际用到的命令 / 用法(Lua、Streams、阻塞命令、Module 等重点),对高频与高风险用法做验证;不必逐条比对版本差异清单。
  • 备份与基线:升级前 BGSAVE 一次;记录拓扑、连接数 / 延迟基线。

升级友好配置(可选)

升级 / 加从期间的主要风险是全量重同步循环与主库压力尖峰。以下配置有助于滚动切主更平稳(具体值按数据规模压测确定,不要照抄数字):

配置 作用
repl-backlog-size 断链后走部分重同步,避免整段全量重同步
client-output-buffer-limit replica … 高峰写 + 初次同步时,避免复制输出缓冲超限被主库断开、陷入重同步循环
repl-diskless-sync / -delay 慢盘环境下全量同步走网络、不落盘,降低主库磁盘压力
repl-timeout 大数据集 / 慢链路下适度调大,避免误判超时触发重同步
maxmemory 预留余量 同步 / RDB 期内存占用可达平时约 2 倍,预留内存余量避免 OOM

安全前提(非调优):主库开启持久化或不设崩溃自动重启;升级副本用 SHUTDOWN(save & quit)优雅重启以便部分重同步;切换提主用 REPLICAOF NO ONE不要开可写副本作为中间态

依据见 Redis 官方复制管理文档。


升级流程(主线:单实例主从)

① 加 7.2 从 新 7.2 实例作为旧 6.x 主的从,追平复制 ② 验证 主从 key 数一致、master_link_status:up、offset 对齐 ③ (可选)压测 模拟业务负载确认稳定 ④ 切主 停写 → 等从追平 offset → 提升 7.2 为主 → 客户端指向新主 ⑤ 观察期 保留旧 6.x 节点(时长由业务定),按清单巡检 ⑥ 收尾 下线旧 6.x 节点

关键动作(示例命令,按环境调整)

  • 加从:新 7.2 实例 REPLICAOF <旧主IP> <端口>(如需鉴权先设 masterauth);等初次同步完成。
  • 追平判定:INFO replicationmaster_link_status:up、offset 与主对齐、延迟稳定。
  • 切主(先建立一致点,再提主):
    1. 旧主执行 CLIENT PAUSE WRITE <ms> 短暂停写(Redis 6.2+)。
    2. 记录旧主 INFO replicationmaster_repl_offset
    3. 等 7.2 从的复制 offset 追到该值(确认已处理完停写前的复制流)。
    4. 7.2 从执行 REPLICAOF NO ONE 提主。
    5. 客户端指向新主。
    6. 旧主停止对外写入;如需观察期,再按回滚策略决定去留。

7.2 能加载 6.x 的 RDB(向前兼容),所以「7.2 从旧 6.x 主」同步没问题。


Redis Cluster 补充

Cluster 可复用"逐 shard 加从、追平、手动 failover"的思路,但上线前建议单独演练,不要把单实例主从的结果直接外推到 Cluster。

核心流程相同,差异在于命令与切流:

  • 加从:新 7.2 节点 CLUSTER MEET 加入后 CLUSTER REPLICATE <主节点ID>
  • 切主:目标 7.2 从上 CLUSTER FAILOVER逐 shard 进行(一次一个,切完验证 cluster_state:okrole:master 再切下一个)。CLUSTER FAILOVER 默认会让原主停写、发送 offset、等从追平后再完成,因此不必叠加单实例那种裸 CLIENT PAUSE;默认不要用 FORCE / TAKEOVER。slot 随新主自动保留。
  • 切流:Cluster 客户端按拓扑自动跟随,无需手动重指向
  • 下线顺序:先移除旧 6.x 从,最后移除旧 6.x 主。

验证检查点

阶段 检查 判定
升级前 健康 / 版本 / 复制 复制正常(Cluster:cluster_state:ok
加从后 复制追平 master_link_status:up、offset 对齐
切主后 新主角色 role:master(Cluster:cluster_state:ok
全程 抽样一致性 抽样 Key + Value + TTL 一致
观察期 延迟 / 错误 / 连接 / 内存 无明显劣化、无 ERROR 日志

回滚

  • 观察期内可回退:把原 6.x 主重新提主、客户端切回(Cluster:CLUSTER FAILOVER 回切)。
  • 跨大版本的两个约束
    • 旧 6.x 无法加载 7.2 的 RDB,因此不能让 6.x 稳定地做 7.2 的从(一旦触发全量重同步就会失败)。保留的旧节点只是「切主点的数据快照」,观察期内不要重启 / 重建旧节点
    • 因此回滚会丢失切主后写入 7.2 的增量。对一致性敏感的业务,切主时做短暂停写,把回滚窗口的不一致降到最小。

回到 迁移总览 · 下一步 Redis 7.2 → Engula