ARTICLE DETAIL

资讯详情

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

Linux下Redis安装全攻略:从源码编译到Docker与主从复制

Linux下Redis安装全攻略:从源码编译到Docker与主从复制 不少朋友在项目里第一次接触 Redis都是从“在 Linux 上把服务跑起来”这一步开始的。网上教程很多但要么只讲了“怎么装”没讲“装完怎么配置、怎么排查”要么就是东拼西凑看完还是一头雾水。这篇就结合我自己的实操经历把 Linux 下安装 Redis 从准备到落地再到常见坑位的完整路径走一遍。文章不会只停留在“执行几条命令”而是把每一步背后的考虑、参数选择的依据、以及不同安装方式的取舍都讲清楚保证你看完能根据自己服务器的实际情况选对方案一次跑通。1. 安装前的准备想清楚再动手真正动手敲命令之前我建议你先花十分钟做两件事第一确认服务器的“底子”第二想清楚自己到底需要哪个版本的 Redis。1.1 环境检查版本、权限、网络一个不能少Redis 本身是轻量级服务对硬件要求不高1 核 1G 的小机器跑起来也毫无压力但它对“操作系统环境”是有要求的。我遇到过不少新手装的时候报各种错最后发现根本不是 Redis 的问题是系统基础环境没准备好。首先确认操作系统版本和架构。执行cat /etc/os-release或者uname -a看看是 CentOS 7、Ubuntu 22.04还是其他发行版以及是 x86_64 还是 ARM 架构。这决定了后面用哪种安装方式最省事也决定了能不能直接用系统自带的软件源。其次是确认有 root 权限或者当前用户具备 sudo 权限。虽然也可以装到用户目录下但 Redis 默认会用到/usr/local/bin、/etc/redis、/var/log/redis、/var/lib/redis这些系统级目录没有 root 权限后面会非常折腾。顺手再确认一下有没有开防火墙云服务器的话还要看安全组的端口策略因为 Redis 默认监听 6379 端口后面连接不上十有八九就是防火墙的锅。最后别忘了检查 gcc 编译环境。如果你计划用源码编译安装这是最推荐的方案系统里得有 gcc 和 make。CentOS 用yum install -y gcc gcc-c makeUbuntu 用apt install -y build-essential。玩 Linux 一定要养成“装软件前先查依赖”的习惯很多莫名其妙的编译报错根源就是缺了编译器或者某个开发库。1.2 版本选型别一上来就追求最新版Redis 的版本迭代节奏很快但我的建议非常明确不要盲目追新。生产环境推荐选择某个大版本的最新小版本比如 6.2.x 或 7.0.x。我的原则是“稳定优先特性够用就行”。7.0 引入了很多新特性比如 AOF 文件碎片整理、多部分 AOF 重写机制这些对运维来说确实很香。但考虑到很多公司内部运维体系、客户端依赖、监控工具可能还没完全适配如果你的项目没有特别强的新功能需求6.2 是性价比极高的选择稳定、坑少、资料多。另外下载 Redis 务必认准官网也就是 redis.io 的 download 页面GitHub 上的 redis/redis 仓库 Releases 区也可以。千万别从乱七八糟的第三方网站下载安全风险太高。你可以直接用官网提供的源码包地址也可以在 GitHub Releases 页面找对应版本。我自己习惯固定使用官网地址因为 redis.io 的 CDN 在国内访问速度也还可以。1.3 安装方式对比三种主流方案怎么选目前 Linux 上安装 Redis 主要有三种路子源码编译、系统包管理器、Docker 容器。我把它们的优劣列成一张表方便你一眼看明白安装方式优点缺点推荐场景源码编译版本可控、可指定编译参数、性能最优需要装编译工具、耗时稍长、升级麻烦生产环境首选想深入掌握编译细节系统包管理器安装简单、自动注册 systemd 服务、方便卸载版本通常较旧、定制性差测试环境、快速验证、对版本无要求Docker 容器环境隔离、秒级启动、版本切换方便数据持久化需额外配置、性能有轻微损耗、网络模式需熟悉微服务架构、本地开发、多实例隔离我个人的经验分享如果是在云服务器或者物理机上跑正式业务源码编译安装是综合素质最高的方案。虽然多花几分钟编译时间但换来的是版本自主可控、参数可定制。如果是快速搭个环境做验证或者本身就走 Kubernetes 和容器化路线那 Docker 是你最顺手的工具。包管理器安装则适合那些“只要能跑就行”的场景省心省力。2. 源码编译安装最推荐的生产级方案这套流程我走过不下几十遍闭着眼都能写出来每一步会在哪里遇到坑也都心里有数。下面就是完整的操作步骤。2.1 下载、解压、编译三步走确定版本后直接下载对应的源码包比如编译安装 Redis 7.0.12。我习惯把软件源码都放在/opt/src目录下和系统其他业务数据分开管理起来清爽。# 创建源码目录并进入 mkdir -p /opt/src cd /opt/src # 下载源码包建议先核对官网版本号 wget https://download.redis.io/releases/redis-7.0.12.tar.gz # 解压并进入目录 tar xzf redis-7.0.12.tar.gz cd redis-7.0.12这里有个小细节如果你的服务器无法直接访问外网官网下载经常失败。这时候可以先在自己电脑上下载好源码包然后用scp或者宝塔面板等工具传到服务器上。我遇到过一台内网机器折腾了半天 wget 都超时最后用 U 盘拷进去才解决。解压之后先别急着 make先看一眼里面的 README.md 和 Makefile了解一下默认的安装路径和编译选项。然后直接编译# 编译-j 后面跟 CPU 核心数加速编译 make -j4make 的过程长则几分钟短则几十秒取决于机器性能。编译完成后二进制文件已经生成在src目录下了。这时候可以执行make test先跑一遍测试确认编译结果没问题。不过我一般跳过这步因为官方发布的源码包通过测试的概率极高浪费这几分钟不太值。接着执行安装# 默认安装到 /usr/local/bin 目录 make install你也可以指定安装前缀比如make PREFIX/opt/redis install这样所有二进制文件就会放到/opt/redis/bin下方便统一管理。我建议还是用默认安装位置让 redis-server、redis-cli 直接进 PATH用起来不用写完整路径符合大多数人的习惯。2.2 初始化配置让 Redis 运行在正确的轨道上make install 只是把可执行文件拷到了系统里但这离“生产可用”还差得很远。接下来的配置才是重头戏。首先创建相关的目录Redis 需要数据目录存放持久化文件还需要日志目录# 创建数据目录和日志目录 mkdir -p /var/lib/redis mkdir -p /var/log/redis然后把源码包里的redis.conf配置文件拷贝到/etc/redis/目录下。源码目录里每个版本都会带一个默认配置文件这是最权威的配置参考。# 创建配置目录并拷贝配置文件 mkdir -p /etc/redis cp /opt/src/redis-7.0.12/redis.conf /etc/redis/接下来是编辑配置文件。重点修改以下几项每一项背后都有其原因daemonize默认是noRedis 以前台方式运行。改成yes后 Redis 会以守护进程方式在后台运行这样关闭终端后服务不会挂掉。虽然现在更推荐用 systemd 来管理 Redis但daemonize yes依然是很多脚本化管理场景下最简单的后台化方式。bind默认配置是127.0.0.1 -::1也就是只能本机访问。如果你的应用和 Redis 在同一台机器上这个配置完全不用改反而更安全。但如果需要远程访问比如另一台应用服务器连接这台 Redis就要改成服务器实际的 IP或者用0.0.0.0监听所有网卡。这里务必谨慎0.0.0.0会把 Redis 暴露到公网如果密码又没设置好基本等于向全世界敞开大门。port默认 6379没有充分理由不建议改。改了以后客户端连接时都要额外指定端口徒增沟通成本。requirepass设置访问密码。行首默认有#注释去掉注释并写上一段高强度密码即可。别再相信所谓“内网环境不需要密码”的说法内网扫描和横向渗透的案例多得是。密码复杂度至少达到字母数字特殊字符的 12 位以上。dir默认是./也就是工作目录RDB 快照和 AOF 日志文件都会写到这里。这个一定要改成刚才创建的数据目录/var/lib/redis否则 Redis 以 systemd 方式启动时可能把数据写到奇怪的地方或者干脆因为目录权限写不进去。logfile默认是空日志输出到标准输出。生产环境请务必设置日志文件路径比如/var/log/redis/redis-server.log否则排查问题的时候无迹可寻。appendonly默认是no也就是只开 RDB 快照持久化。如果业务对数据安全性要求较高建议改为yes开启 AOF 持久化。我建议你认真评估一下数据丢失的容忍度。能容忍丢失最近几分钟的数据RDB 就够了不能容忍就把 AOF 也打开。2.3 启动验证第一次看到 Redis 跑起来配置文件改好后就可以启动了。有两种启动方式直接用 redis-server 指定配置文件启动或者注册成 systemd 服务实现开机自启。后者是生产环境的常规做法但先讲前者因为逻辑更直观也便于排查问题。# 用指定配置文件启动 Redis redis-server /etc/redis/redis.conf如果一切正常ps -ef | grep redis能看到 redis-server 进程。再用redis-cli ping验证服务是否响应如果返回PONG说明安装成功服务正常。这里多啰嗦一句Redis 配置文件的注释非常详尽是学习和排查问题的最佳手册。不管遇到什么疑问先打开 redis.conf 搜一下相关配置项的解释。这套文件本身就是最好的开源文档比任何二手教程都靠谱。2.4 注册 systemd 服务开机自启的正确姿势我见过很多人为了省事直接在/etc/rc.local里写启动命令。这在老系统上还能用但在现代 systemd 系统上强烈推荐使用正规的 service 文件。好处是可以用systemctl start/stop/restart/status管理挂了自己能自动拉起开机自动启动一切尽在掌握。创建/etc/systemd/system/redis.service文件[Unit] DescriptionRedis In-Memory Data Store Afternetwork.target [Service] Typeforking ExecStart/usr/local/bin/redis-server /etc/redis/redis.conf ExecStop/usr/local/bin/redis-cli -p 6379 shutdown Restartalways RestartSec3 Userroot [Install] WantedBymulti-user.target注意这里Typeforking因为我们在 redis.conf 里设置了daemonize yesRedis 启动时会 fork 一个子进程到后台父进程退出。如果不设置 Typesystemd 会误判服务启动状态。配置好以后依次执行# 重新加载 systemd 配置 systemctl daemon-reload # 启动服务并设置开机自启 systemctl start redis systemctl enable redis # 查看运行状态 systemctl status redis看到active (running)并且没有报错日志大功告成。提示如果配置了 ACL 或者密码ExecStop 里的 shutdown 命令需要加上密码参数redis-cli -a 你的密码 shutdown。不过这种在命令行里直接带密码的方式会把密码暴露在进程列表里有安全隐患。更好的办法是关闭requirepass改用 Redis ACL 并创建专门的管理用户。这个后续讲安全加固的时候再细说。3. 其他安装方式详解包管理器与 Docker虽然源码编译是我最推荐的但不是所有人都有时间和耐心去编译。这里再讲另外两种方案。3.1 用系统包管理器安装一条命令搞定如果你只想快点把环境搭起来用系统自带的包管理器安装是最快的。Ubuntu / Debian 系# 更新软件源 apt update # 直接安装 redis-server apt install -y redis-server安装完成后Ubuntu 会自动帮你创建 redis 用户注册 systemd 服务甚至启动好 Redis。redis-cli ping一下就能验证。CentOS / RHEL 系# 安装 EPEL 源CentOS 7 需要8/9 需要确认 yum install -y epel-release # 安装 Redis yum install -y redis # 启动并设置开机自启 systemctl start redis systemctl enable redis这里要特别提醒不同 Linux 发行版的软件源里 Redis 版本可能非常滞后。比如 CentOS 7 默认源里的 Redis 还停留在 3.2 版本这个版本连 ACL 都不支持很多新特性也没有。如果你对版本有要求建议走源码编译。包管理器适合的是“先跑起来再说”的快速验证场景。用包管理器装完配置文件一般在/etc/redis.conf或/etc/redis/redis.conf数据目录通常不用手动创建安装脚本都帮你处理好了。但大前提依然一样设密码、绑 IP、配持久化一个都不能少。3.2 Docker 方式安装隔离环境下的优雅选择容器化是大趋势如果服务器上已经装了 Docker用 Docker 跑 Redis 简直不要太舒服。# 拉取官方镜像 docker pull redis:7.0 # 运行 Redis 容器挂载数据目录和配置文件 docker run -d --name my-redis \ -p 6379:6379 \ -v /data/redis/data:/data \ -v /data/redis/redis.conf:/etc/redis/redis.conf \ --restart always \ redis:7.0 redis-server /etc/redis/redis.conf这里有几个关键点一定要理解端口映射-p 6379:6379是将宿主机的 6379 端口映射到容器的 6379 端口这样外部才能通过宿主机 IP 访问 Redis。数据卷-v /data/redis/data:/data是把容器的/data目录RDB 和 AOF 文件默认存放位置挂载到宿主机不然容器一删数据就全没了这是新手最容易踩的坑。配置文件挂载则是让容器使用你自定义的配置比如密码、持久化策略。最后的--restart always表示容器退出后自动重启相当于开机自启。我遇到过最典型的场景是本地开发用小项目跑个最新 Redis 镜像怎么方便怎么来但生产环境走容器化时配置文件、数据卷、网络模式必须提前设计好因为容器里的运行环境和宿主机隔离出现网络不通、数据丢失、日志难排查的问题时处理起来比传统安装更绕。3.3 主从复制的快速实践从主到从的 10 分钟既然热词里反复出现“docker安装redis主从”这里专门补一节。主从复制是 Redis 高可用和读写分离的基础配置思路非常清晰从节点连接主节点同步数据。如果你用的是 Docker 方式可以通过下面的方式快速起一个一主一从的架构。先配置主节点假设叫 redis-master端口 6379docker run -d --name redis-master \ -p 6379:6379 \ -v /data/redis-master:/data \ redis:7.0 redis-server --appendonly yes这里用了一个技巧直接在 run 命令后面用--appendonly yes覆盖默认持久化配置不用非得写一个完整配置文件。然后配置从节点假设叫 redis-slave端口 6380docker run -d --name redis-slave \ -p 6380:6379 \ --link redis-master:master \ redis:7.0 redis-server --replicaof master 6379这段命令的核心在--replicaof master 6379告诉当前节点去复制 master 节点。由于用了--link容器里可以直接通过主机名 master 访问到主节点。如果不用--link直接写宿主机 IP 也可以比如--replicaof 192.168.1.100 6379。验证主从是否成功连接进入从节点容器docker exec -it redis-slave redis-cli -p 6379 info replication看到role:slave并且master_link_status:up说明主从已经握手成功。此时在主节点set foo bar在从节点get foo能拿到值就说明数据同步也通了。这个配置方式在生产环境的 docker compose 部署里也殊途同归只是变量提取和网络管理更规范。核心原理是一样的从节点通过replicaof指定主节点地址剩下的交给 Redis 自己完成。4. 性能优化与核心配置项解析装好 Redis 只是第一步真正让它发挥出性能优势配置调优必不可少。默认配置适合开发环境但生产环境必须根据业务特征调整。4.1 内存管理别让 Redis 成为内存杀手Redis 把所有数据都存在内存里内存管理是重中之重。最核心的配置是maxmemory它限制了 Redis 可以使用的最大内存量。别小看这个配置我见过太多服务器因为没设maxmemoryRedis 把 32G 内存吃满直接触发系统 OOM把同机的其他应用一起带崩。maxmemory可以这么设置比如限制为 4GBmaxmemory 4gb设置之后重点来了当内存达到上限时Redis 怎么处理新写入的数据这是由maxmemory-policy决定的。常见的策略有noeviction不淘汰任何数据新写入直接报错。适合一些必须保证数据完整的场景但代价是业务会看到写入异常。allkeys-lru在所有的 key 中按照 LRU最近最少使用策略淘汰。这是最常用的缓存策略适合缓存场景。allkeys-lfu在所有的 key 中按照 LFU最不经常使用策略淘汰。适合有明确访问频次差异的场景。volatile-lru只对设置了过期时间的 key 进行 LRU 淘汰。适合只淘汰“可过期数据”的场景。我的建议是如果你的 Redis 纯粹当缓存用选allkeys-lru最大化缓存命中率如果有部分数据不能丢则搭配持久化机制并选择noeviction或volatile-lru宁可报错也不丢数据。4.2 持久化配置RDB 与 AOF 的选择和组合Redis 的持久化机制是很多新手容易糊涂的地方。简单说有两种RDBRedis DataBase在指定的时间间隔内将内存中的数据集快照写入磁盘。默认配置是save 900 1 save 300 10 save 60 10000意思是 900 秒内至少有 1 个 key 更改就触发一次快照300 秒内至少有 10 个 key 更改触发一次快照60 秒内至少有 10000 个 key 更改触发一次快照。RDB 文件体积小恢复速度快适合做备份和灾难恢复。缺点是可能丢失最后一次快照之后的数据。AOFAppend Only File记录每一次写操作以日志的方式追加到文件里。AOF 数据安全性更高可以根据appendfsync策略控制刷盘时机。always每次都刷盘最安全但性能最低everysec每秒刷一次性能和安全的平衡点官方默认推荐no完全交给系统刷盘性能最好但数据安全性差。生产环境对数据安全性要求高建议always或everysec。生产环境的推荐做法是两者同时开启。RDB 做底层备份和快速恢复AOF 保证数据不丢失。Redis 启动时会优先使用 AOF 来恢复数据因为 AOF 数据更完整。同时开启后AOF 重写机制会自动整理日志文件大小不用太担心磁盘被塞满。4.3 连接数与线程模型应对并发访问默认配置下 Redis 支持的最大客户端连接数是 10000这其实是个不小的数字。但如果你用redis-cli info clients查看发现连接数飙高就要考虑两个方向是业务确实需要这么大的并发还是连接没释放导致连接泄漏。如果是后者重点排查应用代码里的连接管理。Redis 的连接还是很轻量的但如果应用每次请求都新建连接、用完不释放连接数就会蹭蹭往上涨最后把 Redis 的maxclients打满新请求直接拒绝。此时调整timeout配置让空闲连接自动断开会起到一定缓解作用但治本之法还是修代码。Redis 本身是单线程模型通过 IO 多路复用处理海量连接所以不要指望通过“增加线程数”来提升性能。真要提升吞吐量可以考虑用 Redis 6.0 之后引入的多线程 IO 特性修改配置io-threads 4 io-threads-do-reads yes但说实话绝大多数业务场景单线程 Redis 的 10 万 QPS 早就够用了没必要动这个。真到了需要调优那一步首先应该排查的也是大 key、慢查询、热点 key 这些问题而不是线程模型。5. 安全加固暴露公网的 Redis 等于裸奔这一节必须反复强调。Redis 默认配置下如果直接运行在公网服务器上又不做任何安全设置就等于把数据摆在马路上。网上因为 Redis 未授权访问被植入挖矿木马、被勒索的案例比比皆是。5.1 基础防护密码、绑定与防火墙密码设置是第一步在前面配置里说过requirepass。但光有密码还远远不够。绑定 IP 是第二步。如果只有本机应用需要连接 Redisbind 127.0.0.1就足够了。如果多台内网服务器需要连接bind写具体的内网 IP而不是0.0.0.0。在配置里绑定多个 IP 用空格分隔bind 127.0.0.1 192.168.1.100这里想特别解释一下安全的逻辑即使配置了密码也尽量不要把 Redis 监听在公网 IP 上。密码的保护能力没有想象中那么强Redis 的协议并不是为加密通信设计的明文密码在网络上传输本身就是个风险点。高安全要求的环境建议用 SSL/TLS 隧道或者应用层加密后再传给 Redis。防火墙规则也要配合到位。云服务器在安全组里只放行必要来源 IP 的 6379 端口本机再用 iptables 或 firewalld 限制一下# firewalld 放行指定来源 IP 的 6379 端口 firewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.168.1.0/24 port port6379 protocoltcp accept firewall-cmd --reload5.2 进阶加固ACL、重命名危险命令与最小化权限Redis 6.0 之后引入了完整的 ACLAccess Control List机制可以给不同用户分配不同权限。强烈建议别再用单一的requirepass应对所有场景了。一个典型的 ACL 配置思路是这样的默认用户只允许做最基本的PING所有应用连接使用独立的只读或者有限命令用户管理操作由管理员账号完成。在redis.conf中配置# 创建一个应用访问用户只允许读写指定前缀的 key不允许 flushall/db user appuser on A-strong-app-passowrd ~cache:* read write -admin ping这里的语法解释一下user appuser创建用户on表示启用密码设置密码~cache:*表示只可以访问cache:前缀的 keyread write允许读写类命令-admin禁止管理类命令ping单独允许 ping。这样一个用户即使密码泄露破坏范围也被限制在 cache 前缀内做不了FLUSHALL这类毁灭性操作。另外有个细节用redis-cli的时候不建议直接-a 密码这条命令会出现在 shell history 和进程列表里。改用REDISCLI_AUTH环境变量或者交互式输入密码。5.3 备份与灾难恢复最后的防线最后强调备份。任何服务都有挂的可能磁盘坏了、机房断电、误删数据一发生就是大事故。定期备份 Redis 数据是必须养成的习惯。最简单的做法是定期用redis-cli BGSAVE触发 RDB 快照然后把生成的 dump.rdb 文件拷贝到其他机器或者对象存储上。也可以直接调用redis-cli --rdb /backup/dump.rdb生成备份文件。恢复操作也别等到真出事了才第一次练。先在测试环境跑通一遍“从备份文件恢复 Redis”的流程确认 RDB 文件拷贝回去、启动服务、数据完整心里才有底。我自己就曾亲眼见过有同事把备份文件拷到服务器上启动时报错才发现文件早就损坏了当场慌神。定期演练恢复流程比备份本身更重要。6. 常见问题与排查技巧实录作为一个踩过无数坑的人我把最常见的几个问题整理成速查表并附上我的排查思路。这些不是从文档里抄的都是我实际遇到过的场景。6.1 常见问题速查表问题现象可能原因排查命令/解法redis-cli ping报连接拒绝服务未启动 / 防火墙拦截 / bind 配置限制ps -ef | grep redissystemctl status redistelnet 127.0.0.1 6379远程连接 Redis 超时安全组/防火墙未放行端口检查云控制台安全组规则本机 firewalld 策略NOAUTH Authentication required没输入密码或密码错误redis-cli -a 密码 ping检查 requirepass 配置MISCONF Redis is configured to save RDB snapshots磁盘满了或目录没有写权限df -h、ls -ld /var/lib/redis修复权限或清理磁盘服务突然挂掉内存不足触发 OOM / maxmemory 配置导致报错dmesg | grep -i oomjournalctl -u redis开启持久化后启动恢复时间特别长AOF 文件过大或 key 数量过多检查 AOF 文件大小考虑BGREWRITEAOF压缩文件主从同步一直断连网络不稳定 / 主节点 requirepass 未同步到从节点同时配置masterauth检查主从网络延迟ERR max number of clients reached连接数达到限制检查连接泄漏调整maxclientsredis-cli info clientsWARNING 提示overcommit_memory被设为 0系统内存超额策略不适合 Redis修改/etc/sysctl.conf设置vm.overcommit_memory16.2 大 key 与慢查询性能问题的常见元凶Redis 用起来只会“执行命令”但它遇到大 key 和慢查询时会让整个服务卡顿。所谓大 key指的是某个 key 的 value 特别大比如一个 list 里有上百万条数据或者一个 hash 里有几十万个字段。操作这种 key 时Redis 单线程会卡在那里同一时间所有其他请求都得排队。排查大 key 的方法Redis 官方已经给了很好的工具# 用 redis-cli 扫描大 key redis-cli --bigkeys这个命令会遍历所有 key找到每种数据类型中最大的几个 key。输出结果会告诉你哪些 key 是“大块头”。处理思路也很清晰能拆分就拆分把大 key 拆成多个小 key不需要全量读取的优先用HSCAN、LRANGE这类分批遍历命令定期清理过期数据别让垃圾堆积成山。慢查询也是一样通过SLOWLOG GET可以查看执行时间超过阈值的命令列表。设置slowlog-log-slower-than 10000单位微秒即超过 10 毫秒的命令记录然后用SLOWLOG GET 10查看最近 10 条慢命令分析是不是有非常耗时的操作。6.3 系统参数调优给 Redis 更好的运行环境Redis 的官方文档在启动时会提示一些系统参数建议不少人忽视了这些 WARNING但它们在流量上来时会成为性能瓶颈。vm.overcommit_memory这个参数控制 Linux 系统的内存超卖策略。设置为 0 时就算 Redis 的maxmemory没到上限系统也可能因为内存申请失败而拒绝 fork 子进程导致BGSAVE失败。建议永久修改echo vm.overcommit_memory1 /etc/sysctl.conf sysctl -pnet.core.somaxconn这个参数控制 TCP 连接队列的最大长度。Redis 默认配置里tcp-backlog是 511如果系统 somaxconn 太小高并发下连接会被拒绝或者延迟。设置到 1024 以上比较稳妥echo net.core.somaxconn1024 /etc/sysctl.conf sysctl -p还有一个之前踩过的坑transparent_hugepage被开启时Redis 在 fork 持久化的时候可能出现严重的性能波动。官方建议关闭它echo never /sys/kernel/mm/transparent_hugepage/enabled这些系统级参数平时不起眼但它们决定了 Redis 在高负载下能否稳定运行。提前调好远比事后救火省心。6.4 一个真实的现场排障案例最后分享一个我自己遇到过的排查过程完整展示一次问题从出现到解决的链路。有次一个客户环境里的 Redis 服务突然不可用systemctl status redis显示进程还在但redis-cli ping直接卡住。连上去看了下top发现 CPU 正常、内存充足很奇怪。后来用strace -p 进程号挂上去看系统调用发现进程阻塞在write系统调用上。继续查才发现这台机器的磁盘满了Redis 写 AOF 日志时无法写入导致主线程被阻塞。清理磁盘后Redis 立即恢复正常。这个例子说明了两件事第一Redis 的性能问题不一定出在 Redis 本身系统磁盘、网络、内存都可能成为瓶颈第二strace、top、dmesg这些基础 Linux 排查工具在关键时刻比什么监控面板都管用。所以虽然安装一个 Redis 看起来很“初级”但真正能把它维护好的人靠的是完整的 Linux 功底。我个人的体会是安装 Redis 从来不是一个“装完就完事”的活儿。它是一次对你 Linux 基本功、系统理解力和安全意识的全方位体检。把上面的每一步都认真走一遍、把每个配置项的含义都搞明白你收获的绝不仅仅是一个能跑的 Redis而是排查问题的一套方法论。刚开始装的时候多花点时间后面运维的时候就能少熬几个夜这笔账怎么算都值。
返回列表