Skip to content

Redis 升级步骤

升级前准备

1. 版本兼容性检查

  • 检查目标版本兼容性

    bash
    # 查看当前Redis版本
    redis-cli info server | grep redis_version
    
    # 查看Redis版本发布说明,了解兼容性变化
    # 访问:https://redis.io/docs/about/history/
  • 检查客户端兼容性

    • 确保应用使用的Redis客户端支持目标Redis版本
    • 检查客户端库的版本要求和兼容性说明

2. 备份数据

  • 创建RDB备份

    bash
    # 手动触发RDB备份
    redis-cli bgsave
    
    # 确认备份成功
    redis-cli lastsave
    
    # 复制备份文件到安全位置
    cp /var/lib/redis/dump.rdb /backup/redis/dump-$(date +%Y%m%d%H%M%S).rdb
  • 备份AOF文件(如果启用AOF):

    bash
    # 确认AOF状态
    redis-cli config get appendonly
    
    # 复制AOF文件到安全位置
    cp /var/lib/redis/appendonly.aof /backup/redis/appendonly-$(date +%Y%m%d%H%M%S).aof

3. 环境准备

  • 下载目标版本Redis

    bash
    # 下载Redis源码
    wget https://download.redis.io/releases/redis-7.2.0.tar.gz
    
    # 解压源码
    tar xzf redis-7.2.0.tar.gz
    cd redis-7.2.0
    
    # 编译安装
    make
    make install PREFIX=/usr/local/redis-7.2.0
    
    # 创建软链接
    ln -sf /usr/local/redis-7.2.0 /usr/local/redis
  • 准备配置文件

    bash
    # 复制现有配置文件
    cp /etc/redis/redis.conf /etc/redis/redis-7.2.0.conf
    
    # 检查并更新配置项
    # 参考Redis版本发布说明,调整不兼容的配置项

单实例Redis升级

1. 停止当前Redis实例

bash
# 使用systemd停止Redis
systemctl stop redis

# 或使用redis-cli停止
redis-cli shutdown

2. 升级Redis二进制文件

bash
# 替换Redis二进制文件
cp /usr/local/redis/bin/redis-server /usr/bin/redis-server
cp /usr/local/redis/bin/redis-cli /usr/bin/redis-cli

# 验证版本
redis-server --version
redis-cli --version

3. 启动Redis实例

bash
# 使用systemd启动Redis
systemctl start redis

# 或手动启动
redis-server /etc/redis/redis.conf

4. 验证升级

bash
# 检查Redis是否正常运行
redis-cli ping

# 检查Redis版本
redis-cli info server | grep redis_version

# 检查数据完整性
redis-cli dbsize
# 检查关键数据
redis-cli get <key>

主从复制升级

滚动升级方案(推荐)

1. 升级从节点

  1. 停止从节点

    bash
    redis-cli -h <slave-ip> -p <slave-port> shutdown
  2. 升级从节点二进制文件

    bash
    cp /usr/local/redis/bin/redis-server /usr/bin/redis-server
    cp /usr/local/redis/bin/redis-cli /usr/bin/redis-cli
  3. 启动从节点

    bash
    redis-server /etc/redis/redis.conf
  4. 验证从节点状态

    bash
    redis-cli -h <slave-ip> -p <slave-port> info replication
  5. 等待从节点与主节点同步完成

    bash
    # 检查从节点同步状态
    redis-cli -h <slave-ip> -p <slave-port> info replication | grep master_link_status

2. 升级主节点

  1. 将主节点切换为从节点(可选,适用于需要最小化 downtime 的场景):

    bash
    # 在从节点执行,提升为新主节点
    redis-cli -h <slave-ip> -p <slave-port> slaveof no one
    
    # 在应用中更新Redis主节点地址
    
    # 在原主节点执行,降为从节点
    redis-cli -h <master-ip> -p <master-port> slaveof <new-master-ip> <new-master-port>
  2. 停止原主节点

    bash
    redis-cli -h <master-ip> -p <master-port> shutdown
  3. 升级主节点二进制文件

    bash
    cp /usr/local/redis/bin/redis-server /usr/bin/redis-server
    cp /usr/local/redis/bin/redis-cli /usr/bin/redis-cli
  4. 启动主节点

    bash
    redis-server /etc/redis/redis.conf
  5. 恢复主从关系(如果执行了步骤1):

    bash
    # 在新主节点执行,降为从节点
    redis-cli -h <new-master-ip> -p <new-master-port> slaveof <original-master-ip> <original-master-port>
    
    # 等待同步完成
    redis-cli -h <new-master-ip> -p <new-master-port> info replication | grep master_link_status
    
    # 在原主节点执行,提升为新主节点
    redis-cli -h <original-master-ip> -p <original-master-port> slaveof no one
    
    # 在新主节点执行,降为从节点
    redis-cli -h <new-master-ip> -p <new-master-port> slaveof <original-master-ip> <original-master-port>
  6. 验证主从关系

    bash
    # 检查主节点状态
    redis-cli -h <master-ip> -p <master-port> info replication
    
    # 检查从节点状态
    redis-cli -h <slave-ip> -p <slave-port> info replication

