外观
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 shutdown2. 升级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 --version3. 启动Redis实例
bash
# 使用systemd启动Redis
systemctl start redis
# 或手动启动
redis-server /etc/redis/redis.conf4. 验证升级
bash
# 检查Redis是否正常运行
redis-cli ping
# 检查Redis版本
redis-cli info server | grep redis_version
# 检查数据完整性
redis-cli dbsize
# 检查关键数据
redis-cli get <key>主从复制升级
滚动升级方案(推荐)
1. 升级从节点
停止从节点:
bashredis-cli -h <slave-ip> -p <slave-port> shutdown升级从节点二进制文件:
bashcp /usr/local/redis/bin/redis-server /usr/bin/redis-server cp /usr/local/redis/bin/redis-cli /usr/bin/redis-cli启动从节点:
bashredis-server /etc/redis/redis.conf验证从节点状态:
bashredis-cli -h <slave-ip> -p <slave-port> info replication等待从节点与主节点同步完成:
bash# 检查从节点同步状态 redis-cli -h <slave-ip> -p <slave-port> info replication | grep master_link_status
2. 升级主节点
将主节点切换为从节点(可选,适用于需要最小化 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>停止原主节点:
bashredis-cli -h <master-ip> -p <master-port> shutdown升级主节点二进制文件:
bashcp /usr/local/redis/bin/redis-server /usr/bin/redis-server cp /usr/local/redis/bin/redis-cli /usr/bin/redis-cli启动主节点:
bashredis-server /etc/redis/redis.conf恢复主从关系(如果执行了步骤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>验证主从关系:
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节点
停止Sentinel节点:
bashredis-cli -h <sentinel-ip> -p <sentinel-port> -a <password> shutdown升级Sentinel二进制文件:
bashcp /usr/local/redis/bin/redis-sentinel /usr/bin/redis-sentinel启动Sentinel节点:
bashredis-sentinel /etc/redis/sentinel.conf验证Sentinel节点状态:
bashredis-cli -h <sentinel-ip> -p <sentinel-port> -a <password> info sentinel重复上述步骤,升级所有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. 升级从节点
识别集群中的从节点:
bashredis-cli -c -h <cluster-node-ip> -p <cluster-node-port> cluster nodes | grep slave停止从节点:
bashredis-cli -h <slave-ip> -p <slave-port> shutdown升级从节点二进制文件:
bashcp /usr/local/redis/bin/redis-server /usr/bin/redis-server cp /usr/local/redis/bin/redis-cli /usr/bin/redis-cli启动从节点:
bashredis-server /etc/redis/redis.conf验证从节点状态:
bashredis-cli -c -h <slave-ip> -p <slave-port> cluster info redis-cli -c -h <slave-ip> -p <slave-port> cluster nodes | grep <slave-ip>重复上述步骤,升级所有从节点
2. 升级主节点
识别集群中的主节点:
bashredis-cli -c -h <cluster-node-ip> -p <cluster-node-port> cluster nodes | grep master将主节点设置为不可写(可选,减少迁移过程中的写入压力):
bashredis-cli -c -h <master-ip> -p <master-port> config set cluster-allow-reads-when-down yes将主节点的槽迁移到其他主节点(如果需要维护可用性):
bash# 使用redis-cli的cluster commands或第三方工具如redis-trib.rb进行槽迁移 # 注意:Redis 5.0+ 推荐使用redis-cli进行槽管理停止主节点:
bashredis-cli -h <master-ip> -p <master-port> shutdown升级主节点二进制文件:
bashcp /usr/local/redis/bin/redis-server /usr/bin/redis-server cp /usr/local/redis/bin/redis-cli /usr/bin/redis-cli启动主节点:
bashredis-server /etc/redis/redis.conf验证主节点状态:
bashredis-cli -c -h <master-ip> -p <master-port> cluster info redis-cli -c -h <master-ip> -p <master-port> cluster nodes | grep <master-ip>恢复主节点的写入权限(如果步骤2中设置了):
bashredis-cli -c -h <master-ip> -p <master-port> config set cluster-allow-reads-when-down no重复上述步骤,升级所有主节点
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监控:
bashredis-cli info stats redis-cli info memory redis-cli info cpu
4. 客户端连接管理
确保客户端支持平滑升级:
- 使用连接池管理客户端连接
- 配置合理的连接超时和重试机制
- 实现客户端的自动重连功能
监控客户端连接状态:
- 检查客户端连接数变化
- 监控连接错误率
- 观察应用响应时间变化
升级后的验证
1. 功能验证
测试基本命令:
bashredis-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. 单实例回滚
停止当前Redis实例:
bashredis-cli shutdown恢复旧版本二进制文件:
bash# 恢复备份的旧版本二进制文件 cp /backup/redis/bin/redis-server /usr/bin/redis-server cp /backup/redis/bin/redis-cli /usr/bin/redis-cli恢复旧版本配置文件:
bashcp /backup/redis/redis.conf /etc/redis/redis.conf启动Redis实例:
bashredis-server /etc/redis/redis.conf恢复数据(如果需要):
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: 可以采取以下措施:
- 检查Redis日志,定位服务不可用的原因
- 尝试重启Redis服务:
redis-server /etc/redis/redis.conf - 如果重启失败,回滚到旧版本
- 检查配置文件,确保配置项与Redis版本兼容
- 检查系统资源,确保有足够的内存和CPU资源
Q2: 升级后数据丢失怎么办?
A2: 可以采取以下措施:
- 停止当前Redis实例
- 恢复升级前的备份数据
- 回滚到旧版本
- 重新评估升级方案,检查数据兼容性问题
- 考虑使用更安全的升级方法,如滚动升级
Q3: 升级后客户端连接失败怎么办?
A3: 可以采取以下措施:
- 检查Redis服务是否正常运行:
redis-cli ping - 检查Redis监听地址和端口:
netstat -tuln | grep 6379 - 检查客户端配置,确保使用正确的Redis地址、端口和密码
- 检查客户端版本,确保与Redis版本兼容
- 检查防火墙规则,确保允许客户端连接
Q4: 如何处理升级过程中的槽迁移失败?
A4: 可以采取以下措施:
- 检查集群状态:
redis-cli cluster info - 检查槽分配情况:
redis-cli cluster slots - 尝试重新迁移槽:
redis-cli cluster setslot <slot> migrating <target-node-id> - 如果迁移失败,恢复槽分配:
redis-cli cluster setslot <slot> node <source-node-id> - 检查节点间的网络连接,确保所有节点可以正常通信
Q5: 升级后性能下降怎么办?
A5: 可以采取以下措施:
- 监控Redis性能指标:
redis-cli info stats、redis-cli info cpu - 检查配置项,确保使用了最佳配置
- 检查数据结构使用情况,优化不合理的数据结构
- 检查命令执行情况,优化慢查询
- 考虑增加Redis节点数量,分担负载
- 如果性能问题严重,考虑回滚到旧版本
Q6: 如何升级Redis Cluster中的某个特定节点?
A6: 可以按照以下步骤:
- 识别目标节点:
redis-cli cluster nodes | grep <node-ip> - 检查节点角色(主节点或从节点)
- 如果是从节点,直接停止、升级、启动
- 如果是主节点,先将其槽迁移到其他主节点,再停止、升级、启动,最后恢复槽分配
- 验证节点状态:
redis-cli cluster nodes | grep <node-ip>
Q7: 升级过程中需要停止应用吗?
A7: 不一定,取决于升级方案:
- 单实例升级:需要停止应用或忍受服务中断
- 主从复制滚动升级:不需要停止应用,从节点升级时不影响主节点提供服务
- Sentinel集群升级:不需要停止应用,Sentinel会自动进行故障转移
- 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