ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Redis 7.4.0离线安装实战:源码编译与生产配置指南

Redis 7.4.0离线安装实战:源码编译与生产配置指南 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 savedocker 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包依赖包说明是否必需gccC语言编译器必需gcc-cC编译器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.0Redis 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.0make 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的mallocmake MALLOClibc需要说明一下MALLOClibc和生产环境常用的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-aofAOF持久化文件检查工具redis-check-rdbRDB持久化文件检查工具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] DescriptionRedis 7.4.0 Server Afternetwork.target [Service] Typeforking 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 Restartalways Userredis Groupredis PIDFile/var/run/redis_6379.pid LimitNOFILE65535 [Install] WantedBymulti-user.target几个关键点Typeforking因为Redis配置里设置了daemonize yes主进程会fork出子进程然后退出所以要用forking类型Userredis生产环境不能以root运行Redis这是安全底线LimitNOFILE65535提高文件描述符上限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 MALLOClibc绕过jemalloc编译升级gcc如果遇到离线环境可以去内网镜像站下载配套RPM包6.2 systemd启动失败PID文件或权限错误现象systemctl start redis报错提示Failed to write PID file或Cant 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-keepalive6.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 MALLOClibc服务启动就退出配置文件路径或格式错误redis-server /etc/redis/redis.conf前台运行看日志systemd启动权限报错redis用户无对数据目录写权限chown -R redis:redis相关目录远程连接被拒绝protected-mode开启且无密码设置requirepassAOF文件损坏无法启动非正常断电或磁盘损坏用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、配置文件这三样东西要说简单也有不少细节讲究尤其是环境差异导致的各种小问题。最关键的还是仔细加耐心按步骤走踩过的坑记下来后续自然会越来越顺。我到现在依然保持着“先校验、再解压、后配置”的习惯希望你也一样。
返回列表