*Redis 升级指南

原文:https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/ 翻译整理:Kimi


本文介绍在不同平台上升级 Redis 的方法,以及升级前的准备工作和注意事项。

*升级前准备

*1. 备份数据

无论使用何种升级方式,升级前必须备份数据!

# 触发 RDB 保存
redis-cli SAVE

# 备份 RDB 文件
cp /var/lib/redis/dump.rdb /backup/dump.rdb.$(date +%Y%m%d_%H%M%S)

# 备份 AOF 文件(如果启用)
cp /var/lib/redis/appendonly.aof /backup/appendonly.aof.$(date +%Y%m%d_%H%M%S)

# 备份配置文件
cp /etc/redis/redis.conf /backup/redis.conf.$(date +%Y%m%d_%H%M%S)

*2. 检查当前版本

redis-cli INFO server | grep redis_version
redis-server --version

*3. 查阅版本说明

  • 查看 Redis 发布说明 了解新版本的变化
  • 注意破坏性变更(Breaking Changes)
  • 确认当前使用的功能在新版本中仍然支持

*4. 测试环境验证

强烈建议先在测试环境验证升级过程:

  1. 搭建与生产环境相同的测试实例
  2. 使用生产数据备份恢复测试实例
  3. 执行升级操作
  4. 验证应用兼容性
  5. 运行性能基准测试

*版本兼容性说明

升级路径 兼容性 说明
同一大版本的小版本升级 ✅ 完全兼容 如 7.2.0 → 7.2.5
大版本升级(如 6.x → 7.x) ⚠️ 需验证 可能有配置变更或行为差异
大版本升级(如 7.x → 8.x) ⚠️ 需验证 可能有破坏性变更
降级 ❌ 不推荐 数据格式可能不兼容

*方法一:APT 升级(Ubuntu/Debian)

*标准升级

# 更新包索引
sudo apt-get update

# 查看可用版本
apt policy redis

# 升级 Redis
sudo apt-get install --only-upgrade redis

# 重启服务
sudo systemctl restart redis

*升级到特定版本

# 查看可用版本
apt-cache policy redis | grep Candidate

# 安装指定版本
sudo apt-get install redis=6:8.0.0-1rl1~noble1

# 固定版本防止自动升级
sudo apt-mark hold redis

*解除版本固定

sudo apt-mark unhold redis

*方法二:RPM 升级(Rocky/AlmaLinux)

# 更新包索引
sudo yum check-update

# 升级 Redis
sudo yum update redis

# 或仅升级 Redis
sudo yum update redis --enablerepo=Redis

# 重启服务
sudo systemctl restart redis

*升级到特定版本

# 查看可用版本
sudo yum --showduplicates list redis

# 安装指定版本
sudo yum install redis-8.0.0-1.el9.x86_64

*方法三:源码升级

*1. 停止 Redis

# 优雅关闭(会触发保存)
redis-cli SHUTDOWN

# 或强制关闭(如果优雅关闭失败)
sudo systemctl stop redis

*2. 备份并清理旧版本

# 备份旧版本二进制文件
sudo cp /usr/local/bin/redis-server /usr/local/bin/redis-server.old
sudo cp /usr/local/bin/redis-cli /usr/local/bin/redis-cli.old

# 记录旧版本信息
redis-server --version > /backup/redis-version-old.txt

*3. 下载并编译新版本

# 下载新版本
cd /usr/local/src
wget https://download.redis.io/redis-8.0.0.tar.gz
tar -xzvf redis-8.0.0.tar.gz
cd redis-8.0.0

# 编译
make -j$(nproc)

# 运行测试(可选但推荐)
make test

# 安装
sudo make install

*4. 更新配置

检查新版本是否有新增或变更的配置项:

# 对比新旧配置文件
diff /usr/local/src/redis-8.0.0/redis.conf /etc/redis/redis.conf

# 或使用 meld/vimdiff 等工具可视化对比
meld /usr/local/src/redis-8.0.0/redis.conf /etc/redis/redis.conf

常见需要关注的配置变更:

  • 新增的安全相关配置
  • 默认值的变更
  • 已弃用的配置项

*5. 启动新版本

sudo systemctl start redis

# 验证版本
redis-server --version
redis-cli INFO server | grep redis_version

# 验证数据完整性
redis-cli DBSIZE
redis-cli INFO keyspace

*6. 清理旧版本

确认新版本运行正常后:

# 删除旧版本源码
sudo rm -rf /usr/local/src/redis-oldversion

# 删除旧版本备份(保留一段时间后再删除)
# sudo rm /usr/local/bin/redis-server.old

*方法四:Docker 升级

*1. 备份数据

# 如果使用了数据卷,直接备份卷
docker run --rm -v redis-data:/data -v $(pwd):/backup alpine tar czf /backup/redis-backup.tar.gz -C /data .

# 或使用 docker cp
docker cp redis:/data ./redis-backup

*2. 拉取新版本镜像

docker pull redis:8.0

*3. 停止并删除旧容器

docker stop redis
docker rm redis

*4. 启动新容器

docker run -d --name redis   -p 6379:6379   -v redis-data:/data   redis:8.0

*5. 验证

docker exec redis redis-cli INFO server | grep redis_version
docker exec redis redis-cli DBSIZE

