ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux下Redis启动与配置实战:从安装到排障全解析

Linux下Redis启动与配置实战:从安装到排障全解析 前两天一个同事跑过来跟我诉苦说他在新机器上装好了Redis执行redis-server明明显示服务起来了可换一台机器用客户端连就是不通折腾了一下午愣是没搞定。我过去一看配置里还是默认的bind 127.0.0.1protected-mode也开着Redis只监听在本机回环地址上远端当然连不进来。这种场景我见得太多太多了。说句实在话Linux下启动Redis本身就是一个动作的事情但启动背后牵扯的环境检查、配置理解、权限处理、网络放开、日志排障才是真正让人卡壳的地方。这篇就专门聊聊Linux下启动Redis这件事。我会从最前面的环境准备开始讲清楚安装与配置的关键参数再逐步演示启动、验证、停止这个完整闭环最后把启动失败最常见的几类情况拎出来逐个拆解。不管你是在Ubuntu、CentOS还是其他主流发行版上操作只要照着走一遍基本不会再被启动Redis这种基础问题绊住。适合刚入行的运维、后端开发以及准备在自己的Linux服务器上部署一套Redis做缓存或中间件的独立开发者。1. 环境准备与安装先让redis-server命令出现1.1 动手之前先确认系统里有什么我习惯在装任何东西之前先看一眼环境。不是谨慎过度而是很多启动失败的根子其实埋在安装阶段。先查系统发行版和内核版本用一条命令就能看出来cat /etc/os-release uname -a发行版不同包管理器不同安装方式和后续服务管理方式都有差异。Ubuntu和Debian走aptCentOS、Rocky走yum或dnf这些差异直接决定了你装Redis是用现成仓库还是源码编译。接着确认编译工具链是否可用因为后面大概率要走源码编译这条路gcc --version make --version如果系统里压根没有gcc源码编译的第一步就已经跪了。CentOS最小化安装经常不带完整的编译工具组需要先执行yum install -y gcc makeUbuntu下则是apt install -y build-essential还有一个容易被忽略的检查项端口占用。Redis默认跑在6379端口如果这台机器上之前装过Redis或者别的服务占了这个端口启动时必然报错。提前查一下总没坏处ss -lntp | grep 6379没输出说明端口干净可以直接用。1.2 源码编译安装最稳妥的路径我个人的建议是如果机器网络条件允许优先用源码编译安装。原因有几个一是官方发布的新版本特性包管理器仓库经常滞后大半年二是源码安装可以自己指定安装目录、配置编译参数对生产环境更可控。从Redis官网下载最新稳定版源码包当前主流还是7.x系列选tarball格式就行wget https://download.redis.io/releases/redis-7.0.15.tar.gz tar xzf redis-7.0.15.tar.gz cd redis-7.0.15 make这里有个细节执行make之后编译产物redis-server和redis-cli是在src子目录下的。但很多人习惯直接全局使用redis-server这个命令所以还需要一步安装make installmake install默认会把二进制装到/usr/local/bin目录下输入which redis-server就能确认路径。这一步做完redis-server命令在任何目录下都能直接用了。我记得自己在第一次源码编译时犯过一个低级错误make报错说找不到jemalloc我当时不知道Redis默认内存分配器用的是jemalloc直接改成make MALLOClibc绕过去了后来发现性能上确实有一点细微差异。虽然不影响功能但后续我规范了编译流程尽量保持默认参数。顺带提一下如果是老机器或者只做简单测试编译过程两分钟左右就结束了。编译完成后可以顺手跑一下内置的测试用例make test这条命令会执行大概几十个测试场景全部通过基本说明编译产物没问题。不过这个步骤会花几分钟时间赶时间的时候可以跳过。1.3 包管理器安装与Docker方式的取舍源码编译虽然推荐但也不是唯一路径。用系统包管理器安装的最大优势是省事、升级方便、和系统集成度高。Ubuntu/Debian下执行apt update apt install -y redis-serverCentOS/Rocky下如果默认仓库里有可以直接装但很多情况下默认仓库没有Redis需要先启用EPELyum install -y epel-release yum install -y redis装上之后Redis的二进制、配置文件、systemd服务脚本全都自动放好了用systemctl start redis就能启动非常顺手。但是有一个坑我必须提醒系统仓库里的Redis版本不一定新有些老发行版甚至会给你装一个3.x或者4.x的版本。这些老版本没有新版的一些特性和性能优化如果业务对功能版本有要求老老实实走源码安装更稳妥。至于Docker方式很多人现在喜欢用docker run -d --name redis -p 6379:6379 redis一行命令拉起来一个实例。这个思路本身没问题但要注意它启动的是一个容器内的隔离环境没有systemd管理、没有系统级日志、持久化配置要自己挂载卷。在开发环境里随便用用可以生产环境还是建议至少用docker compose把配置和存储安排好。这个话题展开也是长篇本文重点还是聚焦在纯Linux环境下的原生操作。2. 启动前的配置必修课把配置文件吃透再动手2.1 配置文件在哪里怎么找用redis-server直接启动它用的是内置的默认配置监听在127.0.0.1没有密码数据默认不落盘。这种状态跑个redis-cli ping都能通但稍微接入真实业务就会出问题。生产习惯是先准备一份配置文件再启动。源码编译安装的配置文件在解压目录下的redis.conf。make install之后这份配置并不会自动复制到系统目录需要手动安排mkdir -p /etc/redis cp /usr/local/src/redis-7.0.15/redis.conf /etc/redis/redis.conf用包管理器安装的话配置文件一般已经在/etc/redis/redis.conf了不需要额外操作。另外别忘了配置文件里很多路径相关的参数使用的是相对路径如果修改了运行目录日志、持久化文件这些就容易找不到位置。所以启动之前把配置里的路径都梳理一遍是必要的。2.2 必须手动确认的核心参数打开配置文件后有几个参数我每次都会手动检查不看一遍心里不踏实。第一个是daemonize。这个参数决定Redis是前台运行还是后台守护进程。开发环境里我想在前台挂着看日志会设成no然后配合终端输出生产环境必须设成yes否则服务一断连终端就跟着退了daemonize yes与daemonize相关的还有一个supervised参数如果用了systemd管理Redis建议设成systemd这样Redis和systemd之间的状态通知是标准的。这个细节后面讲systemd时还会展开。第二个是bind。这个参数控制Redis监听在哪些网络接口上。默认是127.0.0.1只允许本机访问。如果Redis和应用部署在同一台机器上这没问题安全性也最好。但如果应用在别的机器需要改成本机内网IPbind 0.0.0.00.0.0.0代表监听所有网卡接口包含公网。用这个配置就意味着任何人都能摸到你的Redis端口所以我一般会配合防火墙限制来源IP并立刻开启密码。测试环境图省事没问题生产环境千万别裸奔。第三个是protected-mode。这个参数和bind是联动的默认值是yes意图是当Redis没有设置密码、且bind了非本机接口时拒绝来自外网的连接。有时候这不方便但我不建议关掉它。要做的应该是先设置密码再让protected-mode保持开启这样既安全又不出幺蛾子。还有密码参数requirepass生产环境必须设置。这里有个常见教训密码里尽量别带$、!这类特殊字符否则在systemd配置或者命令行里经常会因为转义问题引发诡异问题。用一长串字母加数字反而最稳妥requirepass Redis_Test_2024除了这些基础参数还有几个涉及数据和资源的参数要关注port 6379 logfile /var/log/redis/redis.log dir /var/lib/redis maxmemory 2gbdir指定RDB快照和AOF日志的写入目录这个目录必须存在且Redis进程有写权限否则持久化会静默失败。maxmemory设置实例的最大内存占用到了上限后按照maxmemory-policy定义的策略淘汰数据。这些参数不一定每次启动前都改但在生产初始化时必须确认一遍。2.3 前台启动还是后台守护很多人分不清daemonize yes和直接在终端后面加的区别。前者是Redis自己调用fork把进程放到后台父进程退出终端不再占用后者是Shell层面的后台运行虽然命令返回了但进程的标准输出、标准错误仍然连着终端一旦SSH会话断开进程大概率收到挂断信号。写个直观的对照启动姿势进程行为终端断开影响适用场景redis-serverdaemonize no前台占用终端直接终止开发调试redis-server 后台运行但输出绑定终端可能被挂断信号干掉临时使用redis-server redis.confdaemonize yes完全后台化不受影响生产环境所以生产环境我只推荐用daemonize yes的配置启动或者更标准一点用systemd启动。后面我会专门讲systemd的写法。3. 启动、验证、第一次交互把Redis真正跑起来3.1 三种启动姿势对应的命令配置文件准备完毕后启动就很简单了。最标准的做法是指定配置文件启动redis-server /etc/redis/redis.conf如果配置文件内部没有设置daemonize yes这条命令会一直挂着终端输出启动日志。想让它回终端要么在配置里改了要么用下面的方式redis-server /etc/redis/redis.conf --daemonize yes命令行参数优先级高于配置文件这条命令执行后会快速返回Redis在后台运行。我平时调试时常用这种方式验参数因为它不用反复改配置文件。还有一种姿势是把配置写在命令行里。适合紧急做个一次性测试比如临时指定端口和密码redis-server --port 6380 --requirepass temp_pass这种方式不建议作为长期方案因为参数一旦多起来命令行可读性极差而且进程重启后还得重新输入一遍纯粹是给自己找罪受。3.2 检查Redis是否真的活着执行完启动命令后很多人的习惯是看一眼终端有没有报错然后就当它跑起来了。我建议养成三步验证的习惯。第一步确认进程存在ps -ef | grep redis-server正常会看到类似这样的输出主进程和子进程都在说明进程层面是活的redis 12345 1 0 10:30 ? 00:00:00 /usr/local/bin/redis-server 0.0.0.0:6379第二步确认端口监听正常ss -lntp | grep 6379看到LISTEN状态且IP不是127.0.0.1而是实际绑定的地址说明网络层已经就绪。第三步用客户端实际PING一下。这是最直接的功能验证能通就说明整个服务栈没问题redis-cli -h 127.0.0.1 -p 6379 ping没有密码时返回PONG。设置了密码的必须先认证redis-cli -h 127.0.0.1 -p 6379 -a Redis_Test_2024 ping-a这种方式会在命令行暴露密码进程列表里能看到所以也可以先进客户端再在交互环境里执行AUTH命令。3.3 用redis-cli做第一次数据交互验证连通后顺手做点数据读写测试是很有必要的既能确认服务可用也能顺带熟悉基础命令。Redis的数据类型并不复杂核心就五种String、List、Hash、Set、Sorted Set。第一次交互从最简单的String开始就够了redis-cli -h 127.0.0.1 -p 6379 -a Redis_Test_2024 set site_name example.com redis-cli -h 127.0.0.1 -p 6379 -a Redis_Test_2024 get site_name第一行写入一个键第二行读取出来。返回example.com说明读写链路是通的。再试一下Hash类型这个在实际业务里用得非常多适合存对象数据redis-cli -h 127.0.0.1 -p 6379 -a Redis_Test_2024 hset user:1001 name zhangsan age 28 redis-cli -h 127.0.0.1 -p 6379 -a Redis_Test_2024 hgetall user:1001能看到name、zhangsan、age、28四行输出说明Hash结构工作正常。这里多说一句很多人在客户端操作时遇到NOAUTH Authentication required错误不用慌这就是没执行AUTH导致的。记住用密码认证后再操作即可。4. 停止服务与启动失败排查遇到问题不慌张4.1 优雅关闭Redis的几种姿势停止Redis比我预想的更容易出问题。直接kill -9是最粗暴的方式会导致内存中的数据来不及持久化到磁盘极端情况下还可能损坏RDB文件。所以我一直强调要优雅关闭。最规范的关闭方式是在客户端里执行redis-cli -h 127.0.0.1 -p 6379 -a Redis_Test_2024 shutdownRedis会执行一次完整的持久化流程然后正常退出。这种方式优先推荐。如果担心shutdown因为网络或认证问题执行失败可以先确认客户端能连上再执行。还可以通过shutdown nosave跳过持久化快速退出但这个命令会丢弃内存中的未持久化数据使用时想清楚。如果用systemd管理Redis直接systemctl stop redis这里面的逻辑是systemd调用redis-cli shutdown效果一样优雅。还有一点值得注意Redis主进程收到SIGTERM信号时也会尝试优雅退出。所以kill 进程ID不带-9也是可以接受的停止方式只要给足时间让它完成退出清理。4.2 启动失败的典型场景与对策Redis启动失败常见的原因其实就那么几类。我按踩雷频率排个序第一类端口已被占用。报错信息里有bind: Address already in use说明6379端口被其他进程占着。解决办法是先查占用源ss -lntp | grep 6379确认是旧的Redis实例还是别的程序按需处理。第二类权限不足。Redis进程在写日志文件或持久化目录时没有写权限启动会直接失败。报错里常见Cant open the log file: Permission denied或者Cant open the appendonly file。解决思路是确认运行Redis的系统用户对日志文件和dir目录拥有写权限比如把目录属主改成redis或者调整目录权限。第三类配置语法错误。老版本Redis对未知指令的处理比较宽松但新版会直接报Bad directive or wrong number of arguments后退出。解决办法是用Redis自带的配置检查工具redis-server /etc/redis/redis.conf --test-memory 1严格来说--test-memory是测试内存的但我更常用的是redis-server /etc/redis/redis.conf看它启动时有没有直接报配置错误。新版还提供CONFIG SET命令支持运行时修改部分配置但配置项不能任意改最好先改配置文件再重启。第四类内存设置问题。有些内核参数限制了大内存分配Redis启动时会提示WARNING overcommit_memory is set to 0! Background save may fail under low memory condition.这个只是WARNING服务还能启动但为了让Redis在低内存条件下能正常执行后台持久化建议把内核参数调一下sysctl vm.overcommit_memory1写入/etc/sysctl.conf可以永久生效。这类系统级调优生产环境要趁早做。4.3 启动日志怎么看遇到启动失败最直接的办法是看日志。Redis默认在终端打印启动信息但如果设置了logfile日志全部写入文件里。日志文件默认级别是notice想看更细的可以调整loglevel debug。我整理了一个排查速查表基本覆盖了启动阶段最常见的报错报错信息根因处理动作Address already in use6379端口被占用找占用进程或换端口Permission denied日志/数据目录无写权限修改目录属主或权限Bad directive or wrong number of arguments配置文件参数写错逐行检查可疑配置项Cant open the log file日志目录不存在提前创建目录并授权Cant open the config file配置文件路径不对确认路径后再启动MISCONF Redis is configured to save RDB snapshots持久化失败检查磁盘空间与dir目录权限顺手提一个容易被忽略的细节redis-server后面如果不跟配置文件路径它默认使用编译时的内置默认配置而不是/etc/redis/redis.conf。很多新手以为sudo systemctl start redis启动的就是自己改过的配置其实systemd服务脚本里明确指定了配置路径如果你改了别处的副本它压根不会读。排查问题前先把哪个配置在生效这件事搞清楚。5. 进阶让Redis的启动管理更规范5.1 用systemd把Redis纳入服务管理启动Redis的方法我可以写十种但生产环境最推荐的只有一种systemd。它解决了进程守护、开机自启、崩溃自动拉起、日志统一管理等问题比手动后台运行省心太多。使用包管理器安装的Redis一般自带systemd服务文件源码编译安装的需要自己写一个。/etc/systemd/system/redis.service内容大致如下[Unit] DescriptionRedis In-Memory Data Store Afternetwork.target [Service] Typesimple Userredis Groupredis ExecStart/usr/local/bin/redis-server /etc/redis/redis.conf ExecStop/usr/local/bin/redis-cli -a Redis_Test_2024 shutdown Restartalways RestartSec3 [Install] WantedBymulti-user.target写这个服务文件时有几个细节Typesimple意味着systemd认为进程启动完成就算服务就绪。如果想让systemd检测到可接受连接才算就绪可以用Typenotify但需要Redis配置里设置supervised systemdRedis会主动通知systemd启动完成。Restartalways告诉systemd只要进程异常退出就自动拉起。这一点在生产环境非常实用进程被误杀或者内存崩溃时能快速恢复。服务文件写好后依次执行systemctl daemon-reload systemctl enable redis systemctl start redisenable把服务加入开机自启列表start立即启动。查看状态用systemctl status redis能看到Active: active (running)就是正常的。用systemd管理后日常运维操作变成统一的三板斧systemctl restart redis systemctl stop redis systemctl status redis我以前一直觉得系统服务管理工具不如自己写脚本灵活实际用了systemd之后只觉得真香。日志直接通过journalctl -u redis查看不用再单独tail日志文件排查问题的效率高了一截。5.2 安全基线别让启动的Redis裸奔在公网这个话题说起来有点老生常谈但每次看到网上有人把Redis暴露在公网上被勒索的案例我都想多唠叨两句。启动Redis本身是白的但启动完之后暴露在网络上就成了灰的。安全基线我列几条最低要求第一条不能裸奔无密码。requirepass必须配置密码强度别太弱。第二条绑定指定网卡。如果Redis只给内部服务用bind写内网IP不要图省事写0.0.0.0。如果必须跨网段访问用云安全组或iptables白名单把来源IP限制住。第三条危险命令重命名或禁用。Redis的KEYS、FLUSHALL这些命令在公网环境下极其危险一条FLUSHALL就能清空整个实例。在配置里可以对它们做重命名rename-command KEYS rename-command FLUSHALL 把命令重命名成空字符串等于禁用。这样做的前提是业务方确实不需要这些命令否则改成一段复杂的隐蔽字符串就好。还有一个官方提供思路在配置里开启protected-mode yes并设置密码这样即使bind了外网接口未认证的连接也会被拒绝。5.3 可视化工具与更上一层的使用场景启动验证完了很多人还会问一嘴有没有图形化工具可以直观地管理Redis有而且不少。关键词里就有redis desktop manager、another redis desktop manager这两个是目前社区里热度比较高的。它们本质上都是通过RESP协议连接Redis查看键值、执行命令、监控内存都方便适合不习惯纯命令行操作的读者。连接时填上服务器IP、端口、密码就能连跟命令行客户端连的是同一套东西。但我也想说清楚工具再怎么方便底层该懂的命令还是得懂。因为工具偶尔出问题最后兜底的一定是命令行。把Redis启动、配置、验证、排障这一套流程走通之后你其实已经拿到了Redis这扇大门的钥匙。往深处走Redis的分布式锁、缓存治理、主从复制、哨兵架构、集群模式全都建立在服务能启动、进程能通信这个基础之上。平时面试里被问到的Redis数据类型应用场景、缓存穿透与击穿处理、分布式锁的原子性与续期问题背后也都是先有一个能稳定运行的Redis实例再谈各种高级玩法。我个人在实际操作中的感受是启动Redis是最简单的一步也是最容易被忽视的一步。很多人喜欢先跑起来再说遇到问题再回头翻配置结果往往是排查过程比正常启动多花十倍时间。与其这样不如动手前把daemonize、bind、requirepass这些关键参数想清楚。另外再分享一个小技巧生产环境的Redis配置永远要保持最小化授权原则密码定期更换日志定期轮转端口保持最小暴露面——这些都做到了后面的坑会少很多。
返回列表