1. Redis升级前的准备工作
在Linux环境下通过源码部署方式升级Redis,需要做好充分的准备工作。我经历过多次生产环境的Redis升级,深知准备工作的重要性。以下是必须完成的步骤:
1.1 确认当前Redis环境
首先通过redis-cli连接当前运行的Redis实例,执行INFO命令获取详细版本信息:
bash复制redis-cli -h 127.0.0.1 -p 6379 INFO | grep redis_version
输出示例:
code复制redis_version:5.0.7
同时记录以下关键信息:
- 配置文件路径(通常为/etc/redis/redis.conf)
- 数据目录位置(dir配置项)
- 持久化方式(RDB/AOF)
- 绑定的IP和端口
- 认证密码(如果有)
1.2 下载新版Redis源码
访问Redis官网(https://redis.io/download)获取稳定版源码包。我建议选择次新版而非最新版,因为最新版可能存在未发现的稳定性问题。例如:
bash复制wget https://download.redis.io/releases/redis-6.2.6.tar.gz
下载后务必验证文件完整性:
bash复制sha1sum redis-6.2.6.tar.gz
# 对比官网提供的校验值
1.3 备份关键数据
这是升级过程中最关键的步骤,我见过太多因为备份不完整导致的数据丢失案例。需要备份的内容包括:
- Redis数据文件:
bash复制# 如果是RDB持久化
cp /var/lib/redis/dump.rdb /backup/dump.rdb.bak
# 如果是AOF持久化
cp /var/lib/redis/appendonly.aof /backup/appendonly.aof.bak
- Redis配置文件:
bash复制cp /etc/redis/redis.conf /backup/redis.conf.bak
- 如果使用了哨兵模式,还需要备份哨兵配置文件:
bash复制cp /etc/redis/sentinel.conf /backup/sentinel.conf.bak
重要提示:备份完成后,建议在测试环境验证备份文件的可恢复性。我曾经遇到过备份文件损坏导致无法恢复的情况。
1.4 检查系统依赖
Redis编译需要GCC编译器和其他依赖项。执行以下命令确保系统满足要求:
bash复制# 检查GCC版本(需要4.9以上)
gcc --version
# 安装必要依赖
sudo apt-get update
sudo apt-get install build-essential tcl
如果系统GCC版本过低(常见于CentOS 7等老系统),需要先升级GCC:
bash复制sudo yum install centos-release-scl
sudo yum install devtoolset-9
scl enable devtoolset-9 bash
2. 源码编译与安装
2.1 解压与编译源码
解压下载的源码包并进入目录:
bash复制tar xzf redis-6.2.6.tar.gz
cd redis-6.2.6
编译前建议先清理旧编译文件(如果是重新编译):
bash复制make distclean
开始编译:
bash复制make -j$(nproc)
-j$(nproc)参数表示使用所有CPU核心并行编译,可以显著加快编译速度。
编译完成后,建议运行测试套件验证编译结果:
bash复制make test
测试可能需要10-30分钟,这是确保Redis稳定性的重要步骤。我曾经跳过测试直接安装,结果在生产环境遇到了奇怪的崩溃问题。
2.2 安装Redis二进制文件
编译成功后,执行安装命令:
bash复制sudo make install
默认会将redis-server、redis-cli等可执行文件安装到/usr/local/bin目录。如果想指定安装目录,可以使用:
bash复制sudo make PREFIX=/opt/redis install
2.3 创建Redis系统用户和目录
为了安全考虑,Redis不应以root用户运行:
bash复制sudo adduser --system --group --no-create-home redis
sudo mkdir /var/lib/redis
sudo chown redis:redis /var/lib/redis
sudo chmod 770 /var/lib/redis
3. 配置与数据迁移
3.1 配置文件调整
将旧配置文件复制到新位置:
bash复制sudo cp /backup/redis.conf.bak /etc/redis/redis.conf
需要特别注意以下配置项的变更:
- 新版Redis可能废弃或新增了一些配置参数,建议对照新版redis.conf示例文件进行检查:
bash复制vim /etc/redis/redis.conf
- 常见需要手动调整的配置项包括:
protected-mode:根据网络安全需求设置supervised:建议设置为systemd(如果使用systemd管理)io-threads:新版支持多IO线程,可以提升性能aclfile:新版增强了ACL功能
3.2 数据文件迁移
停止旧版Redis服务:
bash复制sudo systemctl stop redis
迁移数据文件:
bash复制sudo cp /backup/dump.rdb /var/lib/redis/
# 或
sudo cp /backup/appendonly.aof /var/lib/redis/
设置正确的权限:
bash复制sudo chown redis:redis /var/lib/redis/*
3.3 创建Systemd服务文件
对于新版Redis,建议使用systemd管理服务。创建服务文件:
bash复制sudo vim /etc/systemd/system/redis.service
内容示例:
code复制[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
[Install]
WantedBy=multi-user.target
重新加载systemd配置:
bash复制sudo systemctl daemon-reload
4. 启动与验证
4.1 启动新版本Redis
启动Redis服务并检查状态:
bash复制sudo systemctl start redis
sudo systemctl status redis
如果启动失败,查看日志定位问题:
bash复制sudo journalctl -u redis -f
4.2 验证数据完整性
连接Redis并验证数据:
bash复制redis-cli
127.0.0.1:6379> AUTH yourpassword
127.0.0.1:6379> INFO keyspace
检查关键指标:
- 键数量是否与预期一致
- 内存使用量是否合理
- 持久化文件是否正常生成
4.3 性能测试(可选)
对于生产环境,建议进行简单的性能测试:
bash复制redis-benchmark -h 127.0.0.1 -p 6379 -a yourpassword -t set,get -n 100000 -c 50
比较升级前后的性能指标,确保没有明显的性能下降。
5. 升级后的维护与监控
5.1 监控关键指标
升级后需要密切监控以下指标:
- 内存使用率
- 客户端连接数
- 持久化延迟
- 命令执行延迟
可以使用Redis自带的INFO命令或集成到现有监控系统(如Prometheus)中。
5.2 常见问题处理
- 兼容性问题:
新版Redis可能废弃了某些命令或修改了行为。如果应用报错,可以:
- 查阅Redis版本变更日志
- 使用
redis-cli --version确认客户端版本 - 考虑使用
redis-cli --help查看新命令
- 内存增长:
新版Redis可能使用不同的内存分配策略。如果发现内存使用异常:
bash复制redis-cli info memory
检查used_memory和used_memory_rss的比值,正常情况下应该在1:1.2左右。
- 性能下降:
如果发现性能下降,可以尝试:
- 调整
io-threads配置 - 检查是否启用了新特性(如ACL)导致开销增加
- 使用
slowlog get查看慢查询
5.3 回滚方案
如果升级后发现问题,需要准备回滚方案:
- 停止新版Redis:
bash复制sudo systemctl stop redis
-
重新安装旧版Redis(方法同本文档,使用旧版源码)
-
恢复备份数据:
bash复制sudo cp /backup/dump.rdb /var/lib/redis/
# 或
sudo cp /backup/appendonly.aof /var/lib/redis/
- 启动旧版Redis并验证:
bash复制sudo systemctl start redis
redis-cli INFO | grep redis_version
6. 高级配置与优化
6.1 启用新特性
新版Redis通常引入新功能,例如Redis 6.x的ACL系统和多线程IO:
- ACL配置:
bash复制# 创建用户
acl setuser alice on >password ~cached:* +get +set
- 多线程IO:
在redis.conf中设置:
code复制io-threads 4
io-threads-do-reads yes
6.2 内核参数优化
对于生产环境,建议调整以下内核参数:
bash复制# 增加TCP连接队列大小
echo 'net.core.somaxconn = 65535' | sudo tee -a /etc/sysctl.conf
# 禁用透明大页(THP)
echo 'never' | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
# 应用修改
sudo sysctl -p
6.3 持久化策略调整
根据新版特性优化持久化配置:
code复制# RDB配置
save 900 1
save 300 10
save 60 10000
rdbcompression yes
rdbchecksum yes
# AOF配置
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
7. 集群环境升级策略
如果Redis运行在集群模式,升级需要特殊处理:
7.1 滚动升级步骤
- 选择一个从节点进行升级
- 升级完成后,将其提升为主节点
- 逐步升级其他节点
- 最后升级原主节点
7.2 版本兼容性检查
使用CLUSTER NODES命令检查集群状态:
bash复制redis-cli --cluster check 127.0.0.1:6379
确保所有节点版本差异不超过一个大版本(如5.x到6.x可以,4.x到6.x不行)。
7.3 集群配置备份
备份集群配置文件:
bash复制redis-cli CLUSTER NODES > cluster_nodes_backup.txt
redis-cli CLUSTER INFO > cluster_info_backup.txt
8. 安全加固建议
升级是进行安全加固的好时机:
8.1 网络层安全
- 绑定特定IP:
code复制bind 127.0.0.1 192.168.1.100
- 启用TLS(Redis 6+):
code复制tls-port 6379
tls-cert-file /etc/redis/redis.crt
tls-key-file /etc/redis/redis.key
8.2 认证与ACL
- 设置强密码:
code复制requirepass YourStrongPasswordHere
- 限制危险命令:
code复制rename-command FLUSHDB ""
rename-command CONFIG ""
# 或者使用ACL
acl setuser default off
acl setuser admin on >AdminPassword ~* +@all
8.3 文件系统权限
确保关键文件和目录权限正确:
bash复制sudo chown -R redis:redis /var/lib/redis
sudo chmod 750 /var/lib/redis
sudo chmod 640 /etc/redis/redis.conf
