原流程翻车?Redis 生产环境全场景安全升级操作手册(源码编译 + 包管理 + 热升级 + 回滚)

一、先回答核心疑问:make PREFIX=/usr/local/redis install 会不会覆盖 redis.conf/ 数据 / 日志?

1. 结论

完全不会 ,这条命令只安装二进制程序,不会触碰配置、数据、日志、目录等任何文件。

2. 底层原理(Redis 源码 Makefile 规则)

Redis 源码的 make install 逻辑非常纯粹:

  • 仅把 src/ 下编译好的可执行程序 ,复制到你指定的 PREFIX/bin/ 目录;
  • 安装的文件清单: redis-serverredis-cliredis-sentinelredis-benchmarkredis-check-rdbredis-check-aof
  • 不会主动复制 源码包里的 redis.conf 示例文件;
  • 不会修改、删除、覆盖 PREFIX 下的 redis.confdata/logs/pid、AOF/RDB 数据。

补充:源码根目录的 redis.conf 只是官方示例配置 ,和你线上在用的配置是两个独立文件,make install 两者互不干扰。

3. 风险点说明

唯一影响:如果新旧版本二进制文件名一致,make install覆盖 /usr/local/redis/bin/ 下的旧二进制 。 这也是为什么之前流程要求:先备份旧 bin 目录,再执行安装


二、方案:先编译到临时目录,再手动拷贝二进制(生产推荐,更可控)

你提出的「先编译到其他目录,再拷贝」是生产常用的稳妥方案,优势:

  1. 编译和上线解耦,先验证编译产物没问题再替换;
  2. 不用一次性执行 make install 覆盖,手动拷贝更灵活;
  3. 多版本共存、灰度替换更方便。

完整实操步骤(沿用原有路径 /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 是单进程模型,支持二进制原地替换 + 进程软重启,连接、数据、持久化不会中断。

前置要求

  1. 操作在业务低峰
  2. 已提前编译好新版二进制(临时目录);
  3. 必须先备份旧 bin 文件;
  4. 单机 / 主从 / 集群 操作方式不同。

场景 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 从 + 哨兵 标准流程(无损):

  1. 逐个升级从节点:从节点依次执行「替换二进制 → 软重启」,从库不影响写业务;
  2. 手动主从切换:让其中一个已升级的从库变成新主库;
  3. 升级原主库:原主库降级为从库,再执行热升级;
  4. 哨兵节点逐个重启升级。

全程业务读写无中断。


场景 3:Redis Cluster 集群 滚动热升级

集群规则:逐节点升级,每次只操作一个节点

  1. 挑选一个槽位迁移完毕的节点;
  2. 迁移该节点槽位到其他节点(避免槽位下线);
  3. 替换二进制 + 软重启;
  4. 等待节点重新加入集群、槽位回迁;
  5. 循环直到所有节点升级完成。

七、汇总总结 & 生产避坑

  1. 关于 make PREFIX 仅替换 bin/ 下二进制,配置、数据、日志绝对安全;想更可控就先编译到临时目录再手动拷贝。

  2. 包安装转源码 核心是:卸载包 → 部署源码 → 迁移配置 / 数据 → 重写 systemd 服务。

  3. 包管理升级新版 系统默认源版本老旧,必须先换 Redis 官方源 / Remi 源再执行 update。

  4. 升级选型建议

    • 非核心业务 / 低峰窗口:用停机升级(最简单、风险最低);
    • 核心业务、7×24 运行:用热升级 / 滚动升级
    • 大版本跳跃升级(如 4→6、6→7):务必先在测试环境验证配置兼容。
  5. 通用铁律 任何升级前:备份二进制 + 配置 + 数据,保留备份至少 7 天,保证可回滚。

八、方案选型建议

业务场景 推荐方案
原有源码版、追求简单 直接 make PREFIX=/usr/local/redis install 升级
原有源码版、严谨生产环境 先编译临时目录,再手动拷贝替换
原有包安装版、不想改动配置 / 服务 仅替换 /usr/bin 二进制(本文场景二)
原有包安装版、想长期使用包管理 替换官方源,使用 yum/apt 升级
核心业务、不允许停机 热升级 / 集群滚动升级
相关推荐
长风2301 小时前
Day10:直面深水区——总结系统痛点与底层架构重塑
人工智能·安全
一拳一个娘娘腔2 小时前
【SRC漏洞挖掘系列】第13期:云安全与中间件 —— 站在云端的“上帝视角”
安全·中间件
better_liang2 小时前
每日Java面试场景题知识点之-数据库与缓存的一致性
java·数据库·redis·面试·分布式系统·缓存一致性·cache aside
信息安全失业大专人员2 小时前
零信任时代,802.1X 准入架构是否已成“明日黄花”?
安全·信息安全·安全架构·企业信息安全
我叫张小白。2 小时前
基于Redis与FastAPI的分布式共享会话体系
数据库·redis·分布式·缓存·中间件·fastapi·依赖注入
代码旅人ing2 小时前
Redis+Spring+MyBatis + 微服务 + 消息队列核心知识点(面试高频题目合集)
redis·spring·mybatis·java-rabbitmq
2601_959477912 小时前
Vatee平台平台运行稳定吗?
大数据·人工智能·安全
孟俊宇-MJY2 小时前
Pancake 智能合约开发与安全审计实战指南
安全·智能合约
小杍随笔2 小时前
【Rust 1.96.0 深度解析:让 Range 可 Copy、让断言更聪明、让 Wasm 更安全】
安全·rust·wasm