ARTICLE DETAIL

资讯详情

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

Redis 6.2.6在Linux服务器上的源码编译与Docker部署指南

Redis 6.2.6在Linux服务器上的源码编译与Docker部署指南 1. 为什么选择6.2.6这个版本1.1 6.2.x系列的技术定位很多人装Redis第一反应是直接拉最新版但如果你负责的是生产老项目或者刚接手一套既有系统会发现一个很现实的问题服务端组件真不适合追求“新版新功能”尤其是Redis这种被业务读写路径高度依赖的中间件。6.2.x是我个人在生产环境里比较推荐的稳定序列它介于6.0和7.x之间既保留了对旧客户端和旧部署习惯的兼容又补足了不少实际有用的能力。Redis 6.0是官方支持多线程IO的起始版本ACL权限模型和RESP3协议也都是6.0引入的但当时这些功能的生态消化还不完全部分客户端库、可视化工具对RESP3的支持也不够完善。6.2系列把这些能力推得更稳并补上了如GETEX、GETDEL、BLMOVE等一系列命令细节同时压缩了过期键清理、主从同步等场景下的异常行为。简单说6.2.6是这套体系里比较成熟的维护版本适合把“稳定跑起来”作为第一优先级的人。1.2 6.2.6相比相邻版本有哪些实用改动6.2.6属于维护版本并没引入什么大功能核心价值在于修复。我翻过它的发布说明里面包含了若干崩溃点修复比如XAUTH、客户端缓存失效处理以及大量和内存碎片清理相关的优化。对于运行中偶尔遇到redis-server莫名掉线的场景这些修复很实在。与更早的6.2.1、6.2.2相比6.2.6在复杂事务、Lua脚本边界场景下的表现更稳定。与7.x相比6.2.6不需要强制适应AOF文件格式和新的多部分消息协议部署方式也更贴近大多数老牌运维手册。因此如果你的项目里已经有成熟的监控脚本、封装好的Redis客户端依赖选择6.2.6能把升级成本压到最低。提示如果项目没有任何历史包袱直接上7.x也没问题。但如果你希望“下载安装后配置一把梭接下来两年尽量不折腾”6.2.6会是一个更保守也更容易排错的选择。2. 动手前先理清楚的三件事2.1 环境评估与依赖清单安装Redis不是只有tar解压后make install这么简单踩坑往往发生在环境这个层面。我建议动手前先确认四件事操作系统发行版和版本、是否有编译工具链、是否对tcmalloc或jemalloc有特殊偏好、以及目标端口是否空闲。最常见的是开发机和生产机的Linux发行版不一致。比如开发环境是Ubuntu生产环境是CentOS依赖安装命令完全不同后面编译时也可能出现gcc版本差异。Ubuntu上我一般装build-essentialCentOS上则用yum install -y gcc gcc-c make。另外Redis默认内存分配器是jemalloc低版本gcc在编译jemalloc时容易报错遇到这种情况可以临时改用make MALLOClibc把分配器切到glibc自带的malloc。虽然官方不推荐在生产环境长期用libc但至少能保证安装流程跑通。端口检查也要提前做。一个很常见的翻车现场是Redis明明启动成功客户端却说连不上最后发现6379端口被别的进程占用了或者防火墙策略没放行。可以先执行ss -lntp | grep 6379确认端口干净再继续。2.2 下载源选择与安装包校验下载地址看起来是个小问题实际上很多人在这栽过跟头。Redis官网redis.io首页会优先推荐最新稳定版按版本号去下载的历史版本列表藏在下载页面里。如果直接访问官网下载6.2.6需要找/releases/路径下的归档包。我习惯直接用这个稳定的下载地址模板https://download.redis.io/releases/redis-6.2.6.tar.gz这个路径是官方维护的长期有效版本号可以替换。如果公司内网有镜像源优先走内网下载速度会快很多。下载后不要急着解压先做一下哈希校验。官方发布包的SHA256值可以在redis-6.2.6.tar.gz.sha256文件里看到比对着校验能防止源站文件被篡改或者下载不完整。wget https://download.redis.io/releases/redis-6.2.6.tar.gz wget https://download.redis.io/releases/redis-6.2.6.tar.gz.sha256 sha256sum redis-6.2.6.tar.gz # 对比输出结果是否和sha256文件里的一致3. Linux服务器上编译安装Redis 6.2.63.1 解压与编译操作我把完整步骤写在下面基于常见的CentOS 7/8和Ubuntu 18.04/20.04命令基本通用。# 1. 安装编译依赖 # CentOS/RHEL系 sudo yum install -y gcc gcc-c make # Ubuntu/Debian系 sudo apt update sudo apt install -y build-essential # 2. 解压源码 tar xzf redis-6.2.6.tar.gz cd redis-6.2.6 # 3. 编译直接make即可 makemake这个过程会先编译依赖的jemalloc再编译Redis本体耗时取决于机器性能一般几分钟到十几分钟。编译过程中最常遇到的问题就是gcc版本过老报error: unknown type name ‘_Atomic’之类的错误。这是编译器不支持C11标准导致的解决方法要么升级gcc要么降低Redis版本要么改用低版本内核方案。如果你确认来源是官方包不必担心代码有问题多数是编译环境太旧。如果make正常结束接着执行# 4. 安装到指定目录推荐放到/usr/local/redis下 sudo make install PREFIX/usr/local/redis这条命令会把redis-server、redis-cli、redis-benchmark等可执行文件装到/usr/local/redis/bin目录。如果你不指定PREFIX默认会装到/usr/local/bin我建议还是指定一个目录这样后续升级、删除版本都更干净。3.2 二进制目录和运行账号怎么安排安装完成后即便/usr/local/redis/bin/redis-server已经在系统里我仍然倾向于构建一个规范化的运行目录而不是直接裸奔。参考下面这组目录约定后续维护会省很多事/usr/local/redis/bin # 可执行文件 /usr/local/redis/etc # 配置文件 /usr/local/redis/log # 日志文件 /usr/local/redis/data # RDB和AOF文件创建完目录后把配置文件复制过去sudo mkdir -p /usr/local/redis/{etc,log,data} sudo cp redis-6.2.6/redis.conf /usr/local/redis/etc/生产环境不建议用root账号直接跑Redis最好单独建一个系统用户sudo useradd -r -s /sbin/nologin redis sudo chown -R redis:redis /usr/local/redis这样即使服务被攻击权限也在可控范围内。3.3 systemd托管与开机自启直接redis-server /usr/local/redis/etc/redis.conf虽然能启动但进程退出后不会自动拉起服务器重启后也不会自动恢复。推荐用systemd管理。新建/etc/systemd/system/redis.service文件内容可以这样写[Unit] DescriptionRedis Server Afternetwork.target [Service] Userredis Groupredis Typeforking ExecStart/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf ExecStop/usr/local/redis/bin/redis-cli shutdown Restartalways RestartSec5 PIDFile/var/run/redis.pid [Install] WantedBymulti-user.target注意这里用了Typeforking所以配置文件里必须开启daemonize yes否则systemd会因为前台进程管理方式不匹配而报错。如果你不想开守护进程也可以把Type改成simple并去掉PIDFile。保存后执行sudo systemctl daemon-reload sudo systemctl enable redis sudo systemctl start redis sudo systemctl status redis看到active (running)就说明服务托管成功了。4. Windows和Docker环境下的快捷部署4.1 Windows开发者环境下的安装方案很多同学是在Windows上做本地联调想跑一个Redis实例模拟缓存这种场景就不适合去源码编译了。虽然Redis官方不直接支持Windows但微软和社区都有维护过Windows移植版本。我用过的方案里比较省心的是用Windows包管理器直接安装wsl --install # 或者使用第三方Windows移植版如果你安装了WSL2最稳妥的做法是在Linux子系统里按上一节的方式安装体验和Linux生产环境完全一致。另一个选择是直接用社区维护的Windows可执行包解压后运行redis-server.exe启动连接工具用redis-cli.exe即可。这类包适合本地临时联调不建议用于正式生产。还有一条路子就是Docker DesktopWindows上装好Docker后拉镜像跑容器具体命令见下一节。这个方案的好处是环境干净不污染宿主机删除也方便。4.2 Docker容器方式部署Redis 6.2.6Docker部署Redis最大的好处是免去了编译和依赖的麻烦一条命令就能拉起。官方镜像的版本tag非常规范直接用版本号即可。docker pull redis:6.2.6 docker run -d --name redis626 \ -p 6379:6379 \ -v /opt/redis/data:/data \ -v /opt/redis/redis.conf:/etc/redis/redis.conf \ redis:6.2.6 \ redis-server /etc/redis/redis.conf这里我把/opt/redis/redis.conf挂载进容器并用挂载的配置启动这是很重要的一步。很多新手直接跑docker run redis:6.2.6Redis会在默认配置下使用容器内默认入口启动没有设置密码、没有持久化配置容器一删数据就没了。如果只是临时测试也可以简化成一句docker run -d --name redis626 -p 6379:6379 redis:6.2.6但生产环境务必使用自定义配置挂载。进入容器的命令也不难记docker exec -it redis626 redis-cli -a yourpassword ping4.3 三种安装方式如何选我觉得可以按场景直接对号入座生产环境Linux裸机或虚拟机优先编译安装或RPM/DEB包安装便于和现有监控、systemd体系集成本地开发机优先Docker干净且不影响宿主环境纯Windows临时演示用社区移植版或WSL即可。这里多说一句有人会在生产环境里图省事直接用Docker跑Redis如果你的运维体系支持得比较好容器的持久化和网络管理都成熟完全可行。但如果容器平台本身还不稳定我认为裸机安装更可靠因为Redis本身定位就是轻量级运维复杂度低没必要为了容器化而容器化。5. 安装后的基础配置与可用性验证5.1 Redis配置文件的核心改动点安装完成不等于配置完成。默认的redis.conf虽然能直接启动但有几个地方不建议裸奔端口、绑定地址、密码、持久化策略、日志位置。我通常按最小必要原则修改不把配置改得面目全非后续排查问题会更容易。下面是一份常用的最小改动清单bind 127.0.0.1 protected-mode yes port 6379 daemonize yes pidfile /var/run/redis.pid logfile /usr/local/redis/log/redis.log dir /usr/local/redis/data requirepass yourpassword appendonly yes appendfilename appendonly.aofbind一定要按实际需求写。如果不修改网络配置只允许本机连接bind 127.0.0.1就足够了如果同一内网的其他机器要访问就写上具体的内网IP例如bind 127.0.0.1 192.168.1.100。protected-mode yes配合bind能防止Redis暴露到公网被恶意利用。真实生产里经常有人忘了改这两项结果被蠕虫扫到直接变成挖矿肉鸡这种事情在运维圈并不少见。requirepass是否设置取决于业务场景。如果Redis只在内网且网络隔离做得好可能不需要密码但只要涉及到跨网段访问或公网环境密码是底线。设置密码后客户端连接和redis-cli都要用-a参数或AUTH命令。持久化这块默认的RDB快照配置适合大部分场景但如果有较高的数据可靠性要求建议同时开启AOF。开启后每次写操作都会记录到appendonly.aof实例重启后通过重放AOF恢复数据。当然AOF文件会持续增长需要在配置里设置auto-aof-rewrite-percentage和auto-aof-rewrite-min-size让Redis在AOF膨胀到一定程度时自动重写。5.2 启动实例并用redis-cli验证配置改完后先做一次前台启动确认没有配置错误sudo -u redis /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf如果没有报错再用redis-cli验证/usr/local/redis/bin/redis-cli -a yourpassword ping返回PONG就说明服务正常。接下来可以看一些基本状态确认当前版本和运行情况/usr/local/redis/bin/redis-cli -a yourpassword info server | grep redis_version如果要检查持久化配置是否生效可以执行/usr/local/redis/bin/redis-cli -a yourpassword config get appendonly看到输出为appendonly和yes说明修改已生效。注意redis-cli -a明文传密码会在历史记录里留下记录本地测试没问题但生产环境慎用。可以设置环境变量REDISCLI_AUTH或使用交互式AUTH命令。6. 我踩过的坑和排查记录6.1 编译阶段的经典报错源码编译那一步问题最集中尤其集中在老系统上。第一个高频报错是cc: command not found说明没装gcc第二个是jemalloc编译失败报zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory这种情况在CentOS 7配合旧版本gcc时很常见。我的解决办法是先升级系统工具链再重新执行make distclean make。如果环境实在无法升级再考虑make MALLOClibc。还有一种情况是磁盘空间不足源码目录比较大make过程会产生大量中间文件建议先df -h检查/tmp和当前目录所在磁盘的剩余空间。编译通过之后也别太高兴启动时可能遇到WARNING overcommit_memory is set to 0!这不是致命错误只是Redis提示内存分配策略可能造成后台保存失败。生产环境我会建议调整内核参数sudo sysctl -w vm.overcommit_memory1同时把THP透明大页关掉Redis官方文档明确建议关闭系统中透明大页的支持因为它会降低Redis的内存性能并增加延迟echo never /sys/kernel/mm/transparent_hugepage/enabled6.2 启动和连接阶段的坑启动后最常见的问题就是连不上。很多人第一反应是防火墙于是去关防火墙但真正的元凶往往是bind配置限制。如果bind 127.0.0.1而客户端从别的机器连肯定连不上。解决方法是把本机内网IP追加到bind后面或者让Redis监听所有网卡但后者仅限内网隔离可靠的环境我真的不推荐。另一种连接问题是被密码挡住的客户端报NOAUTH Authentication required。这时候只要确认配置文件里的requirepass和客户端传的密码是否一致即可。注意如果用了redis-cli并开启了protected-mode yes还要注意在交互时先用AUTH认证。数据目录权限问题也值得留意。如果Redis以redis用户运行但dir指向的目录是root创建的可能出现Cant open the append-only file: Permission denied导致启动失败。解决办法是chown redis:redis /usr/local/redis/data确保运行用户对数据目录有写权限。6.3 常见问题速查表现象常见原因快速处理cc: command not found未安装gcc安装build-essential或gccjemalloc编译失败gcc版本过老升级gcc或make MALLOClibcCould not connect to Redis at 127.0.0.1:6379服务未启动、bind限制或防火墙拦截检查进程状态、bind配置和防火墙规则NOAUTH Authentication required未发送密码或密码错误执行AUTH passwordMISCONF Redis is configured to save RDB snapshots...磁盘不足或权限问题修复数据目录权限检查磁盘空间WARNING overcommit_memory is set to 0!内核参数未调优sysctl -w vm.overcommit_memory1Cant open the append-only fileAOF目录无写权限查看日志中提示的路径修正属主最后再说一个我自己维护环境时的习惯装完Redis后我会把安装版本、配置文件路径、数据目录、启动方式和密码策略都记录在项目的部署文档里而不是只依赖记忆。这个习惯帮了很多次忙。比如半年后需要升级版本或排查内存溢出时直接看文档就能回忆起来当时做了哪些处理不用重新翻配置、猜目录。你可能觉得这是小事但真正出问题时薄薄一张纸的记录就是最可靠的排查依据。Redis 6.2.6的下载和安装本身不算复杂但每一步选择都会影响后续的维护体验。希望这份记录能帮你少走几趟弯路把一个稳定可用的Redis服务真正落地。
返回列表