ARTICLE DETAIL

资讯详情

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

CentOS 8安装与卸载Redis全攻略:从镜像源修复到生产配置

CentOS 8安装与卸载Redis全攻略:从镜像源修复到生产配置 1. CentOS 8 此刻装 Redis第一步不是敲命令先说一个很现实的场景很多朋友拿到 CentOS 8 之后第一件事就是执行dnf install redis结果终端无情地回了一句No match for argument: redis甚至直接报仓库源错误。这时候千万别急着怀疑自己的命令拼错了大概率是源出了问题。CentOS 8 官方在 2021 年底就已经停止维护了社区仓库陆续迁移到了vault.centos.org存档目录国内不少镜像站也把原本的BaseOS、AppStream、Extras仓库移到了存档路径。你本机的 yum 源配置还指着老地址自然找不到包。所以在这台系统上装任何软件第一步都是先检查 yum/dnf 源还通不通。本篇文章会完整覆盖 CentOS 8 环境下安装 Redis 和卸载 Redis 的全部操作包括镜像源修复、几种安装方式的选型、生产环境配置调整、连接验证、卸载残留清理以及我实际部署中踩过的高频坑。适合刚刚接触 Linux 的运维新手也适合需要在旧版本系统上快速交付 Redis 环境的开发、测试同学。1.1 先确认系统版本和源状态不管装什么软件我都习惯先看系统底细cat /etc/centos-release如果显示的是CentOS Linux release 8.x.2111这类版本号那基本就是标准 CentOS 8。接着检查 dnf 仓库列表dnf repolist正常情况下你会看到类似下面这样的三行仓库名AppStream、BaseOS、Extras。如果执行之后没有任何仓库显示或者提示更新元数据失败、Errors during downloading metadata之类的报错那基本可以确定源已经失效了。另一种常见情况是执行dnf install redis时无报错但提示找不到包。这是因为 CentOS 8 内置的 AppStream 仓库里确实有 redis 包只不过仓库源路径已经变了元数据没有拉取到新位置。处理器和 ARM 架构等不同平台的地址还不一样所以最好的办法是直接整套替换成新的可用源。1.2 镜像源替换的完整操作我推荐的方案是切换到阿里云镜像、腾讯云镜像或者直接改走vault.centos.org存档源。这里以阿里云镜像为例操作非常简单全程只需要三组命令。先备份原有源mkdir -p /etc/yum.repos.d/backup mv /etc/yum.repos.d/CentOS-*.repo /etc/yum.repos.d/backup/然后下载阿里云提供的 CentOS 8 存档源配置curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo清一下缓存并重新生成元数据dnf clean all dnf makecacheCentos-vault-8.5.2111.repo这个文件里的地址都指向阿里云的存档目录对已经 EOL 的 CentOS 8 照样有效。等dnf makecache跑完你会发现仓库列表能正常拉取到了。这时候再执行dnf list redis --showduplicates就能看到仓库里可用的 redis 版本。CentOS 8 自带的 AppStream 仓库默认提供 Redis 5.0如果你对版本要求不高这就是最省事的路径。1.3 版本选择yum 自带版本与源码新版的差距先把版本逻辑讲明白后面选安装方式时你心里才有底。CentOS 8 AppStream 仓库自带的是 Redis 5.0对比当下新版本少了多部分数据结构增强、性能优化和命令功能更新但胜在稳定、无兼容性包袱如果你只是做缓存、队列这类基础场景完全够用。Redis 6 引入了多线程 IO、ACL 访问控制、新版协议 RESP3、过期键主动回收优化等特性是不少线上团队目前的主力版本。Redis 7 在 6 的基础上继续优化了内存效率、复制机制、AOF 相关行为新功能更多但如果你刚入门其实不需要太纠结等部署完再慢慢体验不迟。在 CentOS 8 上想装 Redis 6 或 7通常有三条路源码编译安装、用第三方的 Remi 仓库、用 Docker 容器跑镜像。QQ 群里经常有人说“编译麻烦直接拉个官方源装不香吗”但在已经 EOL 的 CentOS 8 上第三方仓库的兼容性有时候反而会带来新麻烦。所以我自己更倾向于源码编译和 Docker 两条路原因后面展开说。2. 三种安装方式哪种最适合你的服务器安装 Redis 其实不复杂复杂的是不知道选择哪条路。我在这个章节给出三套方法分别说清楚适用场景、操作步骤和注意事项。你可以根据自己是生产服务器、测试机、还是容器化环境来选择。2.1 方式一dnf 一条命令装完适用于仅做本地测试、对版本不敏感、希望最快速度把 Redis 跑起来的场景。切换完源之后直接执行dnf install -y redis systemctl enable --now redissystectl enable --now的意思是一边设置开机自启一边立刻启动服务。装完以后查看状态systemctl status redis如果显示active (running)说明服务已经正常运行了。接着可以用redis-cli ping看到PONG返回安装就成功了。整个过程确实不到一分钟。这里有个容易被忽略的细节CentOS 8 用 systemd 管理 redis 服务时配置文件里的daemonize默认是no也就是 Redis 以前台进程的方式运行真正负责后台守护的是 systemd。这个机制本身没问题你不需要改成yes改了你反而会发现 systemd 和 redis 的进程管理出现冲突导致服务状态显示异常。2.2 方式二源码编译版本自己说了算适用于生产环境、需要指定 Redis 版本、希望目录可控、后续卸载也清爽的场景。编译安装的核心就几步装编译工具、下载源码、make、make install。先安装依赖dnf install -y gcc gcc-c make tar如果机器上没有安装下载工具顺手装一个wgetdnf install -y wget下载官方源码包。以 Redis 7.0.14 为例cd /usr/local/src wget https://download.redis.io/releases/redis-7.0.14.tar.gz tar zxvf redis-7.0.14.tar.gz cd redis-7.0.14进入目录后直接编译make编译过程会生成很多编译中间文件耐心等一会儿。编译完成后再安装到指定目录make install PREFIX/usr/local/redisPREFIX参数决定了 redis 二进制文件最终被安装到哪个目录。这里我刻意指定为/usr/local/redis后面卸载时只要删除这个目录就行不容易误删系统文件。安装完成后执行/usr/local/redis/bin/redis-server --version能看到版本号就代表编译安装成功。此时你可以使用绝对路径来启动也可以把redis-server、redis-cli等命令做一个软链接到/usr/local/bin目录省去每次打绝对路径的麻烦ln -s /usr/local/redis/bin/redis-server /usr/local/bin/ ln -s /usr/local/redis/bin/redis-cli /usr/local/bin/不过软链接这步可做可不做看个人习惯。编译安装的另一个好处是自带redis-benchmark、redis-check-rdb、redis-check-aof这些测试和修复工具不需要额外安装。对生产环境做压测或排查持久化文件问题时很有帮助。2.3 方式三Docker 容器化部署适用于机器上已经搭建好 Docker 环境、希望隔离部署、快速切换版本的场景。Redis 官方提供了 Docker 镜像拉取和启动都很直接docker pull redis:7.0 docker run -d --name redis-test -p 6379:6379 redis:7.0 --requirepass yourpassword注意最后面这个--requirepass是直接追加给 redis server 的启动参数效果等同于在配置文件里设置requirepass。这种方式适合快速测试但如果你要挂载数据目录、调整更多配置用-v挂载配置文件会更专业docker run -d --name redis-test -p 6379:6379 \ -v /etc/redis/redis.conf:/etc/redis/redis.conf \ redis:7.0 redis-server /etc/redis/redis.conf容器方式的好处是和宿主机环境天然隔离不受 CentOS 8 版本影响随便跑什么镜像。但生产环境一定要记得挂载数据卷否则容器一删RDB 快照和 AOF 日志全部没掉。综合来看三张方法的对比我放在下面安装方式版本可控性操作复杂度卸载难度适用场景dnf 安装低默认 5.0极低低快速测试、临时环境源码编译高任意版本中中目录清晰则简单生产环境、版本受限Docker 容器高镜像任意低低但要注意数据卷容器化环境、多版本切换个人建议如果是公司生产服务器不要偷懒老老实实编译安装目录规划和卸载路径都清晰出了问题也好排查。如果只是开发机快速验证dnf 或者 Docker 都行。3. 装完别急着用先把这几项配置改了不管是哪条安装路径Redis 安装完成后都存在一个同样的问题默认配置对生产环境来说太“裸”了。守护进程模式、日志位置、网络绑定、密码、持久化策略、内存上限这些如果不改早晚会踩到坑。编辑 Redis 配置文件。dnf 安装和编译安装的配置文件位置略有不同dnf 安装通常位于/etc/redis.conf源码编译安装时源码包里的redis.conf在redis-7.0.14/目录内需要你自己复制到统一配置目录比如/usr/local/redis/conf/redis.conf目录不一样没关系内容逻辑完全相同。3.1 守护进程模式与日志路径找到配置里的daemonizedaemonize yes前面刚说过如果用 systemd 管理服务这里保持no是正常的。但如果你是自己手动执行redis-server /path/to/redis.conf来启动就必须改成yes否则关闭终端窗口 Redis 就跟着退出了。这种根据启动方式决定配置的做法是很多人容易踩的坑。接着看日志配置logfile /var/log/redis/redis.log默认情况下logfile是空的日志直接输出到标准输出。手动启动时就是终端刷日志一旦关掉窗口日志也消失了。最好显式指定一个日志路径方便排查问题。修改后记得创建目录并确认 redis 账户有写权限。数据持久化目录也顺手改掉dir /var/lib/redis3.2 网络安全三件套bind、保护模式与密码Redis 的默认配置在安全方面比较保守但保守的姿势不代表绝对安全远程连接时常出现各种尴尬。先看bindbind 127.0.0.1 -::1这个配置表示 Redis 只监听本地回环地址外部机器连不上。如果你需要远程访问有两种做法把本机局域网 IP 或0.0.0.0填进去bind 0.0.0.0直接注释掉 bind 行不限制网络接口结合protected-mode保护。第一种更直观第二种要配合好保护模式。再来看protected-modeprotected-mode yesprotected-mode yes的含义是当 Redis 没有设置密码、且没有通过bind明确限定可访问网段时只允许本机链路loopback访问拒绝一切来自其他机器的外部连接。这个机制对新手非常友好但也会造成“明明配置了远程连接却始终连不上”的疑惑。所以标准做法是远程连接两个前提必须同时满足——设置密码并且bind 0.0.0.0或注释 bind 行。最后设置密码requirepass 改成你自己的强密码注意密码不要弱智比如123456这种就别往生产上放了。如果你用了 Redis 6 以上的版本还想用 ACL 做细粒度用户权限管理可以在配置文件底部加用户user default on nopass ~* all user app_user on app_password ~cache:* read writeACL 的完整规则比较复杂这里不展开先说结论默认情况下default用户通常需要配合requirepass使用如果你主动创建了新用户记得给相应命令类别授权否则会出现认证通过但命令被拒绝的奇怪现象。3.3 持久化策略RDB 与 AOF 的选择Redis 有两种持久化方式RDB 快照和 AOF 日志。RDB 是按时间间隔生成内存数据快照恢复速度快但可能丢最后一段数据。默认配置有类似这样的触发条件save 900 1 save 300 10 save 60 10000意思是 900 秒内至少有 1 个键变化就执行快照、300 秒内至少 10 个键变化就执行快照以此类推。AOF 是追加写日志每执行一条写命令就记录一条数据完整性更高但文件体积更大恢复速度相对慢一点。两种没有绝对好坏生产环境更稳妥的组合是两者同时开启appendonly yes appendfsync everysecappendfsync everysec表示每秒刷一次 AOF 日志到磁盘性能和可靠性比较平衡一般推荐这个值。如果你的业务对数据完整性的要求极苛刻可以改成always但写入性能会下降明显。3.4 内存上限与淘汰策略如果不设置maxmemoryRedis 会一直用内存直到操作系统 OOM进程直接被系统杀掉这在生产环境非常致命。按服务器真实内存适当分配maxmemory 512mb当内存达到上限后Redis 会根据maxmemory-policy决定谁先被淘汰。常用策略策略行为适用场景noeviction不淘汰任何键写命令直接报错数据不容丢失的业务allkeys-lru从所有键中淘汰最近最少使用的键纯缓存场景volatile-lru从设置了过期时间的键中淘汰最久未使用的键带过期时间的缓存allkeys-random随机淘汰任意键数据访问无规律、可容忍随机淘汰volatile-ttl优先淘汰剩余生存时间最短的键对时效性敏感的数据如果只是做缓存allkeys-lru是默认的第一选择。如果数据还承担了一部分持久化责任那尽量用volatile-*系列避免把不过期的业务数据淘汰掉。4. 验证安装从 redis-cli 到图形化客户端配置文件改完之后重启 Redis 让配置生效systemctl restart redis如果是手动启动的编译安装版本redis-server /usr/local/redis/conf/redis.conf4.1 本地验证三板斧第一板斧确认服务进程在跑systemctl status redis第二板斧本地直接用 redis-cli 连接并输出PONGredis-cli ping如果没设置密码直接返回PONG。设置了密码的话需要先认证redis-cli -a 你的密码 ping执行后终端大概率会出现一行警告Using a password with -a option on the command line interface may not be safe这是 Redis 在提醒你命令行输入密码会被记录到 shell history 里不用太慌本地测试这么操作没问题。正式脚本或者生产环境建议改用环境变量方式export REDISCLI_AUTH你的密码 redis-cli ping这样就不会出现明文密码告警。第三板斧看看内存和 key 数量是否正常redis-cli info memory redis-cli dbsizeinfo memory会输出内存分配器、峰值内存、碎片率等关键参数。dbsize返回当前数据库 key 数量刚装完应该是0。4.2 远程图形化管理工具怎么连远程连接是安装被验证后的另一个高频诉求。很多同学喜欢用图形化客户端我用过的两款比较多Redis Desktop Manager老牌工具后来商业化了免费版功能受限比较明显。Another Redis Desktop Manager一个开源替代品颜值在线、功能免费订阅和命令监控等基础功能好用了不少。连接之前服务器端必须确认Redis 配置文件里的bind已经允许外部访问protected-mode设置为no或者已经设置了密码防火墙放行 6379 端口云服务器安全组同样放行 6379 端口。防火墙命令firewall-cmd --permanent --add-port6379/tcp firewall-cmd --reload然后去图形化工具里填主机 IP、端口 6379、密码点连接即可。如果连不上优先检查上面四步这四条是远程连接失败的九成原因。5. 卸载 Redis 的三种场景与完整清理流程卸载的事很多人不重视觉得把包删了就行。实际上一套 Redis 环境落地之后残留的配置文件、数据文件、日志文件、系统用户、开机自启服务可能散布在多个目录里。如果不清理重新部署的时候很容易出现端口被占、配置残留导致诡异行为的情况。按照安装方式卸载步骤也分三种。5.1 场景一dnf/yum 安装的卸载先停服务、禁用开机自启systemctl stop redis systemctl disable redis接着卸载软件包dnf remove -y redis但dnf remove只删除软件包本身数据目录、日志目录、配置文件一般都会保留。这是 Linux 包管理器的设计逻辑卸载软件不等于删除用户数据。你需要手动检查这些位置ls -l /etc/redis.conf ls -l /var/lib/redis ls -l /var/log/redis如果确认没有需要保留的数据直接删除rm -rf /etc/redis.conf rm -rf /var/lib/redis rm -rf /var/log/redis有些版本还会创建独立的redis系统用户你也可以一并清理掉userdel redis5.2 场景二源码编译安装的卸载编译安装因为没有经过系统包管理器不提供集中的卸载命令得手动清理。但正因目录都是自己定的清理起来反而比包管理更清爽。先停掉进程pkill redis-server删除安装目录也就是当时PREFIX指定的目录rm -rf /usr/local/redis如果之前做了软链接到/usr/local/bin也要手动清除rm -f /usr/local/bin/redis-server rm -f /usr/local/bin/redis-cli rm -f /usr/local/bin/redis-benchmark rm -f /usr/local/bin/redis-check-rdb rm -f /usr/local/bin/redis-check-aof源码包留在/usr/local/src下的redis-7.0.14目录也可以一并删掉。配置目录、数据目录参考上文手动删除即可。5.3 场景三容器方式移除容器卸载最需要注意的反而不是容器本身而是数据卷。docker stop redis-test docker rm redis-test删除镜像docker rmi redis:7.0如果之前用-v挂载了宿主机目录作为数据卷那个目录里的 dump.rdb、appendonly.aof 不会随着容器删除而消失需要你确认是否需要保留后手动删除。5.4 卸载后的残留清理清单不管哪种方式卸载之后我都建议跑一遍下面的检查命令确保系统里没有 redis 残留痕迹which redis-server which redis-cli ps aux | grep redis ss -lntp | grep 6379 find /etc -name *redis* 2/dev/null find /var/log -name *redis* 2/dev/null find /var/lib -name *redis* 2/dev/null如果以上命令都干干净净没有输出说明卸载彻底了。特别注意ss -lntp | grep 6379如果发现端口仍在监听说明还有 redis-server 进程没有杀掉继续排查进程来源。6. 实测中高频踩坑记录虽然安装、卸载看起来不难实际操作中我确实踩过不少坑有些坑甚至藏得很深。把高频的几个记录下来你遇到同样问题时可以直接按图索骥。6.1 镜像源仓库报错的完整排查这是 CentOS 8 装 redis 最典型的问题。常见报错有No match for argument: redisErrors during downloading metadata for repository appstream: Status: 404Cannot prepare internal mirrorlist: No URLs in mirrorlist排查链路如下第一步确认系统版本cat /etc/redhat-release第二步检查源配置文件内容cat /etc/yum.repos.d/CentOS-*.repo看baseurl是否还在指向mirror.centos.org。如果是基本就是源失效了。第三步按本文第一章的方式替换成阿里云存档源或者直接修改 baseurl 指向vault.centos.orgsed -i s/mirror.centos.org/vault.centos.org/g /etc/yum.repos.d/CentOS-*.repo sed -i s/^#baseurl/baseurl/g /etc/yum.repos.d/CentOS-*.repo sed -i s/^mirrorlist/#mirrorlist/g /etc/yum.repos.d/CentOS-*.repo这三条 sed 命令的作用是把源地址统一改为 vault 存档地址启用原本注释的 baseurl 行注释掉已失效的 mirrorlist 行。执行完再dnf clean all dnf makecache。这一步做完大部分源报错都能解决。6.2 编译时报错缺 make 或缺 gcc编译安装 Redis 时有的机器上执行make直接报make: gcc: Command not found或者make: ** No targets specified and no makefile found.前者说明没装 gcc后者往往是你没有执行cd redis-7.0.14就启动了make或者解压后目录没切换进去。解决办法很简单先在源码目录执行make distclean把上次编译产生的中间文件清干净然后重新检查依赖dnf install -y gcc gcc-c make make6.3 连接被拒绝bind 与 protected-mode 的坑本机用 redis-cli 连没问题但开发机、笔记本上的图形客户端就是连不上大概率是 bind 和 protected-mode 的问题。排查链路ss -lntp | grep 6379看看监听的地址是127.0.0.1:6379还是*:6379或0.0.0.0:6379。如果只有127.0.0.1那就是 bind 限制了。修改bind 0.0.0.0之后重启 Redis。如果监听已经是0.0.0.0还是连不上再确认是否设置 requirepass并检查 protected-mode。有时候你在配置文件里设置了 requirepass又设置 protected-mode yes某些老版本客户端认证流程不标准也会出现连接被拒。防火墙和安全组的检查前面说过了这里不重复。6.4 端口被占用的定位方式卸载后想重新装 Redis结果启动时报Address already in use说明 6379 端口还在被某个进程占用。用这条命令找出占用进程ss -lntp | grep 6379如果显示的是旧的 redis-server 进程用kill加上进程 PID 结束它kill -9 进程PID如果不是 redis 进程占用那就说明有其他程序也在用 6379需要评估是换端口还是处理原有进程。注意kill -9属于强杀生产环境使用前确认一下进程是否可以安全退出。7. 后面还能做什么从单机 Redis 到主从环境装好、卸载好之后还有两件事是顺理成章的延伸一是配置主从复制二是把数据备份机制建立起来这些在高并发业务里都会用到。7.1 最小化的主从配置思路Redis 主从复制在配置层面其实非常简单。假设两台机器A 是主节点B 是从节点从节点配置文件里加两行replicaof 主节点IP 6379 masterauth 主节点密码然后在从节点启动 Redis它就会自动从主节点同步全量数据之后持续接受增量同步。主节点只需要设置requirepass 主节点密码重启主从节点后在从节点上执行redis-cli info replication如果看到role:slave或新版本里的role:replica以及master_link_status:up说明主从已经搭建成功。这个玩法在单机应用跑通之后可以很自然地延伸到读写分离场景。7.2 数据备份与迁移小建议很多人的 Redis 备份方式只是“把 dump.rdb 拷一份”这也不错但更稳妥的是使用 Redis 自身的同步机制。手动触发一次 RDB 快照redis-cli BGSAVEBGSAVE是后台异步生成快照不会阻塞主进程。然后去配置的dir目录下找到 dump.rdb 备份起来。如果要把数据迁移到另一台机器最省事的是用redis-cli --rdb直接导出redis-cli -a 密码 --rdb /tmp/dump_export.rdb生成的 rdb 文件拿到目标机器上启动即可。这只是迁移手段之一如果数据量大更推荐主从复制做全量同步然后切换主节点这样能尽量缩短业务中断时间。我在实际项目中见过太多“装完就跑”的状态线上 Redis 连密码都没有数据也没做持久化一旦机器重启整个缓存数据归零。如果你读完这篇打算在生产环境动手至少把章节 3 里的网络安全三件套和持久化配置先落实再考虑别的花活。
返回列表