Redis Sentinel 集群升级

滚动升级方案

1. 升级Sentinel节点

  1. 停止Sentinel节点

    bash
    redis-cli -h <sentinel-ip> -p <sentinel-port> -a <password> shutdown
  2. 升级Sentinel二进制文件

    bash
    cp /usr/local/redis/bin/redis-sentinel /usr/bin/redis-sentinel
  3. 启动Sentinel节点

    bash
    redis-sentinel /etc/redis/sentinel.conf
  4. 验证Sentinel节点状态

    bash
    redis-cli -h <sentinel-ip> -p <sentinel-port> -a <password> info sentinel
  5. 重复上述步骤,升级所有Sentinel节点

2. 升级Redis数据节点

按照主从复制升级的步骤,升级所有Redis数据节点(先升级从节点,再升级主节点)。

3. 验证Sentinel集群状态

bash
# 检查Sentinel集群状态
redis-cli -h <sentinel-ip> -p <sentinel-port> -a <password> sentinel master <master-name>
redis-cli -h <sentinel-ip> -p <sentinel-port> -a <password> sentinel slaves <master-name>
redis-cli -h <sentinel-ip> -p <sentinel-port> -a <password> sentinel sentinels <master-name>

Redis Cluster 升级

滚动升级方案

1. 升级从节点

  1. 识别集群中的从节点

    bash
    redis-cli -c -h <cluster-node-ip> -p <cluster-node-port> cluster nodes | grep slave
  2. 停止从节点

    bash
    redis-cli -h <slave-ip> -p <slave-port> shutdown
  3. 升级从节点二进制文件

    bash
    cp /usr/local/redis/bin/redis-server /usr/bin/redis-server
    cp /usr/local/redis/bin/redis-cli /usr/bin/redis-cli
  4. 启动从节点

    bash
    redis-server /etc/redis/redis.conf
  5. 验证从节点状态

    bash
    redis-cli -c -h <slave-ip> -p <slave-port> cluster info
    redis-cli -c -h <slave-ip> -p <slave-port> cluster nodes | grep <slave-ip>
  6. 重复上述步骤,升级所有从节点

2. 升级主节点

  1. 识别集群中的主节点

    bash
    redis-cli -c -h <cluster-node-ip> -p <cluster-node-port> cluster nodes | grep master
  2. 将主节点设置为不可写(可选,减少迁移过程中的写入压力):

    bash
    redis-cli -c -h <master-ip> -p <master-port> config set cluster-allow-reads-when-down yes
  3. 将主节点的槽迁移到其他主节点(如果需要维护可用性):

    bash
    # 使用redis-cli的cluster commands或第三方工具如redis-trib.rb进行槽迁移
    # 注意:Redis 5.0+ 推荐使用redis-cli进行槽管理
  4. 停止主节点

    bash
    redis-cli -h <master-ip> -p <master-port> shutdown
  5. 升级主节点二进制文件

    bash
    cp /usr/local/redis/bin/redis-server /usr/bin/redis-server
    cp /usr/local/redis/bin/redis-cli /usr/bin/redis-cli
  6. 启动主节点

    bash
    redis-server /etc/redis/redis.conf
  7. 验证主节点状态

    bash
    redis-cli -c -h <master-ip> -p <master-port> cluster info
    redis-cli -c -h <master-ip> -p <master-port> cluster nodes | grep <master-ip>
  8. 恢复主节点的写入权限(如果步骤2中设置了):

    bash
    redis-cli -c -h <master-ip> -p <master-port> config set cluster-allow-reads-when-down no
  9. 重复上述步骤,升级所有主节点

