1. 场景判断:什么情况下必须走离线这条路
我接手过不少生产环境的服务器,最头疼的往往不是Redis本身有多复杂,而是那台机器根本碰不到外网。等保要求、内网隔离、专网环境、客户现场的物理隔离网段,都有可能让你手里的yum源和apt源形同虚设。这时候装Redis,要么靠内网自建的软件仓库,要么就是纯手工离线安装。我这次要说的就是后者,目标版本是Redis 7.4.0,系统环境是CentOS 7.9和Rocky Linux 8.6都实测过。
如果你正面临以下情况之一,那这篇文章对你就有用了:
- 服务器在隔离网段,连不上公网yum/apt源
- 公司安全策略禁止直接走外网下载软件包
- 现场交付时需要一套可复现的安装流程,不能依赖网络状态
- 你只是想学会在无网环境下把Redis装明白,不依赖一键脚本
Redis 7.4.0是2024年下半年发布的稳定版本,相比7.0和7.2,它在性能、内存效率和集群稳定性上都有提升,尤其是CLUSTER命令的优化和新的内存碎片整理机制,对于线上高负载场景值得关注。但版本归版本,在离线环境里,安装方式和版本号之间的关系并不大,核心是把依赖、编译环境、安装介质这三件事处理好。
先给结论:离线安装Redis 7.4.0,最靠谱的路线是“源码编译”,不是RPM也不是Docker离线镜像。原因后面我会展开讲。
2. 三种离线方案选型:为什么我最终选了源码编译
很多人一听离线安装,第一反应是:“我提前把RPM包下载好,拷到服务器上rpm -ivh不就行了?”这个思路对很多软件成立,但到了Redis这里,情况不太一样。
2.1 RPM离线安装的坑
Redis官方其实不提供RPM包,各Linux发行版自己维护的Redis版本通常滞后,而且你很难保证手头的RPM和当前系统的glibc、openssl版本完全兼容。更重要的是,RPM离线安装需要手动解决一系列依赖,比如jemalloc、openssl-devel、systemd-devel等,这些包一环扣一环,缺一个就装不上。等你费劲凑齐了依赖,大概率发现装上的Redis版本是6.x甚至5.x,根本不是你想要的7.4.0。
我见过不少人在内网环境用RPM装Redis,装完连redis-cli都没有,还得另外找客户端工具,非常尴尬。
2.2 Docker离线镜像的适用边界
Docker离线镜像(docker save+docker load)在容器化环境里确实方便,但有两个前提:一是服务器上已经装了Docker,二是你通过网络或内网镜像仓库能拿到Redis镜像。如果这两点都满足,那直接走容器方案是没问题的。可现实是,很多离线环境的服务器连Docker都没装,而离线装Docker本身又是一大堆依赖,这就陷入套娃了。
2.3 源码编译为什么最稳
源码编译的优势在于:
- Redis的编译过程极其简单,本质就三步:
./configure --prefix=... && make && make install - 对系统依赖要求极低,核心只需要
gcc和make - 可以选择静态链接方式,把运行时依赖降到最低
- 版本完全可控,源码包一拷就是完整副本
- 编译出来的二进制可以直接拷到其他同架构服务器上运行
所以,对于Linux服务器离线安装Redis 7.4.0,源码编译是最省心、最可控的路线。下文将围绕这条路线展开,从介质准备到最终验证,完整走一遍。
3. 动手之前:介质准备与编译环境检查
这一节讲的是“出发前的行囊检查”。如果你在能联网的机器上下载好所有东西再进内网,能省掉一大半麻烦。别嫌这些准备步骤琐碎,我踩过的坑里有八成都是因为少带了一个文件。
3.1 需要准备哪些离线介质
第一样东西:Redis 7.4.0源码包
去Redis官网下载redis-7.4.0.tar.gz,注意下载.tar.gz格式的源码包,文件大小约3MB左右,非常轻量。找一台能联网的机器执行:
wget https://download.redis.io/releases/redis-7.4.0.tar.gz拿到后先做一件事:用sha256sum计算校验值,记录在另一个文本文件里,方便到内网比对一致性。
sha256sum redis-7.4.0.tar.gz第二样东西:RPM依赖包
虽然Redis编译的核心依赖少,但你要把编译工具链补齐。以CentOS 7.9为例,需要准备这些RPM包:
| 依赖包 | 说明 | 是否必需 |
|---|---|---|
| gcc | C语言编译器 | 必需 |
| gcc-c++ | C++编译器(Redis 7.x需要) | 必需 |
| make | 构建工具 | 必需 |
| pkgconfig | 配置脚本需要 | 可选 |
| openssl-devel | 启用TLS支持时需要 | 按需 |
| systemd-devel | 生成systemd集成时需要 | 按需 |
怎么在联网机器上把这些RPM包连同依赖一并下载?用yumdownloader加--resolve参数,它会自动把依赖包也拉下来。比如:
# 先安装yum-utils工具 yum install -y yum-utils # 创建目录并下载gcc及全部依赖 mkdir -p /opt/offline-pkgs cd /opt/offline-pkgs yumdownloader --resolve --destdir=/opt/offline-pkgs gcc gcc-c++ make如果你的联网机器和离线服务器系统版本不同(比如联网机是CentOS 8,服务器是CentOS 7),这样做会出问题,因为RPM包依赖的glibc版本不一致。最稳的办法是找和服务器同版本的机器来拉RPM。如果没有同版本的,还有一条路:编译机上一旦生成了Redis二进制,其他同架构同系统版本的服务器可以直接拷贝使用,不一定要重复编译。这个技巧后面详细说。
第三样东西:一个临时解压用的目录
服务器上建议规划一个/opt/redis-build目录,专门存放源码包和解压后的文件,装完了可以整体删掉,不污染系统。
3.2 在服务器上检查编译环境
把源码包和RPM包传到服务器上之后,先别急着解压编译。先检查目标服务器上有没有现成的编译工具:
which gcc which make gcc --version如果gcc存在且版本不低于5.0,Redis 7.4.0的编译基本没问题。如果不存在,就进入离线RPM安装环节:
cd /opt/offline-pkgs rpm -Uvh *.rpm --nodeps提示:
--nodeps参数的意思是忽略依赖检查强制安装,平时我并不推荐滥用。但在离线环境下,只要你能确认依赖包都已经被yumdownloader --resolve拉齐全了,用--nodeps反而能避免个别RPM包依赖顺序的报错。装完之后记得执行gcc --version验证一下。
4. 正式安装:源码包处理全流程
好,环境检查完毕,编译工具就位,现在开始正式安装。整个流程我拆成六个步骤,每一步都有为什么要这么做的解释。
4.1 校验并解压源码包
先校验文件完整性,防止传输过程中出现损坏:
sha256sum redis-7.4.0.tar.gz比对一下你记录的原始校验值。如果一致,解压:
tar -xzf redis-7.4.0.tar.gz -C /opt/redis-build cd /opt/redis-build/redis-7.4.0解压之后建议先看一眼目录结构:
ls -l你会看到src(源码目录)、tests(测试目录)、utils(工具脚本)、redis.conf(默认配置文件模板)等。重点记住redis.conf这个文件,后面配置增量全靠它。
4.2 编译前的配置选项
Redis 7.4.0的编译配置和很多C项目不太一样,它不是必须执行./configure的。你可以直接make,但如果你想指定安装路径,有两个做法。
做法一:通过PREFIX指定安装目录
Redis的Makefile支持PREFIX变量,比如我想把Redis装到/usr/local/redis-7.4.0:
make PREFIX=/usr/local/redis-7.4.0做法二:编译后再用make install指定目录
make make install PREFIX=/usr/local/redis-7.4.0我推荐做法二,因为先编译再安装,可以把编译产物保留在源码目录里,万一装失败了改个路径重新install就行,不用重新编译一遍。
4.3 处理内存分配器:MALLOC参数的讲究
这一步是新手最容易踩坑的地方。Redis默认使用jemalloc作为内存分配器,因为它在处理高并发、碎片化内存方面比glibc自带的malloc更好。但jemalloc在编译时需要从源码里构建,如果你所在环境缺少相关工具链,编译可能报错。报错信息类似:
zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory遇到这种情况,很简单,手动指定使用libc的malloc:
make MALLOC=libc需要说明一下,MALLOC=libc和生产环境常用的jemalloc在性能上有些差距,主要是内存碎片率可能略高。如果你的服务器内存紧张、业务对内存碎片敏感,建议还是把jemalloc编译上。我实测下来,CentOS 7.9上只要gcc环境完整,直接用默认的jemalloc没问题,不必特意规避。
4.4 执行编译与安装
在源码目录里执行:
make -j4-j4表示用4个并行任务编译,如果你的服务器CPU核数多,可以调大,比如make -j8。编译过程一般两三分钟就完成了,看到类似Hint: To run 'make test' use 'make test'的信息说明编译成功。
接着安装到指定目录:
make install PREFIX=/usr/local/redis-7.4.0装完之后去检查一下产物:
ls -l /usr/local/redis-7.4.0/bin/正常情况下能看到6个文件:
redis-server:服务端主程序redis-cli:命令行客户端redis-check-aof:AOF持久化文件检查工具redis-check-rdb:RDB持久化文件检查工具redis-sentinel:哨兵程序,其实是指向redis-server的软链接redis-benchmark:性能测试工具
看到这6个文件,安装这一步就彻底完成了。
4.5 创建配置文件和运行目录
装好二进制之后,配置文件需要单独准备。我把配置文件和运行目录分开规划:
# 创建配置目录 mkdir -p /etc/redis # 创建数据目录 mkdir -p /var/lib/redis # 创建日志目录 mkdir -p /var/log/redis拷贝一份默认配置作为起点:
cp /opt/redis-build/redis-7.4.0/redis.conf /etc/redis/redis.conf这个redis.conf就是模板,后续所有参数修改都基于它。注意不要直接改源码目录里的那个,万一改坏了没法恢复。
4.6 配置systemd服务实现开机自启
线上环境很少有人用redis-server /etc/redis/redis.conf这种前台方式跑服务,大多数是用systemd管理。写一个service文件:
vim /etc/systemd/system/redis.service内容如下:
[Unit] Description=Redis 7.4.0 Server After=network.target [Service] Type=forking ExecStart=/usr/local/redis-7.4.0/bin/redis-server /etc/redis/redis.conf ExecStop=/usr/local/redis-7.4.0/bin/redis-cli -p 6379 shutdown Restart=always User=redis Group=redis PIDFile=/var/run/redis_6379.pid LimitNOFILE=65535 [Install] WantedBy=multi-user.target几个关键点:
Type=forking:因为Redis配置里设置了daemonize yes,主进程会fork出子进程然后退出,所以要用forking类型User=redis:生产环境不能以root运行Redis,这是安全底线LimitNOFILE=65535:提高文件描述符上限,Redis高并发时默认值不够用
创建redis用户:
useradd -M -s /sbin/nologin redis chown -R redis:redis /var/lib/redis chown -R redis:redis /var/log/redis chown -R redis:redis /etc/redis注意配置文件和数据目录的所有权必须改成redis用户,不然启动时会报权限错误。
5. 配置Redis 7.4.0:生产环境必调的13个参数
二进制装好了、服务托管也做好了,接下来是打开/etc/redis/redis.conf逐项调整。我不打算把所有参数都念一遍,只说那些你如果不调就上线会吃亏的关键项。
5.1 守护进程与网络绑定
daemonize yes这一项必须改成yes,否则Redis会以前台模式运行,systemd就不好管了。注意Redis 7.x有个变化,daemonize默认是yes,但我建议还是显式写出来,方便后来人看配置的时候一眼了解意图。
bind 0.0.0.0默认配置里bind是127.0.0.1 -::1,这意味着只能本机访问。如果其他服务器要连这台Redis,必须改成实际监听的IP或0.0.0.0。但0.0.0.0也意味着所有网卡都监听,如果服务器有多网卡且有不信任网络,建议精确指定内网IP。
protected-mode yes这个需要和bind配合理解。protected-mode yes时,如果Redis没有设置密码且绑定了0.0.0.0,它会拒绝非本机连接。建议保留yes,同时配上密码,双保险。
5.2 端口与密码
port 6379默认端口6379。如果要换,注意客户端连接参数和防火墙策略同步改。
requirepass your_strong_passwordRedis 7.x的认证方式已经默认走ACL了,但requirepass仍然有效。它相当于设置了一个默认用户default的密码。生产环境至少要设一个高强度的,不然扫描器扫到6379端口分分钟被爆破。
5.3 持久化策略
save 900 1 save 300 10 save 60 10000这三行是RDB快照的触发条件,意思是:900秒内至少有1次写操作就触发快照,300秒内10次写操作触发,60秒内10000次写操作触发。吐槽一句,默认策略在写入量大的情况下会频繁触发RDB,影响性能。如果对数据丢失容忍度较低,建议调大阈值或者干脆改用AOF为主。
appendonly yes appendfilename "appendonly.aof" appendfsync everysecappendonly yes开启AOF持久化。everysec表示每秒刷盘一次,兼顾性能和数据安全,这是生产环境最常用的平衡点。
5.4 内存管理与淘汰策略
maxmemory 2gb服务器物理内存有多大、Redis能用到多少,一定要心里有数。如果这里设置得太小,Redis会频繁淘汰key,业务上表现为缓存命中率骤降;设置得太大,可能直接OOM把整台服务器拖垮。建议按物理内存的60%~70%预留。
maxmemory-policy allkeys-lru这是内存满了之后的淘汰策略。allkeys-lru表示从所有key里按最近最少使用算法淘汰。如果Redis只做缓存,这个策略够用。如果有某些key绝不能淘汰,就要用allkeys-lfu或者给key打上no-eviction标记,也可以用volatile-lru只淘汰设置了过期时间的key。
5.5 日志与系统调优
logfile /var/log/redis/redis.log loglevel notice日志路径一定要指到Redis用户可写的目录,别用默认的stdout,否则systemd下看日志会很不方便。
maxclients 10000默认连接数上限是10000,如果不够可以根据场景调整,前提是系统文件描述符上限也要同步调。
5.6 TLS和ACL这些“锦上添花”项
Redis 7.x原生支持TLS,但配置起来涉及证书生成和分发,离线环境尤其费劲。如果业务没有硬性要求,建议先不开TLS,通过内网隔离加密码认证来保证安全。ACL功能我建议至少看一眼,因为它能精确控制不同应用的权限边界,比如给某个业务只开放读写指定前缀的key。这些在redis.conf里的示例都有,真要细说又是一大篇文章。
搞完上面这些,保存退出。用之前写的systemd服务启动试试:
systemctl daemon-reload systemctl start redis systemctl enable redis systemctl status redis看到active (running)就成功了。然后验证一下功能:
/usr/local/redis-7.4.0/bin/redis-cli -a 'your_strong_password' ping返回PONG就说明服务正常响应。再来几个常用操作看看:
/usr/local/redis-7.4.0/bin/redis-cli -a 'your_strong_password' set mykey hello /usr/local/redis-7.4.0/bin/redis-cli -a 'your_strong_password' get mykey如果都能正常返回,那恭喜你,离线安装Redis 7.4.0这关已经过了大半。
6. 已踩过的坑与排查清单
下面这些坑,每一个都是我在反复实操中“亲手踩过”的,整理出来帮你提前避开。
6.1 编译报错:找不到jemalloc或gcc版本过旧
现象
zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory原因
Redis 7.4.0默认使用内置的jemalloc,但构建jemalloc需要较完整的工具链。另外gcc版本过低也可能在编译中段报奇怪的语法错误。
对策
- 优先检查gcc版本,低于5.0的建议升级
- 如果执行环境确实有限,用
make MALLOC=libc绕过jemalloc编译 - 升级gcc如果遇到离线环境,可以去内网镜像站下载配套RPM包
6.2 systemd启动失败:PID文件或权限错误
现象
systemctl start redis报错提示Failed to write PID file或Can't open the log file。
原因
我遇到这类问题,90%的情况是数据目录、日志目录和配置文件的所有权没有改成redis用户。
对策
chown -R redis:redis /var/lib/redis /var/log/redis /etc/redis改完所有权再重启一下服务就好。
6.3 客户端无法连接:保护模式挡掉了
现象
同一内网的其他机器用redis-cli -h 服务器IP ping,提示DENIED Redis is running in protected mode。
原因
protected-mode yes+ 未密码/绑定0.0.0.0的组合会拦截非本机连接。这个安全措施其实是在保护粗心的人,但如果你已经设置了requirepass,它就正常放行了。
对策
要么设置密码,要么设置protected-mode no。我建议前者。
6.4 redis-cli忘密码导致大量WARNING
现象
用redis-cli执行ping,返回NOAUTH Authentication required。
原因
没带-a参数或没进交互模式先认证。
对策
redis-cli -a 'your_strong_password' ping注意-a在命令行里面会暴露密码,如果是多人共用的服务器,可以在redis-cli交互模式里用AUTH your_strong_password来认证,这样不会被ps命令看到。
6.5 过高的网络延迟或代理导致连接超时
现象
客户端连接Redis时超时,但服务端日志里没有错误。
原因
离线环境里如果客户端和服务端之间隔了防火墙,或者有代理做端口转发,连接建立可能被卡住。
对策
- 检查防火墙策略,确认6379端口对外开放
- 在客户端执行
telnet 服务器IP 6379,看端口通不通 - 如果网络环境复杂,可以在
redis.conf里调timeout和tcp-keepalive
6.6 如何快速验证RDB和AOF文件完好
养成一个习惯:不管是正常备份还是迁移数据,都要校验持久化文件。
/usr/local/redis-7.4.0/bin/redis-check-rdb /var/lib/redis/dump.rdb /usr/local/redis-7.4.0/bin/redis-check-aof /var/lib/redis/appendonly.aof如果输出类似RDB looks OK,那就放心了。
6.7 常见问题速查表
| 问题 | 可能原因 | 快速解法 |
|---|---|---|
| 编译时找不到jemalloc.h | 工具链不完整或gcc过旧 | make MALLOC=libc |
| 服务启动就退出 | 配置文件路径或格式错误 | redis-server /etc/redis/redis.conf前台运行看日志 |
| systemd启动权限报错 | redis用户无对数据目录写权限 | chown -R redis:redis相关目录 |
| 远程连接被拒绝 | protected-mode开启且无密码 | 设置requirepass |
| AOF文件损坏无法启动 | 非正常断电或磁盘损坏 | 用redis-check-aof --fix修复 |
| CONFIG SET maxmemory报错 | 内存超限或整数溢出 | 输入64位整数范围内的字节数 |
7. 多台服务器推广部署的快捷技巧
如果你不是只装一台,而是要在内网批量部署Redis 7.4.0,每次都在每台机器上编译一遍就太浪费时间了。这里有两个我很常用的方法。
方式一:拷贝编译产物
在一台同CPU架构、同操作系统版本的服务器上编译完成后,把/usr/local/redis-7.4.0/bin/整个目录打包,拷贝到目标服务器,执行make install那一步就不需要了,直接把包解压到同样的路径即可。注意静态依赖要一致,主要看glibc版本,同版本系统问题不大。
tar -czf redis-7.4.0-bin.tar.gz -C /usr/local/redis-7.4.0/bin .目标机器上:
mkdir -p /usr/local/redis-7.4.0 tar -xzf redis-7.4.0-bin.tar.gz -C /usr/local/redis-7.4.0/bin chown -R redis:redis /usr/local/redis-7.4.0方式二:制作内网yum/apt源
如果你有内网仓库服务器,可以参照RedHat系的createrepo把RPM包做成源,或者用apt的reprepro做Debian系源。这样其他机器就能直接yum install redis了。但这个方案对系统定制化程度高,适合有专人维护内网源的团队。
我个人最常用的还是第一种,拷贝二进制,省心省力,版本可控。
8. 手上留个底:这几条经验是你以后少踩坑的保证
装完Redis 7.4.0只是开始。很多人在安装环节过了,却倒在后续运维和排障上。结合我这些年给客户排查Redis问题的经历,最后再提醒几句。
第一,Redis 7.x对系统的要求比老版本“更现代”,别拿装Redis 3.x的经验来套。它默认开启了ACL机制,配置文件里有些老参数已经改名了,比如activerehashing、hz这些还在,但很多和IO线程、TLS相关的参数如果你不熟,建议直接查官方文档,别靠记忆瞎配。
第二,安装完成后第一时间开启内存监控。离线环境服务器往往不止跑一个业务,Redis只是其中之一。我见过内存被打满之后整台服务器卡死的情况。建议用redis-cli info memory看看used_memory_peak和maxmemory的比例,做到心里有数。
第三,不要在数据还没备份的情况下反复重启测试。我干过一件蠢事:为了调一个参数,连续重启了三次Redis,第三次的时候AOF文件出了点问题,虽然最后用redis-check-aof --fix修好了,但那一瞬间的后背发凉到现在都记得。稳定的做法是:改配置前先BGSAVE,再重启,确保有最新RDB兜底。
第四,离线环境的版本管理要多留个心眼。源码包、编译产物、配置模板最好都归档在一个固定的目录里,比如/opt/redis-stack,并附带一个README说明版本和改动记录。不然三个月后你自己都分不清服务器上装的是哪个版本。
离线安装Redis 7.4.0这件事,要说难,确实不难,本质就是准备好源码、gcc、配置文件这三样东西;要说简单,也有不少细节讲究,尤其是环境差异导致的各种小问题。最关键的还是仔细加耐心,按步骤走,踩过的坑记下来,后续自然会越来越顺。我到现在依然保持着“先校验、再解压、后配置”的习惯,希望你也一样。