Redis 5.0 集群升级到 6.0 支持滚动升级(Rolling Restart),无需停机。适用场景为生产环境集群架构,风险边界在于客户端兼容性和 ACL 配置变更。
先说结论:Redis Cluster 协议在 5.0 到 6.0 版本间保持兼容,可通过逐节点重启二进制文件实现不停机迁移。
- 适合:生产环境 Redis Cluster 架构,业务不允许长时间停机。
- 先准备:全量备份 RDB/AOF 文件,确认客户端驱动支持 Redis 6.0 协议。
- 验收:升级完成后检查集群状态为 ok,所有节点版本号显示 6.0。
命令速用版
以下命令用于检查集群状态和版本信息,升级过程中需反复执行验证。
redis-cli `--cluster` check 127.0.0.1:6379 redis-cli -h 127.0.0.1 -p 6379 info server | grep redis_version redis-cli -h 127.0.0.1 -p 6379 cluster info
为什么会这样
Redis 集群协议在 5.0 到 6.0 之间保持向后兼容,允许混合版本节点共存。
Redis 6.0 主要新增 ACL 权限控制、TLS 加密和多线程 I/O,底层集群总线协议(Cluster Bus Protocol)未发生破坏性变更。官方文档明确说明支持滚动升级,即每次停止一个节点,替换二进制文件,启动后该节点会自动同步数据并重新加入集群,期间其他节点继续提供服务。
分步处理
按节点逐个操作,确保每次只有一个节点处于离线状态。
步骤 1:环境备份
对每个节点执行快照,防止升级失败导致数据丢失。
bgsave # 确认 dump.rdb 生成时间 ls -lt /var/lib/redis/
步骤 2:停止旧节点
登录待升级节点,平滑关闭进程,确保数据落盘。
redis-cli -h 127.0.0.1 -p 6379 shutdown save
步骤 3:替换二进制文件
将 Redis 5.0 二进制文件替换为 6.0 版本,保持配置文件路径不变。
# 示例:备份旧 binary 并复制链接 mv /usr/bin/redis-server /usr/bin/redis-server.bak cp redis-6.0/src/redis-server /usr/bin/redis-server
步骤 4:启动新节点
使用原配置文件启动,观察日志确认无报错。
redis-server /etc/redis/redis.conf # 查看日志尾端 tail -f /var/log/redis/redis.log
步骤 5:等待同步完成
检查集群状态,确保该节点状态变为 connected 且数据同步完毕。
redis-cli `--cluster` check 127.0.0.1:6379
步骤 6:重复操作
对集群中剩余节点重复步骤 2 至步骤 5,直到所有节点升级完成。
怎么验证是否生效
通过集群检查命令和版本信息确认升级结果。
检查点 1:集群健康状态
执行 cluster check,输出应包含 cluster_state:ok,且无 fail 节点。
redis-cli -h 127.0.0.1 -p 6379 cluster info
检查点 2:节点版本一致性
遍历所有节点,确认 redis_version 字段均为 6.0.x。
redis-cli -h 127.0.0.1 -p 6379 info server | grep redis_version
检查点 3:业务读写验证
在应用侧执行常规读写操作,确认无超时或连接拒绝错误。
常见坑
升级过程中需注意配置兼容性和客户端行为。
- ACL 权限变更:Redis 6.0 默认启用 ACL,若配置文件未显式设置 requirepass 或 user default,可能导致旧客户端鉴权失败。建议在配置文件中保留 requirepass 兼容旧客户端。
- TLS 配置冲突:若原 5.0 版本未启用 TLS,升级后不要随意开启 tls-port,否则客户端无法连接。
- 客户端驱动版本:部分老旧 Redis 客户端驱动可能无法解析 6.0 新增的响应格式,建议提前在测试环境验证客户端兼容性。
- 内存碎片率:升级后重启进程可能暂时降低内存碎片率,但需观察长期运行状态,避免误判为性能提升。
常见问题
升级过程中会发生数据丢失吗?
正常滚动升级不会丢失数据。每次关闭节点前执行 shutdown save 可确保数据持久化,新节点启动后会通过集群同步机制获取最新数据。
客户端需要更新版本吗?
大多数主流客户端无需更新。Redis 6.0 协议向下兼容,但若客户端硬编码了特定版本判断逻辑,可能需要调整。
升级失败如何回滚?
若新节点启动失败,可立即恢复原二进制文件并重启。若数据已发生写入,回滚可能导致数据不一致,建议优先修复新环境而非直接回滚。
参考来源
- Redis 官方文档,Redis Cluster specification,https://redis.io/docs/latest/develop/interact/programmability/cluster-spec/
- GitHub Redis 仓库,Redis 6.0 Release Notes,https://github.com/redis/redis/blob/6.0/00-RELEASENOTES