
先把话说在前头如果你在CentOS 8上装Redis只是图省事那用系统自带的DNF装个老版本确实最快但我自己实际部署过之后还是建议你走源码编译这条路。CentOS 8的软件仓库里Redis版本偏老而且模块化机制跟第三方软件源混在一起容易出现依赖冲突后面卸载也不干净。我这次从零走了一遍“源码装、systemd托管、再完整卸载”的全流程中间踩了不少坑也把常见问题都整理出来了这篇就直接把这些实操记录分享给大家照着走基本能一次跑通不管是刚接触Redis的新手还是要在环境上做部署验证的都可以拿来参考。1. 安装前先把环境摸清楚这一步很多人会跳过1.1 选源码编译而不是DNF安装背后的考虑很多朋友一上来就问“CentOS 8怎么装Redis”心里想的就是yum/ dnf install redis装完就能跑。确实CentOS 8的AppStream模块里提供了Redis模块一条dnf module install redis就能装上但这个模块里的Redis版本多数情况是6.x早期版本升级路径不透明模块切换也不怎么灵活。更重要的是如果你后面要换版本、要卸载重装模块卸载之后还有一堆配置残留排查起来很痛苦。源码编译的好处主要有三个版本完全可控想装6.2还是7.0都由自己定不受仓库更新节奏约束。编译参数和安装目录自己说了算方便跟其他软件隔离卸载时也清楚该删哪些文件。编译过程中还能跑测试集能提前暴露不少平台兼容性问题这对生产环境尤其重要。代价就是编译那几分钟而已真没必要省。我在模拟项目X的部署里就是用源码编译装的整个过程很干净卸载也方便。1.2 我理解的CentOS 8环境先检查这四件事正式开装之前先把系统基础状态过一遍。以我实际经验下面这四项不检查后面至少会把时间耗在莫名其妙的问题上。第一确认系统版本和架构。我建议先执行cat /etc/os-release uname -m确认是CentOS 8系列架构是x86_64。曾有同学在aarch64的机器上强行编译老版本Redis有些编译参数不支持走了弯路所以架构先看清楚。第二安装基础工具链。源码编译必须要有gcc、make以及后面make test要用的tcl。我用一条命令搞定yum install -y gcc make tcl要注意CentOS 8如果是最小化安装可能连tar、wget都没有顺手一起装。第三关闭或让SELinux别捣乱。这个得看你的具体安全策略。如果没专门要求最省事的是把SELinux调成permissive因为Redis默认监听6379端口SELinux强制模式下会拦截非标准端口的访问导致你服务明明起来了外面就是连不上。setenforce 0 sed -i s/^SELINUXenforcing/SELINUXpermissive/ /etc/selinux/config如果你不想动SELinux那就得为Redis手动配置对应的端口策略后面我会讲但先说明非强制模式确实省心。第四防火墙放行。CentOS 8默认firewalld是开着的如果Redis要供外部访问必须放行6379端口firewall-cmd --permanent --add-port6379/tcp firewall-cmd --reload当然如果Redis就打算本机用那这步可以跳过而且我建议你保持默认只监听127.0.0.1。1.3 顺手调整内核参数避免后面出现莫名其妙的性能问题Redis官方文档里有几个内核层面的建议很多人不当回事但真实跑起来差距很大。我最常调的是下面几个vm.overcommit_memory1。Redis在持久化时要fork子进程如果系统内存申请策略太保守子进程可能直接被拒绝分配内存导致RDB保存失败。设成1表示允许超量分配内存是官方在非只有一个客户端场景下的推荐值。关闭透明大页transparent_hugepage。THP在内存碎片化时容易引起延迟抖动对Redis这种对延迟敏感的程序很不友好。官方直接建议关闭。临时调整执行echo never /sys/kernel/mm/transparent_hugepage/enabled sysctl -w vm.overcommit_memory1永久生效可以写在/etc/rc.local或/etc/sysctl.conf里但要注意/sys/kernel/mm/transparent_hugepage不是sysctl参数只能靠启动脚本处理这块我就不展开了。2. 源码编译安装Redis的全流程记录2.1 下载指定版本别顺手拿个最新版Redis官网的下载页面会把每个版本列得很清楚我一直建议下载稳定版比如6.2.x系列因为7.x和后续版本在磁盘结构上有变化对老脚本的兼容性没那么友好。你可以去官方出品的下载页找到当前稳定版本的tar包我把文件名换成通用写法给你wget https://download.redis.io/releases/redis-6.2.14.tar.gz tar xzf redis-6.2.14.tar.gz cd redis-6.2.14这里有个细节我每次都会对下文件的校验值以防下载过程出问题sha256sum redis-6.2.14.tar.gz把得到的hash值和官方页面上的比对一致再继续。这算是我的习惯一个多月前还听说有人下载到了被篡改过的包多验一步稳妥。2.2 编译三步走make、make test、make install进入源码目录后按三步来make这一步用的是系统里的GCC编译。如果前面工具链没装这里会直接报错“cc: command not found”那就回去把gcc补上。编译过程大概三到五分钟期间机器会有明显负载正常现象别急着打断。接着跑测试集make test这一步很多人会跳过但我强烈不建议。Redis的测试集能帮你发现很多环境层面的兼容问题比如旧版GCC在某些平台上会有线程库的坑测试时就会直接暴露。如果测试全绿后面运行基本稳了一大半。最后安装make install这个命令默认把Redis的可执行文件装到/usr/local/bin/下里面包含redis-server、redis-cli、redis-sentinel、redis-check-aof、redis-check-rdb和redis-benchmark这几个主要工具。装完之后建议你在任意路径输入redis-server --version能正常输出版本号就说明二进制已经进PATH了装好了。2.3 目录规划这件事比你想的重要二进制装完不代表就算部署好了。我见过很多人直接把Redis跑在默认的源码目录下配置和数据混在一起后面想清理都不知道哪些文件能删。这里我按照生产环境的标准习惯把目录拆开管理mkdir -p /usr/local/redis mkdir -p /etc/redis mkdir -p /var/lib/redis mkdir -p /var/log/redis为什么要拆因为Redis涉及四种不同类型的文件可执行程序由make install放到/usr/local/bin配置文件我们单独放到/etc/redis持久化数据RDB/AOF单独放到/var/lib/redis运行日志放到/var/log/redis这样一来配置、数据、日志互不干扰卸载时按目录清理就不会误删别的东西排查问题时也只要看对应目录。我建议所有做部署的朋友都养成这个习惯别图省事都塞一个目录里。配置文件怎么来呢源码目录里自带一份模板cp /root/redis-6.2.14/redis.conf /etc/redis/redis.conf这里路径取决于你解压的目录我上面是解压到/root下你按自己的实际情况改。2.4 关键配置逐项改字段含义一次说清拿到配置文件后不需要改太多但以下几项必须按需调整。我把最常见的配置组合写出来并说明为什么这么设bind 127.0.0.1 port 6379 daemonize no pidfile /var/run/redis_6379.pid logfile /var/log/redis/redis.log dir /var/lib/redis protected-mode yes appendonly yesbind 127.0.0.1只允许本机连接。如果服务器本身要对外开放需要改成实际网卡IP但不管怎样别直接设成0.0.0.0裸奔除非你马上设好密码不然任何人都能连进来。daemonize no这个很多人疑惑明明是后台服务为啥不设成yes因为我后续会用systemd管理进程systemd希望服务在前台运行那它才能正确跟踪主进程状态。如果你不打算用systemd而是靠redis-server 这种原始方式那才需要设成yes。pidfile记录进程PID系统服务脚本会用到保留默认就行。dir /var/lib/redis持久化文件的写目录RDB快照和AOF日志默认都会写到这里。如果不改会在启动目录下生成dump.rdb超级乱。protected-mode yes保护模式。在没有bind具体IP且没设密码的情况下保护模式会拒绝外部连接是个安全兜底建议保持开启。appendonly yes开启AOF持久化。Redis重启后可以按操作日志恢复数据比单纯RDB更可靠。对要求不高的场景也可以只开RDB但既然都装了持久化尽量做全。还有一个最容易被忽略的就是密码。Redis默认没有身份验证匿名就能连完全裸露在局域网里非常危险。我建议你哪怕只是本机开发也设一个requirepass 你自己的强密码密码不要写在博文里参考出花来你自己生成一个复杂点的就行。设了密码之后redis-cli交互时就要加-a参数或者进入后先执行auth这一步后面有演示。2.5 首次启动验证连上来就是成功的一半配置改完后先不要急着注册成服务我习惯手动启动一次确认配置本身没问题redis-server /etc/redis/redis.conf如果加了daemonize no命令会在前台挂着说明启动正常这时按CtrlC停掉。如果配置有问题它会在终端直接打印错误比看日志快。确认配置能正常启动后后台正式用systemd接管而不是靠前台方式常驻这部分我放在下一章详细写。3. 用systemd把Redis托管起来服务管理才算完整3.1 为什么要systemd而不是自己守护进程Redis二进制本身可以作为守护进程运行也就是把daemonize设为yes但我不推荐这么用原因有几个进程意外退出后不会有自动重启机制没人拉它起来。开机自启需要额外写rc.local脚本不同系统兼容性差。日志和进程状态管理都不统一排障时要到处翻。而用systemd这些全都是系统级的方案崩溃自动重启、开机自启、日志统一走journalctl日常管理和运维都方便得多。我甚至可以说在CentOS 8上不用systemd去管Redis等于把服务管理水平倒退了十年。3.2 创建redis用户程序也别用root跑安全习惯不能丢。我在模拟项目X的部署中专门建了一个低权限用户来跑Redis避免进程以root身份运行——万一容器或系统被getshell攻击者直接就是root没法接受。useradd --system --home-dir /var/lib/redis --shell /sbin/nologin redis chown -R redis:redis /var/lib/redis chown -R redis:redis /var/log/redis解释一下--system创建的是系统账户--shell /sbin/nologin表示这个用户不能登录纯粹是给服务用的。然后/var/lib/redis和/var/log/redis的所有权改给该用户保证Redis能正常写数据。3.3 编写redis.service文件每个字段都说清楚在/etc/systemd/system/下新建redis.service[Unit] DescriptionRedis persistent key-value database Afternetwork.target [Service] ExecStart/usr/local/bin/redis-server /etc/redis/redis.conf ExecStop/usr/local/bin/redis-cli -a 你的密码 shutdown Restartalways Userredis Groupredis RuntimeDirectoryredis RuntimeDirectoryMode0755 [Install] WantedBymulti-user.target这段里我挑重点说ExecStart指向redis-server并把配置文件的路径传进去。一定要用绝对路径。ExecStop用redis-cli shutdown优雅关停让Redis完成持久化后再退出避免强杀导致AOF或RDB损坏。这里我加了-a参数是因为配置文件里已经设置了密码不加会提示NOAUTH关不掉。Restartalways非正常退出时自动拉起适合Redis这类常驻型服务。User和Group指定低权限用户运行。RuntimeDirectoryredis让systemd帮忙管理一个运行时目录一般对应/run/redis不用自己手动建。写完保存后先重载systemd配置systemctl daemon-reload然后启动并设置开机自启systemctl enable --now redis3.4 验证服务状态这四步缺一不可启动完后别急着高兴按顺序验证这四个点第一看进程和端口systemctl status redis ss -lntp | grep 6379第二看日志有没有报错journalctl -u redis -f第三本地连Redis测试redis-cli -a 你的密码 ping正常会返回PONG。第四测试数据写入和读取redis-cli -a 你的密码 set name hello redis-cli -a 你的密码 get name能正常赋值取值说明服务全链路是通的。如果能看到/var/lib/redis/appendonly.aof文件生成说明AOF持久化也工作了。我来总结一下这个阶段容易漏的点如果用Userredis但没给/var/lib/redis授权Redis启动时会因为无法创建AOF文件直接退出日志里会看到权限报错。如果ExecStop里没处理密码每次执行systemctl stop redis会卡住或直接超时强杀对持久化数据不友好。如果daemonize设成了yes且systemd文件里没有Typeforkingsystemd会误判服务启动失败这类问题在论坛里几乎天天见。4. 卸载Redis跟安装同样讲究清理不彻底等于白卸4.1 卸载前先想清楚要保留什么卸载前先确认有没有必须保留的数据。如果你只是测试环境那直接删但如果是生产或开发环境RDB和AOF文件要先备份。Redis的持久化文件在/var/lib/redis目录下常见的有dump.rdb和appendonly.aof。备份时直接用cp或者tar打包就行tar czf redis-backup.tar.gz /var/lib/redis个人经验如果之后还要重新装新版Redisappendonly.aof可以和旧版共用但跨大版本最好先做一次redis-cli --rdb导出避免协议不兼容导致加载失败。4.2 停止服务、禁用自启一步都不能少卸载的第一步不是删文件而是让服务先彻底停下systemctl stop redis systemctl disable redisdisable很重要它会把开机自启的软链接删掉否则你服务虽然停了下一次重启又自动拉起来就会跟正在删除的文件产生冲突导致删除不干净或目录权限异常。然后确认进程真的退出了ps aux | grep redis ss -lntp | grep 6379如果有残留进程直接kill对应PID如果还有进程在监听6379说明服务没完全停这时候删文件只会制造混乱。4.3 二进制、配置、数据分开清理别用一条rm糊弄过去删除前先列清楚Redis装了哪些东西避免误删。按照前面规划的目录结构逐项删除rm -f /usr/local/bin/redis-server rm -f /usr/local/bin/redis-cli rm -f /usr/local/bin/redis-sentinel rm -f /usr/local/bin/redis-check-aof rm -f /usr/local/bin/redis-check-rdb rm -f /usr/local/bin/redis-benchmark配置文件和数据目录rm -rf /etc/redis rm -rf /var/lib/redis rm -rf /var/log/redis rm -rf /usr/local/redis为什么我要一个组件一个组件删而不是直接rm -rf /usr/local/bin/redis-*因为通配符有可能误伤到其他软件的二进制比如有的工具会生成名为redis-tools的辅助程序。逐项列清楚最稳妥至少在删二进制时别偷懒。最后删除systemd服务文件rm -f /etc/systemd/system/redis.service systemctl daemon-reloaddaemon-reload这步不能忘否则systemd仍然会跟踪一个已经不存在的服务定义虽然不影响运行但每次systemctl status redis都会报错让人很不爽。4.4 把和Redis相关的账户与残留一起处理掉如果严格按前面的步骤装了还有一个容易被忽略的残留系统账户redis。userdel redis如果Redis的数据目录曾经归属于该账户删除账户后那些目录就成了无主文件我一般直接一并清理。如果你需要保留数据做迁移可以留着账户不删但至少要userdel -f之前备份好所有需要的数据。清理完这些再复查一次which redis-server which redis-cli ls -ld /etc/redis /var/lib/redis /var/log/redis这些命令应该都提示文件不存在。到这一步卸载才算真正干净。4.5 附录如果是DNF模块装的Redis卸载方式不一样前面我们一直走的是源码编译路线但如果你的环境当初是通过DNF模块装的卸载命令就不一样dnf module remove redis dnf autoremove但说句实话模块方式卸载往往不如源码方式干净——/etc/redis下的配置残留还有可能留着你得手动再清一遍。这也是我推荐自己编译的另一个原因卸载时心里有数。5. 常见问题与排查技巧实录5.1 启动时报“Cant open the log file”服务起不来这个十有八九是日志目录权限问题。用Userredis运行Redis时logfile /var/log/redis/redis.log路径必须对redis用户可写。之前我给别人排查时就发现他建了目录但没改属主导致权限报错。解决办法很简单chown -R redis:redis /var/log/redis chown -R redis:redis /var/lib/redis改完后重启服务如果还不行再用journalctl -u redis看具体报错不要只盯着Redis自带日志。5.2redis-cli提示“DENIED Redis is running in protected mode”这个错误特别容易出现在刚配好Redis的环境上。看到这一句说明客户端不是从127.0.0.1连进来的Redis出于保护模式拒绝了访问。排查思路确认bind配置是不是只写了127.0.0.1如果是并且你确实需要远程连接那就改成实际监听IP或用0.0.0.0但必须配合requirepass否则就是在裸奔。检查防火墙放行端口前面我已经讲过命令这里不再重复。确认client有没有走对IP别是连了公网IP但防火墙没放行。这里我给一个安全建议如果必须让Redis暴露在非本机环境至少要把protected-mode和requirepass一起处理别只图省事关保护模式。5.3 内存相关的警告“vm.overcommit_memory is set to 0”Redis会在启动时打印这条警告告诉你如果fork子进程时内存不足RDB持久化可能失败。解决办法echo 1 /proc/sys/vm/overcommit_memory也可以写入/etc/sysctl.conf固定vm.overcommit_memory 1然后sysctl -p生效。这个参数的含义是允许内存超额分配Redis官方文档确实建议设为1。如果你不太担心fork失败或系统有其他内存管理需要也可以保持默认但这条警告只要出现我还是建议按官方建议处理。5.4 开机自启没生效重启后Redis不见了重启后连不上Redis多半是systemd服务没正常启用。用下面的命令检查systemctl is-enabled redis systemctl status redis如果显示disabled说明当时只执行了systemctl start redis漏掉了enable。正确做法是一条命令同时解决systemctl enable --now redis另外如果你改了redis.service文件记得systemctl daemon-reload否则systemd还在用旧的配置服务状态会跟你的预期完全不相干。5.5 AOF文件损坏导致Redis无法启动AOF文件如果因为断电或强制杀掉进程出现残缺Redis启动时会拒绝加载并报错。这个时候可以借助自带工具修复redis-check-aof /var/lib/redis/appendonly.aof --fix它会扫描日志文件把不符合协议的部分截断掉。注意修复前最好先备份原始AOF文件因为--fix会直接修改原文件。如果只是想尽快恢复服务也可以先临时把appendonly no去掉让它以纯RDB方式启动等数据稳定后再开启AOF。5.6 排查问题的最小命令清单我把最常用的命令整理成一张表排查时直接对照着执行目的命令查看服务状态systemctl status redis查看运行日志journalctl -u redis -n 100查看端口监听ss -lntp | grep 6379连接测试redis-cli -a 密码 ping查看所有keyredis-cli -a 密码 keys *查看运行信息redis-cli -a 密码 info这张表基本覆盖了80%以上的日常排障场景剩下的多半是在配文件和权限上打转。6. 最后分享一点我自己的体会整套流程走下来我最大的感受就是装Redis不难难的是把一个服务管理得明明白白从安装目录规划、权限划分到systemd托管再到卸载时的清理策略每一步都在为后面的维护减少麻烦。我自己踩过的最深的一个坑就是第一次用DNF装Redis后来项目要升级版本模块和源码编译的二进制混在一起排查了好久才搞明白哪个是动态库、哪个是残留文件。所以现在我在任何一台CentOS 8上部署Redis都会坚持源码编译固定版本配好systemd托管并且把关键路径记在本子上后面维护、卸载都顺手很多。这次分享的每一步都是我在实际环境中验证过的照着来做我相信你可以少走不少弯路。