*使用 Docker Compose 升级

# 修改 docker-compose.yml 中的镜像版本
# 例如:image: redis:8.0

# 拉取新镜像
docker-compose pull

# 重新创建容器
docker-compose up -d

# 验证
docker-compose exec redis redis-cli INFO server | grep redis_version

*方法五:Homebrew 升级(macOS)

# 更新 Homebrew
brew update

# 升级 Redis
brew upgrade redis

# 重启服务
brew services restart redis

# 验证版本
redis-server --version

*高可用环境的滚动升级

对于使用 Sentinel 或 Cluster 的生产环境,应采用滚动升级策略以最小化停机时间。

*Sentinel 环境滚动升级

假设架构:1 主(M)+ 2 从(R1, R2)+ 3 Sentinel

1. 升级副本节点(逐个进行)
   - 停止 R1 的 Redis 服务
   - 升级 R1 的 Redis 版本
   - 启动 R1,等待与主节点同步完成
   - 对 R2 重复上述步骤

2. 手动故障转移
   - 在 R1 上执行:redis-cli CLUSTER FAILOVER(Sentinel 环境下使用 SENTINEL FAILOVER)
   - 或等待 Sentinel 自动故障转移
   - 确认 R1 成为新主节点

3. 升级旧主节点(现在的副本)
   - 停止旧 M
   - 升级版本
   - 启动,等待同步

4. 如需,再次故障转移恢复原始拓扑

*Cluster 环境滚动升级

假设架构:3 主 + 3 从

1. 升级所有副本节点(逐个进行)
   - 停止副本的 Redis
   - 升级版本
   - 启动副本
   - 等待集群状态恢复(cluster_state:ok)
   - 对下一个副本重复

2. 升级主节点(逐个进行)
   - 对要升级的主节点执行手动故障转移:
     redis-cli CLUSTER FAILOVER
   - 等待副本成为新主节点
   - 升级旧主节点(现在为副本)
   - 启动并等待同步
   - 如需,再次故障转移恢复原始角色
   - 对下一个主节点重复

注意:Redis Cluster 4.0 在集群总线协议级别与 3.2 不兼容,因此从 3.2 升级到 4.0 需要大规模重启。但 Redis 5 集群总线与 Redis 4 向后兼容。


*升级后验证清单

  • 确认 Redis 版本正确:redis-cli INFO server | grep redis_version
  • 检查服务状态:systemctl status redis
  • 验证数据完整性:redis-cli DBSIZE、redis-cli INFO keyspace
  • 测试基本操作:redis-cli ping、redis-cli set test value、redis-cli get test
  • 检查持久化状态:redis-cli INFO persistence
  • 验证复制状态(如有副本):redis-cli INFO replication
  • 检查日志是否有错误或警告:tail -n 100 /var/log/redis/redis-server.log
  • 运行性能基准测试,对比升级前后的性能
  • 验证应用连接正常,业务功能无异常

*回滚方案

如果升级后出现问题,需要快速回滚:

*APT/RPM 回滚

# 查看已安装版本历史
apt-cache policy redis    # Ubuntu/Debian
yum history list          # Rocky/AlmaLinux

# 降级到旧版本
sudo apt-get install redis=旧版本号
# 或
sudo yum downgrade redis-旧版本号

*源码回滚

# 停止 Redis
sudo systemctl stop redis

# 恢复旧版本二进制文件
sudo cp /usr/local/bin/redis-server.old /usr/local/bin/redis-server
sudo cp /usr/local/bin/redis-cli.old /usr/local/bin/redis-cli

# 恢复旧配置文件
sudo cp /backup/redis.conf.YYYYMMDD /etc/redis/redis.conf

# 启动旧版本
sudo systemctl start redis

*数据回滚

# 停止 Redis
sudo systemctl stop redis

# 恢复备份的 RDB 文件
sudo cp /backup/dump.rdb.YYYYMMDD /var/lib/redis/dump.rdb
sudo chown redis:redis /var/lib/redis/dump.rdb

# 启动 Redis(会自动加载 RDB)
sudo systemctl start redis

*常见问题

*升级后无法启动

  1. 检查日志:/var/log/redis/redis-server.log
  2. 检查配置文件兼容性
  3. 检查权限:/var/lib/redis、/var/log/redis
  4. 尝试使用默认配置启动:redis-server /usr/local/src/redis-new/redis.conf

*数据丢失

  1. 检查是否启用了持久化
  2. 检查 RDB/AOF 文件是否存在且完整
  3. 使用 redis-check-rdb 和 redis-check-aof 检查文件
  4. 从备份恢复

*性能下降

  1. 检查新版本的默认配置是否有变更
  2. 对比升级前后的 redis-cli INFO all 输出
  3. 检查系统资源使用(CPU、内存、I/O)
  4. 考虑调整配置参数

*最佳实践

  1. 始终先备份:升级前完整备份数据和配置
  2. 先在测试环境验证:模拟生产环境进行升级测试
  3. 选择维护窗口:在生产环境低峰期执行升级
  4. 监控升级过程:实时观察日志和监控指标
  5. 准备回滚方案:确保能在出现问题时快速恢复
  6. 逐步升级:高可用环境使用滚动升级,逐个节点进行
  7. 记录变更:记录升级前后的版本、配置变更和性能数据