3. 验证集群状态

bash
# 检查集群状态
redis-cli -c -h <cluster-node-ip> -p <cluster-node-port> cluster info

# 检查所有节点状态
redis-cli -c -h <cluster-node-ip> -p <cluster-node-port> cluster nodes

# 检查槽分配情况
redis-cli -c -h <cluster-node-ip> -p <cluster-node-port> cluster slots

# 测试集群读写功能
redis-cli -c -h <cluster-node-ip> -p <cluster-node-port> set test-key test-value
redis-cli -c -h <cluster-node-ip> -p <cluster-node-port> get test-key

升级过程中的注意事项

1. 版本跳跃限制

  • 避免跨主要版本跳跃升级
    • 例如:不要从Redis 5.0直接升级到Redis 7.0
    • 建议按顺序升级:5.0 → 6.0 → 7.0
    • 参考Redis官方版本兼容性说明

2. 配置项兼容性

  • 检查并更新配置项

    • 查看目标版本的redis.conf文件,了解配置项变化
    • 移除已废弃的配置项
    • 添加新的配置项
    • 更新配置项的默认值
  • 使用配置检查工具

    bash
    # Redis 6.0+ 支持配置检查
    redis-server --check-config /etc/redis/redis.conf

3. 性能监控

  • 监控升级过程中的性能指标

    • CPU使用率
    • 内存使用率
    • 命令执行速度
    • 网络流量
    • 连接数
  • 使用redis-cli监控

    bash
    redis-cli info stats
    redis-cli info memory
    redis-cli info cpu

4. 客户端连接管理

  • 确保客户端支持平滑升级

    • 使用连接池管理客户端连接
    • 配置合理的连接超时和重试机制
    • 实现客户端的自动重连功能
  • 监控客户端连接状态

    • 检查客户端连接数变化
    • 监控连接错误率
    • 观察应用响应时间变化

升级后的验证

1. 功能验证

  • 测试基本命令

    bash
    redis-cli ping
    redis-cli set test-key test-value
    redis-cli get test-key
    redis-cli incr counter
    redis-cli del test-key counter
  • 测试数据结构

    bash
    # 测试String
    redis-cli set string-key "hello"
    
    # 测试List
    redis-cli lpush list-key 1 2 3
    redis-cli lrange list-key 0 -1
    
    # 测试Hash
    redis-cli hset hash-key field1 value1 field2 value2
    redis-cli hgetall hash-key
    
    # 测试Set
    redis-cli sadd set-key 1 2 3
    redis-cli smembers set-key
    
    # 测试Sorted Set
    redis-cli zadd zset-key 1 member1 2 member2 3 member3
    redis-cli zrange zset-key 0 -1 withscores

2. 数据完整性验证

  • 比较升级前后的数据量

    bash
    # 升级前
    pre-upgrade-size=$(redis-cli dbsize)
    
    # 升级后
    post-upgrade-size=$(redis-cli dbsize)
    
    # 比较大小
    echo "Pre-upgrade size: $pre-upgrade-size"
    echo "Post-upgrade size: $post-upgrade-size"
  • 抽样检查关键数据

    bash
    # 检查关键业务数据
    redis-cli get <business-key>
    redis-cli lrange <business-list> 0 10

3. 性能验证

  • 运行性能测试
    bash
    # 使用redis-benchmark测试性能
    redis-benchmark -h <redis-ip> -p <redis-port> -c 100 -n 100000
    
    # 比较升级前后的性能差异

4. 高可用性验证

  • 测试故障转移(如果适用):
    bash
    # 对于主从复制,手动停止主节点,检查从节点是否自动升级为主节点
    
    # 对于Sentinel集群,手动停止主节点,检查Sentinel是否自动进行故障转移
    
    # 对于Redis Cluster,手动停止主节点,检查集群是否自动将从节点升级为主节点

回滚方案

