ARTICLE DETAIL

资讯详情

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

Linux安装Redis完整指南:源码编译、配置优化与生产环境排查

Linux安装Redis完整指南:源码编译、配置优化与生产环境排查 Linux安装redis的完整实操指南写这篇东西的念头很简单。群里隔三差五就有朋友问“Linux下Redis怎么装”“装好了连不上是怎么回事”网上教程很多但大部分要么只给命令不给原因要么写得云里雾里照着抄都容易翻车。我自己从大厂到小团队摸爬滚打这些年Redis装了没有一百次也有几十次踩过的坑攒了不少。干脆把完整的安装流程、配置细节、坑点和排查思路一次说清楚覆盖从零开始到稳稳跑起来的全过程主要是面向Linux服务器上用Redis做缓存、队列和中间件的场景。不管是刚入行的运维、写业务代码要自测的研发还是想系统补一补这块知识的同学照着这篇走一遍基本能做到心里有数、手里不慌。1. 这件事到底怎么做的先说清楚整体思路很多人一上来就敲命令装完发现各种问题根本原因是对整个安装逻辑缺一个整体的认知。装Redis本身不难难的是装完以后它能不能按你的预期稳定运行、安全可用。所以动手之前先把思路捋顺。1.1 为什么推荐源码编译安装而不是包管理器有个问题我几乎每次带人都会遇到你到底该用apt install redis-server还是源码编译如果你只是在本地做开发测试包管理器确实方便一条命令装完自动注册服务连systemctl start redis都给你配好了。但生产服务器我强烈建议源码编译安装原因有三第一版本控制权。apt源里的Redis版本往往不是最新的有些还是老旧版本而Redis的版本迭代带来了大量性能和安全上的优化比如6.0引入的多线程IO、7.0引入的multi-part AOF。你买一台新服务器没道理一上来就用一个过时版本。第二编译参数可控。源码编译可以指定安装路径、指定编译优化级别还能启用或禁用某些模块比如后续要挂RedisBloom这类扩展就必须源码编译。第三对系统依赖最小。包管理器会自动拉一堆不一定需要的依赖源码编译只有一个gcc工具链的要求干净利落出问题时排查面也小。1.2 安装前的三个关键认知先花三分钟说清楚三件事后面操作你会顺手很多。第一Redis本质上就是一个C语言写的高性能键值存储程序。这意味着它的“安装”和普通软件类似无非是拿到源码包用C编译器把它编译成可执行文件再配上配置文件运行起来。第二Redis的运行依赖系统配置而非二进制本身。真正决定它能不能对外服务、能抗多大并发、数据能不能持久化的都是redis.conf里的参数和操作系统的几项内核参数。所以“安装”这个动作只占20%的精力剩下80%都在“配置”。第三Redis安装过程分为下载、编译、安装、配置、启动、验证六个阶段每个阶段都有独立的坑。下面我按照这个流程一点一点拆你照着走基本不会出大问题。2. 动手之前环境准备和细节确认不少教程都默认读者手里已经有一台配置好的Linux服务器但实际不是这样。环境检查这一步做扎实后面能省掉至少一半的麻烦。2.1 检查你的Linux环境和基础工具链先确认系统版本和架构这一步决定你下载哪个Redis源码包以及是否有兼容性问题cat /etc/os-release uname -mx86_64是绝大多数云服务器的标准架构aarch64是ARM架构。新版本Redis对两者都支持得很好但某些老版本在ARM上的表现会有差异建议直接上最新稳定版本。然后检查编译工具链gcc -v如果系统提示command not found就需要先安装依赖。CentOS系用yumDebian/Ubuntu系用apt# Debian/Ubuntu apt update apt install -y gcc make # CentOS/RHEL yum install -y gcc make这里有个常见的坑某些精简安装的Linux发行版连tar或者wget都没有建议顺手一起装掉。apt install -y tar wget # 或 yum install -y tar wget2.2 Redis版本怎么选稳定版还是最新版Redis官网https://redis.io/download/的下载页只放稳定版一般标注为Stable的就是我们生产环境该选用的版本而带有RC字样的属于候选版本功能可能有变动性能也没经过大规模验证不适合直接用于生产。以目前的情况来说7.2.x属于非常稳定的版本线7.4.x是大力推荐的当前主力版本。8.x系列如果有新特性吸引你也建议等小版本迭代几个补丁再上生产。判断版本是否可信的方法很直接看下载页的版本号是否为偶数小版本比如7.2、7.4看发布日志的补丁说明一般连续维护半年以上的版本比较成熟我个人的习惯是捡最新稳定版的大版本用装完把redis-cli -v显示出来的版本号记下来写在部署文档里方便后续统一管理。版本选择这件事真的别将就新版Redis不仅性能更好安全性修复也更完整。3. 核心实操从下载到一次跑起来的完整流程这块是全文的重头戏所有命令我都实际跑过注释也是从真实业务角度写的你拿到服务器上可以直接执行。3.1 下载解压版本号别乱改到官网下载页复制最新稳定版的源码包下载链接然后在服务器上执行cd /opt wget https://download.redis.io/releases/redis-7.4.1.tar.gz tar xzf redis-7.4.1.tar.gz cd redis-7.4.1/opt是Linux下安装第三方软件的惯例目录你也可以按团队规范放在/usr/local/src或者/home下但建议统一别今天这个路径明天那个路径后面维护脚本时会很痛苦。有个细节下载完先校验文件完整性。官网页面会给SHA256校验值用sha256sum redis-7.4.1.tar.gz比对一下防止下载损坏或被篡改。这一步很多人跳过但如果是内网环境通过代理下载文件损坏的概率并不低。3.2 编译安装gcc那关怎么过在源码目录下执行编译make如果一切顺利编译完会在src/目录下生成redis-server、redis-cli等可执行文件。但很多新人在这一步会卡住报错信息各式各样。最常见的两种第一种是gcc版本太低。老版本CentOS 7自带的gcc 4.8.5编译Redis 6以上的源码会报struct相关错误。解决办法是安装高版本gcc比如yum install -y centos-release-scl yum install -y devtoolset-8-gcc scl enable devtoolset-8 bash第二种是内存不足。云服务器如果只有512M内存make过程中可能直接报internal compiler error: Killed。临时用make -j1降并发或者加个swap分区再编译。编译完成后执行安装make install PREFIX/usr/local/redis这里PREFIX是标准的安装路径参数指定了它之后可执行文件会被放到/usr/local/redis/bin下面你还可以顺手把目录加进PATH不用每次敲完整路径echo export PATH/usr/local/redis/bin:$PATH /etc/profile source /etc/profile这一步做完执行redis-server -v能输出版本号说明编译安装成功。3.3 配置文件的三个必改项和七个可选项源码目录里自带一个redis.conf这是Redis运行时的总开关。官方默认配置只适合“能跑起来”不适合“跑得稳、跑得安全”所以安装完第一件事就是调整配置。先把它复制到统一的位置mkdir -p /usr/local/redis/conf cp redis.conf /usr/local/redis/conf/然后按实际需求修改。以下三个参数是我认为必须改的不改会出事第一项daemonize改为yes。默认是no也就是前台运行你一关终端Redis就跟着“陪葬”了。改成yes后Redis以守护进程方式在后台跑daemonize yes第二项bind指定监听地址。默认只绑定127.0.0.1也就是只有本机能连。如果想让局域网内其他机器访问需要改成服务器的内网IPbind 0.0.0.0注意0.0.0.0表示监听所有网卡接口方便但风险也大配合后面的requirepass使用才是完整的方案。第三项protected-mode保持yes。这个默认就是开启的如果设成noRedis会拒绝没有密码的访问。安全底线别动它。除了这三个必改项以下可选项根据业务按需调整参数默认值建议值作用说明port63796379改端口能减少无差别扫描攻击但影响不大requirepass空强密码设置访问密码必开maxmemory不限制物理内存的60%~70%防止Redis把整台服务器内存耗尽maxmemory-policynoevictionallkeys-lru内存满时的淘汰策略缓存场景用这个appendonlynoyes开启AOF持久化防丢数据timeout0300客户端空闲超时防连接占满logfile空/var/log/redis.log记录运行日志排查问题必须有dir.//var/lib/redis持久化文件存放目录顺手解释一下maxmemory-policy里那个allkeys-lru意思就是Redis内存满了之后优先淘汰最少使用的key这是大多数缓存场景的正确姿势。如果你拿Redis当队列用那可能得改成noeviction或volatile-ttl这个后文详解。配置写完记得做个“语法检查”Redis很贴心地提供了这个命令redis-server /usr/local/redis/conf/redis.conf --test-memory不过--test-memory主要用于检测内存硬件问题配置检查其实直接把redis-server拉起来看日志就行。3.4 把Redis交给systemd托管既然安装了完整版系统就不要再自己redis-server redis.conf 这样裸启动了。用systemd管理开机自启、异常退出自动拉起、日志统一收集都方便。先创建服务文件vim /etc/systemd/system/redis-server.service内容如下[Unit] DescriptionRedis Server Afternetwork-online.target Wantsnetwork-online.target [Service] ExecStart/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf ExecStop/usr/local/redis/bin/redis-cli -a 你的密码 shutdown Restartalways Userredis Groupredis UMask0077 [Install] WantedBymulti-user.target因为涉及密码写进服务文件记得把文件权限收紧chmod 640 /etc/systemd/system/redis-server.service然后创建独立运行的普通用户redis绝不建议用root跑Redis万一被人利用提权风险很高useradd -M -s /sbin/nologin redis mkdir -p /var/lib/redis /var/log chown -R redis:redis /usr/local/redis /var/lib/redis最后重载systemd并启动systemctl daemon-reload systemctl enable redis-server systemctl start redis-server systemctl status redis-server这一套下来Redis就变成了Linux系统原生的服务组件重启机器不用管它自己会跟着起来。注意ExecStart里面指定了配置文件路径意味着修改redis.conf后需要systemctl restart redis-server而不是直接重启进程否则可能拉起一个没有配置的新实例。3.5 启动验证和自检清单启动完先来一发最简单的验证用Redis自带的命令行工具redis-cli -a 你的密码 ping如果配置正确会返回PONG。接下来快速验证缓存写入redis-cli -a 你的密码 set name test-value redis-cli -a 你的密码 get name到这里一个最基本可用的Redis实例就真真正正跑起来了。但我建议把下面这份自检清单也过一遍很多“装好了但莫名其妙出问题”的场景都是这几个基础项没过ss -lntp | grep 6379确认端口在监听systemctl is-enabled redis-server确认开机自启redis-cli -a 密码 info memory | grep used_memory_human确认启动后内存占用正常重启一次系统或者systemctl restart redis-server确认服务能自动拉起。4. 遇到问题别慌真实环境里的排查实录装多了你就知道真正困难的部分全是出问题时怎么定位。这里把最常见的几类问题整理成表附带排查思路和源码级原因解释。4.1 编译阶段报错速查表报错信息根本原因解决办法error: unknown type name u_int64_t老Linux版本缺失数据类型定义编译前加export CFLAGS-D_GNU_SOURCEzmalloc.c:50:31: fatal error: jemalloc/jemalloc.h缺少内存分配器头文件安装jemalloc或用make MALLOClibcYou need tcl 8.5 or newer in order to run the Redis test只是make test的报错不影响编译安装忽略或装tclcc: internal compiler error: Killed编译时内存不足make -j1单核编译必要时加swap补充一下make MALLOClibc的原理Redis默认用jemalloc作为内存分配器这套东西对高并发、碎片化场景优化很好但如果你编译时系统里没带它的开发头文件直接退回到标准C库的malloc也能正常工作。生产环境还是尽量把jemalloc装上内存碎片率会明显不一样。4.2 启动和连接问题为什么装好了却连不上前十次装Redis的人里至少有七八次会折在这一关。连不上时先检查启动状态然后沿链路拆解。systemctl status redis-server cat /var/log/redis.log接下来按照下面这套排查顺序走基本不存在漏网之鱼第一步看端口监听。ss -lntp | grep 6379看不到输出说明没起来回头查配置和日志。有输出但IP是127.0.0.1:6379说明bind还是默认值外部连不上。只有0.0.0.0:6379才表示对所有网卡开放。第二步看防火墙。CentOS系常见systemctl status firewalld阿里云、腾讯云这类云服务器除了系统防火墙还有安全组规则两个都放行6379端口才能真正对外使用。第三步看Redis保护模式。日志里面如果出现Warning: no config file specified, using the default config或者客户端报DENIED Redis is running in protected mode是protected-mode在起作用。官方设计思路是既然你没设密码也没指定bind说明你有极大可能把它暴露在公网上了那我先拒绝一切请求保平安。要么设密码推荐要么明确bind内网IP。第四步验证密码。命令行敲了登录命令没带密码或密码错了会报NOAUTH Authentication required。高版本Redis会额外显示警告告诉你越来越强的密码策略是必然趋势。这个排查链路我画不出来图但记忆口诀配好了先看系统、再看绑定、再查密码、最后才怀疑网络。从近到远扒效率最高。4.3 内存和持久化的坑别让数据静悄悄丢了有个经典的事故场景Redis跑得好好的某天机器重启内存里的缓存数据全没了业务方大喊“Redis丢数据了”。其实未必是故障很可能就是没开持久化。Redis的数据持久化目前有RDB和AOF两种方式RDB是定期把全量数据做快照存盘恢复快但最多可能丢最近一次快照之后写入的数据AOF是追加式记录每一条写指令最多丢一条的间隔但文件体积大恢复时重放耗时多。生产环境我的建议是两者同时开RDB用来做冷备份AOF保证停机后数据不丢。save 900 1 save 300 10 save 60 10000 appendonly yes appendfsync everysecappendfsync有三个值可选always理论上最安全但性能损失大everysec是性能和安全的平衡点no则完全交给系统刷盘已默认不建议。线上绝大多数场景everyec就够了。还有个容易忽略的问题持久化文件放置目录。配置里dir如果还停留在默认的./Redis从systemd启动时工作目录可能是/这会导致每次生成的dump文件八竿子打不着备份脚本根本找不到它。务必把dir设置成明确路径比如/var/lib/redis并且保证这个目录对redis用户可写chown redis:redis /var/lib/redis chmod 750 /var/lib/redis4.4 慢查询和连接数异常怎么定位排查完启动问题实际运行中还会有两类高频问题。一是慢查询。Redis 5.0以上可以设慢日志CONFIG SET slowlog-log-slower-than 10000 CONFIG SET slowlog-max-len 128slowlog-log-slower-than单位是微秒10000就是10毫秒。用SLOWLOG GET 10查看最近十条超时命令定位是哪个业务操作把Redis拖慢了。二是连接数打满。默认maxclients是10000但实际并发上来后文件描述符限制很快会成为瓶颈。两个地方要一起调Redis的maxclients配置和系统层面的ulimit -n。只调Redis不调系统依然会被卡死在“too many open files”。顺手给一个优化建议如果你的Redis主要用于高并发短命令的缓存访问可以把tcp-backlog从默认值提到1024配合内核参数net.core.somaxconn一起改连接并发能力会好一些。5. 装上之后只是开始安全加固和日常运维很多教程写到“安装成功”就戛然而止但生产环境的Redis从“能用”到“好用”还有一段不小的距离。这里聊几个我实际踩过、也帮别人擦过屁股的运维细节。5.1 密码、绑定和心跳检查一个都不能少密码这块用强密码。之前见过有团队把密码设成123456外网端口又对公网开放结果不出三天就被人种了挖矿木马。Redis命令执行权限极强一旦沦陷等于给别人递了一把万能钥匙。生成密码用openssl就行openssl rand -base64 24得到的字符串作为requirepass的配置值。注意-a 密码这种传参方式会在命令行历史里留下痕迹更好的做法是用REDISCLI_AUTH环境变量或者干脆在脚本里从文件读取。绑定策略如果一个实例只服务内网应用bind直接写成内网网卡的IP别用0.0.0.0。能不让公网进来的入口就要坚决关掉。心跳检查定时用redis-cli ping不足以发现深层次问题。建议搭一个简单巡检至少覆盖以下四项用INFO replication确认主从角色是否符合预期用INFO persistence确认最近一次RDB/AOF操作是否成功用INFO stats观察total_commands_processed是否停滞进程卡死的信号用redis-cli --latency看看内网访问延迟是否异常波动。这套巡检写个20行shell脚本丢进cron里每天跑一次能拦住绝大多数“低级但致命”的隐患。5.2 可视化管理工具选哪个命令行用久了能解决99%的问题但团队协作时可视化管理工具确实能提升沟通效率。主流免费好用的有Redis Desktop ManagerRDM老牌工具功能全跨平台支持好新版有开源版和商业版之分个人用免费功能足够了Another Redis Desktop ManagerARDM开源的RDM替代品颜值高性能也不错redis-commander基于Node.js的Web管理界面按npm install -g redis-commander装完填地址就能用适合不喜欢装桌面客户端的场景。在给这些工具授权前记得一定要建一个只读账号避免误操作把线上数据清了。Redis 6.0以后自带ACL用法是ACL SETUSER readonly ON 只读密码 ~* read这样可视化管理工具拿到的权限只能读不能写就算手滑也只是看一眼不会造成事故。5.3 从单机到分布式的下一步思路单机Redis装好之后你大概率马上会面对两个衍生问题高可用和扩展性。高可用最经典的做法是主从复制加哨兵。同一个内网里部署三台Redis一个主两个从再用三个哨兵进程监控。主挂了哨兵自动从从节点里选一个接班。这套架构成熟稳定资料也多Redis 7.x的哨兵能力经过大规模验证我建议直接从这块入手别着急上Cluster。扩展性方面当单机并发或容量扛不住了才需要考虑Redis Cluster。它是数据分片方案key通过CRC16算法散列到16384个槽位里每个节点负责一部分槽位扩容只需加节点并迁移槽位。Cluster方案运维复杂度明显上升适合数据量真正跨过单机承载线的场景。docker方式部署主从集群在测试环境里非常方便几条命令就能起来生产环境看团队容器化程度决定。无论走哪条路单机安装时打下的目录规范、配置管理、备份习惯都是后面集群化的地基。最后再分享一个关于这个内容的小技巧所有流程跑通之后建议把整个安装过程顺手做成一个自动化脚本里面写清楚版本号、安装路径、密码生成规则和配置模板。团队里每个人的Linux发行版可能不一样但脚本做好兼容判断后能保证换机器、加节点的时候不再靠人肉敲命令踩坑。我自己更喜欢把配置文件模板放在一个单独的目录里统一管理用redis-check-rdb和redis-check-aof两个工具定期校验持久化文件加上日志文件按天切割归档这套组合拳打下来Redis在线上基本不会成为半夜响警报的主角。
返回列表