一、先回答核心疑问:make PREFIX=/usr/local/redis install 会不会覆盖 redis.conf/ 数据 / 日志?
1. 结论
完全不会 ,这条命令只安装二进制程序,不会触碰配置、数据、日志、目录等任何文件。
2. 底层原理(Redis 源码 Makefile 规则)
Redis 源码的 make install 逻辑非常纯粹:
- 仅把
src/下编译好的可执行程序 ,复制到你指定的PREFIX/bin/目录; - 安装的文件清单:
redis-server、redis-cli、redis-sentinel、redis-benchmark、redis-check-rdb、redis-check-aof - 不会主动复制 源码包里的
redis.conf示例文件; - 不会修改、删除、覆盖
PREFIX下的redis.conf、data/、logs/、pid、AOF/RDB 数据。
补充:源码根目录的
redis.conf只是官方示例配置 ,和你线上在用的配置是两个独立文件,make install两者互不干扰。
3. 风险点说明
唯一影响:如果新旧版本二进制文件名一致,make install 会覆盖 /usr/local/redis/bin/ 下的旧二进制 。 这也是为什么之前流程要求:先备份旧 bin 目录,再执行安装。
二、方案:先编译到临时目录,再手动拷贝二进制(生产推荐,更可控)
你提出的「先编译到其他目录,再拷贝」是生产常用的稳妥方案,优势:
- 编译和上线解耦,先验证编译产物没问题再替换;
- 不用一次性执行
make install覆盖,手动拷贝更灵活; - 多版本共存、灰度替换更方便。
完整实操步骤(沿用原有路径 /usr/local/redis)
1. 前置:依旧先全量备份(必做)
和之前生产流程一致,备份旧 bin、配置、数据:
# 备份旧二进制、配置、数据
tar -zcvf /data/redis_backup/redis_bin_$(date +%Y%m%d).tar.gz /usr/local/redis/bin
cp /usr/local/redis/redis.conf /data/redis_backup/
/usr/local/redis/bin/redis-cli SAVE
tar -zcvf /data/redis_backup/redis_data_$(date +%Y%m%d).tar.gz /usr/local/redis/data
2. 编译到「临时目录」(不直接装线上目录)
cd /usr/local/src
tar -zxvf redis-xxx.tar.gz
cd redis-xxx
# 清理旧编译缓存
make distclean
# 多核编译
make -j$(nproc)
# 重点:编译安装到【临时目录】/usr/local/redis_new(全新目录)
make PREFIX=/usr/local/redis_new install
3. 校验临时目录的新版本
# 查看新版本,确认编译成功
/usr/local/redis_new/bin/redis-server -v
4. 停止线上 Redis(停机升级场景)
systemctl stop redis
ps -ef | grep redis # 确认进程退出
5. 手动拷贝新版二进制到线上目录(核心替换动作)
# 拷贝所有新版二进制到原有 bin 目录,覆盖旧程序
cp /usr/local/redis_new/bin/* /usr/local/redis/bin/
6. 启动 + 校验
systemctl start redis
systemctl status redis
/usr/local/redis/bin/redis-server -v
redis-cli ping
7. 善后
临时目录可保留几天观察,无问题再删除:
rm -rf /usr/local/redis_new
rm -rf /usr/local/src/redis-xxx
对比两种安装方式:
- 直接
make PREFIX=/usr/local/redis install:一步到位,简单;- 先编译到临时目录再拷贝:可控性强、适合严谨生产环境、便于多版本测试。
三、场景 1:原有是【系统包安装 Redis】,如何改用源码编译升级
很多服务器最初用 yum install redis / apt install redis-server 安装(包管理器安装),这类 Redis 路径、配置、服务文件都和源码版不一样,下面给出完整迁移升级流程。
先区分:包安装 Redis 默认路径
CentOS/Rocky/ 麒麟(yum/dnf 安装)
- 二进制:
/usr/bin/redis-server、/usr/bin/redis-cli - 主配置:
/etc/redis/redis.conf - 数据目录:
/var/lib/redis - 日志:
/var/log/redis/ - 服务:
systemd托管,服务名redis
Ubuntu/Debian(apt 安装)
- 配置:
/etc/redis/redis.conf - 数据:
/var/lib/redis - 服务:
redis-server
完整升级流程(包装 → 源码编译新版)
步骤 1:全量备份(重中之重)
# 备份配置、数据、日志
cp /etc/redis/redis.conf /data/redis_backup/redis_conf_bak
tar -zcvf /data/redis_backup/redis_data_bak.tar.gz /var/lib/redis
tar -zcvf /data/redis_backup/redis_log_bak.tar.gz /var/log/redis
步骤 2:优雅停止服务
systemctl stop redis
步骤 3:卸载原有系统包(避免冲突)
# CentOS/Rocky
yum remove -y redis
# Ubuntu/Debian
apt remove -y redis-server
步骤 4:源码编译新版 Redis(安装到标准目录 /usr/local/redis)
# 安装编译依赖
yum install -y gcc gcc-c++ make tcl # CentOS
# apt install -y gcc make tcl # Ubuntu
cd /usr/local/src
tar -zxvf redis-xxx.tar.gz
cd redis-xxx
make distclean
make -j$(nproc)
# 安装到标准源码目录
make PREFIX=/usr/local/redis install
步骤 5:迁移旧配置 + 旧数据
# 1. 把原包安装的配置拷贝到源码目录
cp /data/redis_backup/redis_conf_bak /usr/local/redis/redis.conf
# 2. 创建源码版对应目录,并迁移数据、日志
mkdir -p /usr/local/redis/data /usr/local/redis/logs
cp -r /var/lib/redis/* /usr/local/redis/data/
cp -r /var/log/redis/* /usr/local/redis/logs/
步骤 6:修改配置文件路径(适配新目录)
编辑 redis.conf,修改以下关键项(包装路径 → 源码路径):
# 数据目录
dir /usr/local/redis/data
# 日志文件
logfile /usr/local/redis/logs/redis.log
# pid 文件
pidfile /usr/local/redis/redis.pid
步骤 7:适配 Systemd 服务文件(生产必须)
创建 /etc/systemd/system/redis.service:
[Unit]
Description=Redis Server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
ExecStop=/usr/local/redis/bin/redis-cli shutdown
Restart=always
[Install]
WantedBy=multi-user.target
重载服务、启动:
systemctl daemon-reload
systemctl start redis
systemctl enable redis
步骤 8:校验
redis-server -v
redis-cli ping
至此,系统包版本完全迁移为源码编译版本。
四、场景2:原有为【系统包安装 Redis】升级(重点:仅替换二进制)
核心:不卸载包、不迁移目录、不改配置、不改 systemd 服务 ,只替换 /usr/bin/redis-*。
步骤 1:全量备份(重中之重)
# 1. 备份系统原有二进制(回滚核心)
mkdir -p ${BAK_DIR}/redis_bin_old_$(date +%Y%m%d)
cp -a /usr/bin/redis* ${BAK_DIR}/redis_bin_old_$(date +%Y%m%d)/
# 2. 备份配置、数据、日志
cp /etc/redis/redis.conf ${BAK_DIR}/redis_conf_$(date +%Y%m%d).bak
tar -zcvf ${BAK_DIR}/redis_data_$(date +%Y%m%d).tar.gz /var/lib/redis
tar -zcvf ${BAK_DIR}/redis_log_$(date +%Y%m%d).tar.gz /var/log/redis
ls -lh ${BAK_DIR}
步骤 2:源码编译(仅编译,不执行全局安装)
cd ${SRC_DIR}
tar -zxvf redis-7.2.7.tar.gz
cd redis-7.2.7
make distclean
make -j$(nproc)
# 临时校验新版本
src/redis-server -v
步骤 3:停机替换二进制(标准生产流程)
# 1. 停止服务
systemctl stop redis
ps -ef | grep redis | grep -v grep
# 2. 核心操作:覆盖系统二进制
cp -f src/redis-server src/redis-cli src/redis-sentinel src/redis-benchmark src/redis-check* /usr/bin/
步骤 4:启动 & 兼容检查
# 重载服务(可选,未改服务文件可省略)
systemctl daemon-reload
# 启动
systemctl start redis
systemctl status redis
# 版本+功能校验
redis-server -v
redis-cli ping
# 大版本升级额外检查:废弃参数 slaveof
grep slaveof /etc/redis/redis.conf
# 如有结果,手动替换为 replicaof
五、场景 3:不换源码,直接用【包管理】升级 Redis 到最新版
系统自带 yum/apt 源的 Redis 版本普遍很旧(比如 CentOS7 默认只有 3.x/4.x),直接 yum update 升不到新版,必须先替换官方 / 第三方源,再升级。
1. CentOS/Rocky/ 银河麒麟(yum/dnf)
方式 A:使用 Remi 源(国内常用,版本新、稳定)
# 1. 安装 remi 源
yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
# CentOS8/9 对应替换 remi-release-8.rpm / remi-release-9.rpm
# 2. 启用高版本 Redis 仓库
yum module enable redis:latest -y
# 3. 直接升级
yum update -y redis
# 查看版本
redis-server -v
方式 B:Redis 官方 YUM 源
参考 Redis 官方文档配置源后再 yum update redis 即可。
2. Ubuntu/Debian 系列(apt)
配置 Redis 官方 APT 源,再升级:
# 1. 安装依赖
apt install -y lsb-release curl gpg
# 2. 导入官方密钥
curl -fsSL https://packages.redis.io/gpg | gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
# 3. 添加官方源
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/redis.list
# 4. 更新缓存并升级
apt update && apt upgrade -y redis-server
# 查看版本
redis-server -v
补充:版本锁定(防止意外升级)
如果当前版本稳定,不想自动更新:
# CentOS
yum versionlock add redis
# Ubuntu
apt-mark hold redis-server
六、Redis 热升级(不停机、不中断业务升级,高可用生产必备)
前面都是停机升级 ,适合低峰期;如果是核心业务不能停机,使用 Redis 热升级。
Redis 热升级分 3 种场景,核心原理:
Redis 是单进程模型,支持二进制原地替换 + 进程软重启,连接、数据、持久化不会中断。
前置要求
- 操作在业务低峰;
- 已提前编译好新版二进制(临时目录);
- 必须先备份旧 bin 文件;
- 单机 / 主从 / 集群 操作方式不同。
场景 1:单机 Redis 原地热升级(不停机)
步骤 1:备份旧二进制 + 准备新版(同前文)
# 备份旧 bin
tar -zcvf /data/redis_backup/redis_bin_old.tar.gz /usr/local/redis/bin
# 新版已编译在 /usr/local/redis_new/bin
步骤 2:直接替换二进制(Redis 运行中也能覆盖)
cp /usr/local/redis_new/bin/* /usr/local/redis/bin/
步骤 3:软重启 Redis(不关闭端口、不踢客户端、不丢数据)
两种软重启方式,任选其一:
方式 1:使用 redis-cli shutdown save && 启动(温和,推荐)
# 优雅关闭(数据落盘),前台临时拉起(连接不中断)
/usr/local/redis/bin/redis-cli shutdown
# 立即启动
systemctl start redis
方式 2:信号量热重启(真正秒级无感知,进阶用法)
利用 SIGHUP 重载配置 + 执行 exec 替换进程,原有 TCP 连接保持:
# 1. 先让 Redis 重新加载配置(可选)
kill -SIGHUP $(pidof redis-server)
# 2. 执行进程替换(内核复用端口,客户端无断开)
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf &
步骤 4:校验
redis-server -v
redis-cli ping
风险提示: 大版本跨代升级(如 5.x → 7.x)不建议纯热替换,优先测试环境验证参数兼容性。
场景 2:主从 / 哨兵架构 滚动热升级(零业务中断)
架构:1 主 N 从 + 哨兵 标准流程(无损):
- 逐个升级从节点:从节点依次执行「替换二进制 → 软重启」,从库不影响写业务;
- 手动主从切换:让其中一个已升级的从库变成新主库;
- 升级原主库:原主库降级为从库,再执行热升级;
- 哨兵节点逐个重启升级。
全程业务读写无中断。
场景 3:Redis Cluster 集群 滚动热升级
集群规则:逐节点升级,每次只操作一个节点
- 挑选一个槽位迁移完毕的节点;
- 迁移该节点槽位到其他节点(避免槽位下线);
- 替换二进制 + 软重启;
- 等待节点重新加入集群、槽位回迁;
- 循环直到所有节点升级完成。
七、汇总总结 & 生产避坑
-
关于
make PREFIX仅替换bin/下二进制,配置、数据、日志绝对安全;想更可控就先编译到临时目录再手动拷贝。 -
包安装转源码 核心是:卸载包 → 部署源码 → 迁移配置 / 数据 → 重写 systemd 服务。
-
包管理升级新版 系统默认源版本老旧,必须先换 Redis 官方源 / Remi 源再执行 update。
-
升级选型建议
- 非核心业务 / 低峰窗口:用停机升级(最简单、风险最低);
- 核心业务、7×24 运行:用热升级 / 滚动升级;
- 大版本跳跃升级(如 4→6、6→7):务必先在测试环境验证配置兼容。
-
通用铁律 任何升级前:备份二进制 + 配置 + 数据,保留备份至少 7 天,保证可回滚。
八、方案选型建议
| 业务场景 | 推荐方案 |
|---|---|
| 原有源码版、追求简单 | 直接 make PREFIX=/usr/local/redis install 升级 |
| 原有源码版、严谨生产环境 | 先编译临时目录,再手动拷贝替换 |
| 原有包安装版、不想改动配置 / 服务 | 仅替换 /usr/bin 二进制(本文场景二) |
| 原有包安装版、想长期使用包管理 | 替换官方源,使用 yum/apt 升级 |
| 核心业务、不允许停机 | 热升级 / 集群滚动升级 |