很多朋友在CentOS 8上装Redis最常遇到的尴尬是用yum装完了服务起来了但本机ping得通远程死活连不上要么是卸载的时候明明删了包重启之后Redis又自己冒出来了——数据目录还在服务还在感觉永远卸不干净。这篇文章就是要把这两件事讲透在CentOS 8上怎么把Redis装好、跑稳以及怎么把Redis彻底卸载干净。我会把两种主流安装方式dnf包管理和源码编译都过一遍并给出我实际生产中常用的配置和排错思路。适合刚接触Linux的运维新手也适合那些被EOL源折腾过的老手。CentOS 8在2021年底就停止维护了默认的yum源已经失效这是安装Redis时第一个拦路虎。我会先从环境准备讲起然后分别给出dnf和源码编译两条路再讲systemd托管和核心配置最后给出一个不残留的卸载流程。下面直接进入正题。1. 为什么CentOS 8装Redis比想象中麻烦EOL和仓库的双重考验1.1 CentOS 8 已经停止维护你的yum源还能用吗CentOS 8的生命周期在2021年12月31日正式结束之后官方仓库从mirror.centos.org移到了vault.centos.org。如果你现在拿一个全新的CentOS 8.5系统直接执行dnf install redis大概率会报错“Error: Failed to download metadata for repo ‘appstream’”因为默认的baseos/appstream源已经指向了不存在的路径。这不是Redis本身的问题是操作系统源失效了。解决办法是把源切换到vault。我一般会在安装任何东西之前先做这步否则后面所有依赖都会因为解析不到元数据而失败。操作很简单就是把/etc/yum.repos.d/CentOS-Linux-BaseOS.repo和CentOS-Linux-AppStream.repo里的mirrorlist开头的那行注释掉把baseurl改成vault的地址。我习惯用sed直接替换省事sed -i s|^mirrorlist|#mirrorlist|g /etc/yum.repos.d/CentOS-Linux-*.repo sed -i s|^#baseurlhttp://mirror.centos.org|baseurlhttp://vault.centos.org|g /etc/yum.repos.d/CentOS-Linux-*.repo注意vault里有多个版本目录比如8.5.2111CentOS默认是跟着系统版本走。如果你改完还是报404可以再手动把baseurlhttps://vault.centos.org/8.5.2111/BaseOS/$basearch/os/这种形式固定下来并去掉$releasever变量。改完执行dnf clean all dnf makecache验证源能不能正常解析。这一步是后面所有安装动作的地基别跳过。1.2 选对安装方式包管理器 vs 源码编译的取舍在CentOS 8上装Redis有两条主流路线一是用dnf install redis二是去官网下载源码编译安装。两条路各有优劣我说下我自己的体验。dnf安装的好处是快、省事和系统集成度好卸载时一条命令就能移除rpm包。但坑在于CentOS 8默认仓库里的Redis版本是5.0.3虽然稳定但很多新特性没有比如Redis 6才有的RESP3协议、ACL权限控制Redis 7才有的多线程I/O、函数特性。如果你是生产环境需要新版本或者就想体验较新的功能dnf这条路显然不够。源码编译安装的好处是版本随心所欲可以编译最新稳定版7.2.x而且编译参数可以自己定制。缺点是需要自己管理安装路径、服务文件和卸载逻辑稍不留神就会残留一大堆东西。不过这也正是本文要讲透的地方装就装得明明白白卸就卸得干干净净。我个人的建议是如果你只是本地开发测试、快速搭建用dnf装5.0也行如果你是给线上业务用或者想学习Redis 7的新特性老老实实源码编译。下面两种方法我都讲。2. 安装前必须处理的环境问题防火墙、依赖和系统模块2.1 关闭或放行防火墙端口否则远程连不上很多人在CentOS 8上装好Redis后在服务器本机执行redis-cli ping返回PONG以为万事大吉结果用Redis Desktop Manager从自己电脑上一连直接报Connection Refused。百分之八十的原因是防火墙没放行6379端口。CentOS 8默认用的是firewalld它默认只放行ssh其他端口一律阻断。所以装Redis之前我建议先把防火墙规则想清楚。如果你的内网环境安全可控最省事的办法是直接关掉firewalldsystemctl stop firewalld systemctl disable firewalld但生产环境不建议这么做更稳的做法是只放行需要的端口。比如允许内网网段访问6379firewall-cmd --permanent --zonepublic --add-rich-rulerule familyipv4 source address192.168.1.0/24 port protocoltcp port6379 accept firewall-cmd --reload这样既保证了Redis能被内网访问又不至于把端口暴露给整个公网。还有一个容易忽略的点如果你用的是云服务器阿里云、腾讯云之类的除了系统防火墙控制台的安全组也要放行6379端口。很多同学在服务器本地把firewalld都关了还是连不上最后发现是安全组规则没加这种事我碰到过不止一次。2.2 安装编译工具链和依赖gcc、make等如果你走源码编译路线需要确保系统里有gcc、make、pkg-config这些基础工具。CentOS 8的AppStream源里提供了gcc 8.x够用。命令是dnf install -y gcc make pkg-config有些教程会让你装tcl和tcl-devel这是为了跑Redis自带的测试套件用的。如果你只是编译安装不打算执行make test那可以不用装。但我个人建议装一下因为Redis的make test能帮你快速验证编译出来的版本在当前的系统环境下是否正常免得将来上线后出现各种诡异问题。源码包里有些代码文件是提前生成好的不需要额外依赖。但如果你在编译过程中遇到了jemalloc相关的报错通常是因为GCC版本或系统环境变量问题导致的这时可以试一下make MALLOClibc告诉Redis使用libc的内存分配器而不是默认的jemalloc。这个参数在后面编译时会讲到。3. 方法一用dnf直接安装Redis适合快速上手3.1 切换DNF源到vault仓库前面说过CentOS 8的官方源失效了所以用dnf安装Redis之前先按1.1节的方法切换源。切换完成后执行dnf search redis应该能看到redis.x86_64这个包。有个细节CentOS 8的默认模块源里Redis是作为AppStream的一个模块提供的。有时候执行dnf install redis会提示需要启用模块比如redis:5.0。你可以先查看模块列表dnf module list redis输出里会显示默认版本通常是redis 5.0。不用纠结直接装就行。如果你后续想在dnf里用Redis 6或7需要第三方仓库支持比如Remi这个我后面提一下。3.2 安装、启动、设置开机自启源好之后安装命令就很简单了dnf install -y redis装完先看版本和安装路径redis-server --version rpm -ql redisrpm -ql redis会列出这个包安装的所有文件对后面卸载很有用。默认的配置文件在/etc/redis.conf可执行文件在/usr/bin/redis-server和/usr/bin/redis-cli数据目录在/var/lib/redis日志在/var/log/redis。启动服务systemctl start redis systemctl enable redis注意CentOS 8的Redis包自带的systemd单元文件里启动命令是/usr/bin/redis-server /etc/redis.conf所以如果你改了配置文件重启服务就会生效。检查状态systemctl status redis redis-cli ping到这里dnf方式安装的Redis就能用了。但前面也说了它的默认配置很保守只绑定了127.0.0.1没有密码保护模式是开启的。你需要在配置文件里改bind和requirepass这部分我在第5节统一讲。4. 方法二源码编译安装Redis 7.x适合生产环境4.1 下载与解压国内镜像加速小技巧源码安装的第一步是下载源码包。Redis官网download.redis.io的速度在海外网络环境尚可但国内可能很慢。我通常用华为云镜像或清华镜像下载速度快很多。以7.2.4为例wget https://mirrors.huaweicloud.com/redis/release/redis-7.2.4.tar.gz tar xzf redis-7.2.4.tar.gz cd redis-7.2.4如果没有wget先装一下dnf install -y wget。4.2 编译安装的具体命令和参数Redis源码编译非常简单没有configure脚本直接make。但是要指定安装路径不然默认会散落在一堆系统目录里以后卸载很麻烦。我习惯用PREFIX指定到一个独立的目录比如/usr/local/redis-7.2.4make -j$(nproc) make install PREFIX/usr/local/redis-7.2.4make -j$(nproc)表示用所有CPU核心并行编译速度快很多。如果你出现jemalloc编译错误可以这样make MALLOClibc -j$(nproc)编译完成后的可执行文件会安装到/usr/local/redis-7.2.4/bin下包括redis-server、redis-cli、redis-sentinel、redis-check-aof、redis-check-rdb、redis-benchmark。接下来把配置文件复制过去mkdir -p /usr/local/redis-7.2.4/conf cp redis.conf /usr/local/redis-7.2.4/conf/4.3 配置Redis作为系统服务systemd单元文件源码安装不会自动注册systemd服务所以我们得自己写一个单元文件。这是源码安装和rpm安装最大的区别之一。新建/etc/systemd/system/redis.service[Unit] DescriptionRedis Server Afternetwork.target [Service] Typeforking ExecStart/usr/local/redis-7.2.4/bin/redis-server /usr/local/redis-7.2.4/conf/redis.conf ExecStop/usr/local/redis-7.2.4/bin/redis-cli -p 6379 shutdown Restartalways Userredis Groupredis [Install] WantedBymulti-user.target这里有几个点要注意Typeforking是因为我们会在redis.conf里设置daemonize yes让Redis启动后以守护进程方式在后台运行。如果daemonize no那应该用Typesimple否则systemd会误判服务启动失败。User和Group用redis账号安全考量。所以还要先创建redis系统用户groupadd redis useradd -g redis -s /sbin/nologin redis然后给Redis工作目录设置权限。假设数据目录是/data/redis日志目录是/var/log/redismkdir -p /data/redis /var/log/redis chown -R redis:redis /data/redis /var/log/redis这些路径后面都要在redis.conf里指定。写完后重载systemdsystemctl daemon-reload systemctl start redis systemctl enable redis想验证服务是否被正确托管执行systemctl status redis如果显示active (running)说明成功。这种方法卸载时也很清楚systemctl stop redis systemctl disable redis再删掉service文件和安装目录就行。5. Redis核心配置调整让本机和远程都能正常使用5.1 绑定地址、端口和守护进程模式不管用哪种方式安装redis.conf里这几个配置项几乎是必改的。先说bind和protected-mode。默认情况下bind 127.0.0.1意味着只能本机访问。如果你想内网其他机器访问有两种改法把bind改成具体的内网IP例如bind 192.168.1.100设置protected-mode no同时确保有密码。我推荐的做法是如果有多个网卡就把内网IP写在bind后面用空格分隔如果只是一个简单环境可以bind 0.0.0.0但必须配合密码。虽然目前可以绑定所有接口但安全段不能丢否则Redis很容易被扫描爆破。端口默认6379一般不用改。如果改了记得客户端连接时指定端口。port这一项在配置文件里搜索就能找到。daemonize在dnf安装时CentOS自带的配置默认是daemonize no但systemd单元文件里其实是通过Typenotify或者前台运行方式来管理的所以不用动它。如果是源码安装且我们用Typeforking的systemd方式必须把它改成daemonize yes。这个细节很容易踩坑很多人在源码装完手动启动没问题但用systemd老是起不来多半就是Type和daemonize不匹配。5.2 设置密码、持久化参数和内存策略生产环境必须设置的几个参数如下requirepass 你的强密码这行注释掉后打开。注意设置密码后redis-cli连接需要用-a参数或者先执行AUTH命令。另外masterauth在主从复制时也需要设置否则从节点重连主节点会认证失败。持久化方面Redis默认开启了RDB快照但AOF是关闭的。我比较倾向两者都开RDB用于快速恢复AOF用于尽量少丢数据。配置如下appendonly yes appendfilename appendonly.aof appendfsync everysecappendfsync everysec是性能和可靠性的折中每秒钟刷一次AOF。如果要极致安全可以改成always但会严重降低写入性能。内存策略也要提前想清楚。如果不设置maxmemoryRedis会用尽系统内存导致OOM被杀。我一般会设置maxmemory 2gb maxmemory-policy allkeys-lrumaxmemory-policy有很多可选值allkeys-lru表示内存满了以后对所有键执行LRU淘汰。如果你的业务里有些键不能淘汰那就用volatile-lru只淘汰设置了过期时间的键。5.3 用redis-cli验证读写和性能配置改完后重启Redissystemctl restart redis然后本机用redis-cli测试redis-cli -a 你的密码 ping # 输出 PONG redis-cli -a 你的密码 set hello world redis-cli -a 你的密码 get hello如果远程连接记得加-hredis-cli -h 192.168.1.100 -p 6379 -a 你的密码 ping如果你的机器上没有安装redis-cli也可以下载一个单独的客户端或者用nc直接探测端口通不通。这里补充一个非常实用的命令查看Redis当前状态redis-cli -a 你的密码 info serverinfo输出里有很多关键指标比如uptime_in_seconds、connected_clients、used_memory_human这些是排查问题时最先要看的信息。想测下这台Redis的基准性能用自带的redis-benchmarkredis-benchmark -h 127.0.0.1 -p 6379 -a 你的密码 -c 50 -n 100000 -t set,get这个命令模拟50个并发连接执行10万次set和get输出每秒请求数。正常的云服务器上Redis 7.x的qps少说也有8到10万如果掉到一两万先检查是不是网络、CPU或配置的问题。6. 其他安装方式Docker和第三方编译版按需选用6.1 Docker方式的好处和注意点很多朋友喜欢用Docker跑Redis尤其是需要起多个实例、做主从复制时Docker确实方便。拉镜像、跑容器几分钟就能搞定docker run -d --name redis7 -p 6379:6379 -v /data/redis:/data redis:7.2-alpineDocker方式的好处是版本切换方便、环境隔离干净卸载也简单docker stop redis7 docker rm redis7。但要注意容器里默认配置很多限制比如没有密码、没有持久化你需要用-v挂载配置文件或者通过启动参数传入。而且Docker里的Redis进程在容器内宿主机防火墙虽然不用额外放行但端口映射和selinux上下文这类问题可能冒出来。如果对Linux命令还不熟Docker排查起来反而更绕所以我更建议先把原生方式搞明白。6.2 第三方repo如Remi安装的差异Remi仓库针对CentOS 8提供了Redis 6.0和7.0的rpm包有些同学不想编译又想用新版本就启用Remi。启用方法是dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm dnf module reset redis -y dnf module install redis:remi-7.0 -y这种方式装的Redis版本比较新且是rpm包卸载用dnf remove redis就行。但Remi仓库是第三方维护的安全性只能信任维护方的构建流程。我不反对用它但生产环境建议在测试环境里充分验证后再依赖它。7. 卸载Redis的完整流程彻底清除不留垃圾7.1 停止服务并禁用开机自启不管是哪种方式装的卸载前最好先停服否则数据文件可能还在写入删除时容易出问题。同时也把开机自启移除避免重启后服务又起来。如果是dnf安装systemctl stop redis systemctl disable redis如果是源码安装systemctl stop redis systemctl disable redis rm -f /etc/systemd/system/redis.service systemctl daemon-reload注意systemctl disable只是移除了符号链接服务文件我们还是手动删掉。7.2 根据安装方式卸载软件包或删除编译安装文件dnf安装的卸载就一条命令dnf remove -y redis这个命令会把redis相关的rpm包卸掉但不会删除配置文件和数据目录这可能是很多人觉得“卸不干净”的最大原因。红帽系rpm卸载时默认会保留配置和数据这是它的安全策略防止你手滑卸载导致数据丢失。所以卸载后我们还得手动清理。源码安装的卸载更直接你当初把文件装在哪个目录删掉那个目录就行。以我前面为例rm -rf /usr/local/redis-7.2.4还要检查是否有软链接指向这个目录比如ls -l /usr/local/bin/redis*如果有逐个删掉。我见过有的朋友把/usr/local/redis做成了软链接导致删了源目录后软链接还在一执行redis命令就报错找不到文件这种半残废状态很烦人。7.3 清理残留数据、日志和配置文件下面把常见的残留位置列一下按需清理安装方式配置文件数据目录日志目录systemd服务文件dnf安装/etc/redis.conf/var/lib/redis/var/log/redis/usr/lib/systemd/system/redis.service源码安装自定义目录如/usr/local/redis-7.2.4/conf/data/redis或自定义/var/log/redis或自定义/etc/systemd/system/redis.service对于dnf安装执行rm -rf /etc/redis.conf /etc/redis.conf.default /var/lib/redis /var/log/redis同时清理redis账户和用户组userdel redis groupdel redis注意如果系统里还有其他程序在使用redis账户就不要乱删。源码安装如果也创建了redis用户确认没别的用途后再删。最后再看看有没有开机启动残留systemctl list-unit-files | grep redis如果还有任何redis相关的unit也一并禁用删除。再用which redis-server redis-cli检查一下可执行命令是否还被PATH引用。如果发现别的位置有残留的二进制文件多半是之前手动复制过也需要清掉。做到这里基本算是把Redis从系统里彻底请走了。8. 高频问题排查装上了但连不上启动失败8.1 无法连接到CentOS 8上的Redis从bind、密码到防火墙这是网上问得最多的问题“无法连接到centos8上的redis”。按我的排查顺序一分钟就能定位先本地测redis-cli -a 密码 ping如果本地都PONG不了说明服务没启动或配置文件语法有错去看日志。如果本地能PONG远程连不上先看防火墙systemctl status firewalld放行6379了吗firewall-cmd --list-all里能看到吗再看bind配置redis-cli CONFIG GET bind如果只绑定了127.0.0.1远程肯定连不上需要改成实际IP或0.0.0.0。还要看protected-mode即使bind了0.0.0.0如果保护模式开启且没密码Redis会拒绝外部连接并给出警告。这时第一要务是设置requirepass。云服务器别忘了安全组。如果以上都排查完还不行用ss -lntp | grep 6379看看端口是否处于监听状态。如果显示的是127.0.0.1:6379说明bind没生效重启服务或热加载配置文件再测。8.2 redis.service启动失败日志怎么看源码安装后用systemd启动失败最常见的就是Type和daemonize不匹配。我前面已经强调过如果daemonize yesunit里就用Typeforking如果daemonize nounit里用Typesimple。还有一个原因是Redis的PID文件路径不对。配置文件里设置的pidfile /var/run/redis_6379.pid但systemd的PIDFile没有对应指定导致systemd判断启动失败。如果是rpm安装这些细节它都帮你配好了不需要操心。当启动失败时用journalctl -u redis查看系统日志红色标记的报错行才是关键。比如出现# Creating Server TCP listening socket *:6379: bind: Address already in use说明端口被占用可能是之前没停干净用ss -lntp | grep 6379找到进程然后kill -9或者用redis-cli shutdown nosave停掉。8.3 开机自启不生效systemd异常处理有些时候重启服务器后Redis还是没有自动起来。先查看systemctl is-enabled redis如果输出disabled说明之前没启用。如果输出enabled但还是没起来看下服务启动日志里有没有因为网卡没就绪而失败。我的习惯是在unit的[Unit]段加上Afternetwork-online.target并且启用systemctl enable systemd-networkd-wait-online.service如果有必要。对于虚拟机环境网络初始化比较慢时这条特别有效。还有一个容易忽略的地方如果你的数据目录或PID文件目录落在/tmp下面系统重启时会被清空而Redis启动时发现目录不存在就会失败。所以数据目录和日志目录一定要放在持久化路径里比如/var/lib/redis或/data/redis。9. 最后分享一点我折腾CentOS 8 Redis的体会前前后后在CentOS 8上装过几十次Redis踩过的坑无非就是那些源失效、防火墙、bind、SELinux、systemd不匹配。但也就是这些坑逼着我每次装完都会顺手写一个安装脚本把源切换、依赖安装、配置修改、服务注册全都固定下来迭代到现在已经稳定多了。如果你也是要反复在多台机器上部署Redis强烈建议把本文的步骤整理成脚本或Ansible playbook比每次手动敲命令省心得多。还有一个经验卸载Redis之前先备份数据目录尤其是AOF和RDB文件。别觉得卸了就完了很多时候我们是在升版本旧数据要从老实例迁到新实例没有备份就只能拍大腿了。即使确定不要了也建议执行redis-cli shutdown做一次优雅关闭确保AOF缓冲区里的数据能落盘再开始删。最后我自己的习惯是统一用/usr/local/redis-7.2.4这种带版本号的目录然后用软链接ln -s指到/usr/local/redis升级时直接替换软链接回滚也方便。配置文件不放在源码目录里而是单独放到/etc/redis/redis.conf数据目录放在/data/redis。这样一套约定下来不管是装还是卸心里都有数不会出现那种“删了包但文件不知道在哪”的情况。希望这篇实用文章也能帮你在CentOS 8上把Redis装得明白卸得干净。