1. 单实例回滚

  1. 停止当前Redis实例

    bash
    redis-cli shutdown
  2. 恢复旧版本二进制文件

    bash
    # 恢复备份的旧版本二进制文件
    cp /backup/redis/bin/redis-server /usr/bin/redis-server
    cp /backup/redis/bin/redis-cli /usr/bin/redis-cli
  3. 恢复旧版本配置文件

    bash
    cp /backup/redis/redis.conf /etc/redis/redis.conf
  4. 启动Redis实例

    bash
    redis-server /etc/redis/redis.conf
  5. 恢复数据(如果需要):

    bash
    # 停止Redis
    redis-cli shutdown
    
    # 替换数据文件
    cp /backup/redis/dump.rdb /var/lib/redis/
    
    # 启动Redis
    redis-server /etc/redis/redis.conf

2. 主从/集群回滚

  • 按照升级的相反顺序回滚

    • 先回滚从节点,再回滚主节点
    • 对于集群,先回滚所有从节点,再回滚所有主节点
  • 参考升级步骤的逆过程

    • 停止当前版本的Redis实例
    • 恢复旧版本二进制文件和配置文件
    • 启动Redis实例
    • 验证回滚后的状态

常见问题(FAQ)

Q1: 升级过程中Redis服务不可用怎么办?

A1: 可以采取以下措施:

  1. 检查Redis日志,定位服务不可用的原因
  2. 尝试重启Redis服务:redis-server /etc/redis/redis.conf
  3. 如果重启失败,回滚到旧版本
  4. 检查配置文件,确保配置项与Redis版本兼容
  5. 检查系统资源,确保有足够的内存和CPU资源

Q2: 升级后数据丢失怎么办?

A2: 可以采取以下措施:

  1. 停止当前Redis实例
  2. 恢复升级前的备份数据
  3. 回滚到旧版本
  4. 重新评估升级方案,检查数据兼容性问题
  5. 考虑使用更安全的升级方法,如滚动升级

Q3: 升级后客户端连接失败怎么办?

A3: 可以采取以下措施:

  1. 检查Redis服务是否正常运行:redis-cli ping
  2. 检查Redis监听地址和端口:netstat -tuln | grep 6379
  3. 检查客户端配置,确保使用正确的Redis地址、端口和密码
  4. 检查客户端版本,确保与Redis版本兼容
  5. 检查防火墙规则,确保允许客户端连接

Q4: 如何处理升级过程中的槽迁移失败?

A4: 可以采取以下措施:

  1. 检查集群状态:redis-cli cluster info
  2. 检查槽分配情况:redis-cli cluster slots
  3. 尝试重新迁移槽:redis-cli cluster setslot <slot> migrating <target-node-id>
  4. 如果迁移失败,恢复槽分配:redis-cli cluster setslot <slot> node <source-node-id>
  5. 检查节点间的网络连接,确保所有节点可以正常通信

Q5: 升级后性能下降怎么办?

A5: 可以采取以下措施:

  1. 监控Redis性能指标:redis-cli info statsredis-cli info cpu
  2. 检查配置项,确保使用了最佳配置
  3. 检查数据结构使用情况,优化不合理的数据结构
  4. 检查命令执行情况,优化慢查询
  5. 考虑增加Redis节点数量,分担负载
  6. 如果性能问题严重,考虑回滚到旧版本

Q6: 如何升级Redis Cluster中的某个特定节点?

A6: 可以按照以下步骤:

  1. 识别目标节点:redis-cli cluster nodes | grep <node-ip>
  2. 检查节点角色(主节点或从节点)
  3. 如果是从节点,直接停止、升级、启动
  4. 如果是主节点,先将其槽迁移到其他主节点,再停止、升级、启动,最后恢复槽分配
  5. 验证节点状态:redis-cli cluster nodes | grep <node-ip>

Q7: 升级过程中需要停止应用吗?

A7: 不一定,取决于升级方案:

  1. 单实例升级:需要停止应用或忍受服务中断
  2. 主从复制滚动升级:不需要停止应用,从节点升级时不影响主节点提供服务
  3. Sentinel集群升级:不需要停止应用,Sentinel会自动进行故障转移
  4. Redis Cluster升级:不需要停止应用,集群会自动处理节点故障

建议使用滚动升级方案,最小化对应用的影响。

Q8: 如何验证升级后的Redis版本?

A8: 可以使用以下命令验证:

bash
# 检查Redis服务器版本
redis-server --version

# 检查Redis客户端版本
redis-cli --version

# 连接Redis服务器,检查服务器版本
redis-cli info server | grep redis_version

# 检查Redis模块版本(如果使用了模块)
redis-cli module list