ARTICLE DETAIL

资讯详情

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

银河麒麟V10源码编译安装Redis并配置systemd服务全流程

银河麒麟V10源码编译安装Redis并配置systemd服务全流程 1. 环境准备与安装方案选型1.1 先搞清楚你的银河麒麟是什么版本在动手之前我强烈建议你先确认一下系统的具体版本。银河麒麟目前主流的服务器版本是 V10、V11桌面版也有不少人在用。不同版本对应的底层架构、软件源策略、内核版本都不一样直接决定了你装 Redis 的时候是“一条 yum 搞定”还是“老老实实源码编译”。cat /etc/os-release uname -a执行上面两条命令你就能看到系统的发行版信息、内核版本。我在实际测试中用的是一台银河麒麟 V10 SP1 服务器版x86_64 架构内核版本 4.19 系列。这个版本整体对 Redis 6.x 的支持比较友好源码编译基本不会有兼容性坑。另外顺便说一下很多时候你在网上搜“麒麟系统安装软件”会看到一堆奇奇怪怪的教程什么“先换源再 apt install”之类——但你要注意银河麒麟的服务端默认是带 yum 的Desktop 版本则可能是 apt。一定要先确认好包管理器再决定后续命令不然照着教程敲到一半发现报错心态直接炸。1.2 三种安装方式我为什么最后选了编译安装yum/dnf 直接安装最简单一条命令搞定但坑在于软件源里可能没有 Redis或者版本非常老旧。我在银河麒麟 V10 上试过 yum install redis提示找不到包需要手动添加 EPEL 源或者麒麟自家的扩展源。如果你对公司内网机器的源有限制这一步会很折腾。apt 安装桌面版/通用 Linux仅适合 Debian 系的麒麟桌面版本。但服务器版大部分场景用不上。源码编译安装最稳、可控性最强也是我最终采用的方案。源码编译虽然多花几分钟但你可以自己指定安装目录、指定 Redis 版本、关闭不需要的模块后面维护起来反而省心。所以这篇教程的核心思路就是源码编译安装 Redis再注册成 systemd 服务实现开机自启、异常退出自动拉起。这套流程我在多台麒麟机器上反复跑过基本没有翻车。1.3 安装前必须准备的依赖Redis 是 C 语言写的源码编译依赖 gcc 和 make。新装的系统大概率没有完整的编译工具链提前装好能省掉后面一堆报错。yum install -y gcc gcc-c make如果你是带桌面环境的银河麒麟建议顺手把下面几个工具也装一下后面排查问题会方便很多yum install -y wget net-tools vim有一个非常关键的细节如果你的 gcc 环境是刚装好的最好先执行一下yum update -y或者至少把 glibc 相关库更新到一致版本。我踩过的坑是——系统出厂自带一个残缺的 gcc直接编译 Redis 的时候报一堆“文件未找到”的错实际原因是头文件路径不对重新装完 gcc 就好了。2. Redis 源码编译安装全流程2.1 下载 Redis 源码包Redis 官网redis.io下载速度经常很拉跨国内建议直接用 GitHub 的 release 包或者用国内镜像站。不要下载那种最新的开发版选稳定版比如 6.2.14、7.0.15 这类带修复的版本单机缓存场景完全够用。cd /usr/local/src wget https://download.redis.io/releases/redis-6.2.14.tar.gz tar -zxvf redis-6.2.14.tar.gz cd redis-6.2.14如果你的机器无法访问外网那就只能在有网的机器上下载好 tar 包再通过 U 盘或内网传输工具拷过去了。传到服务器后放到 /usr/local/src 下解压后面的步骤完全相同。2.2 编译安装三条命令一步都不能省make make install PREFIX/usr/local/redis第一行make是编译整个 Redis 项目会生成 redis-server、redis-cli 等可执行文件。第二行make install是安装到指定目录PREFIX指定安装路径为 /usr/local/redis这样所有二进制文件都会放到 /usr/local/redis/bin 下目录清晰后期要卸载直接删这个文件夹就行。编译过程中如果出现jemalloc相关的提示不用慌。Redis 默认使用 jemalloc 做内存分配器但系统里没有对应库时会自动回退到 libc malloc。如果你希望彻底避免这个警告可以直接用make MALLOClibc我这里实测直接用 make 也没问题编译完提示成功就完事。编译耗时大概两三分钟取决于机器配置耐心等就行。2.3 验证安装是否成功安装完成后先检查一下二进制文件是否存在、版本号是否能正常输出/usr/local/redis/bin/redis-server --version /usr/local/redis/bin/redis-cli --version正常情况下会输出 Redis server v6.2.14 sha... 之类的版本信息。到这一步Redis 本体已经装好了但还不能算“可用”——因为没有配置文件、没有注册服务直接启动的话窗口一关进程就没了而且所有用默认配置启动的 Redis 都存在安全隐患。为了让后续操作更顺手我习惯把 bin 目录加入 PATHecho export PATH$PATH:/usr/local/redis/bin /etc/profile source /etc/profile这样以后再输 redis-cli 就不用带完整路径了。3. Redis 配置与 systemd 服务管理3.1 redis.conf 关键配置项解读Redis 安装包里自带一个默认配置文件在源码目录下的 redis.conf。执行下面命令把它复制到安装目录下的 etc 目录没有就先创建mkdir -p /usr/local/redis/conf cp /usr/local/src/redis-6.2.14/redis.conf /usr/local/redis/conf/然后打开配置文件重点改这几个地方vim /usr/local/redis/conf/redis.confdaemonize设为 yes让 Redis 在后台以守护进程方式运行。虽然后续我们是用 systemd 来管理不再依赖这个参数但设置成 yes 在某些手动启动场景下会更顺手。bind默认是 127.0.0.1只允许本机访问。如果只有本机程序需要连 Redis保持默认就好如果有其他机器要连需要改成实际的内网 IP 或者 0.0.0.0同时配置密码千万别图省事直接 0.0.0.0 然后不设密码——那是把自己机器裸奔在网络上。port默认 6379没有特殊需求不用改。requirepass设置访问密码。虽然是明文存储在配置文件里但这是目前 Redis 最基础的访问控制手段强烈建议设置。dirRedis 持久化文件dump.rdb、appendonly.aof的存放目录。默认是当前启动目录最好改成固定目录比如 /var/lib/redis避免不同地方启动产生不同的持久化文件导致数据对不上。appendonly如果业务容忍丢少量数据还能接受可以保持 no 只开 RDB如果数据重要建议改成 yes 开启 AOF 持久化。3.2 注册成 systemd 服务这一步是整个安装流程里我最看重的部分。很多教程教人直接 redis-server 启动但这样有两个问题一是开机不会自动启动二是进程万一挂了不会自动拉起。注册成 systemd 服务后这些都由系统托管省心得多。创建服务文件vim /etc/systemd/system/redis.service内容如下[Unit] DescriptionRedis Server Afternetwork.target [Service] Typeforking ExecStart/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf ExecReload/bin/kill -USR2 $MAINPID ExecStop/bin/kill -SIGINT $MAINPID PIDFile/var/run/redis_6379.pid PrivateTmptrue [Install] WantedBymulti-user.target这里解释一下几个容易踩坑的点Typeforking配合配置文件的 daemonize yes系统会认为 fork 出来的子进程就是主服务进程。如果你的 redis.conf 里 daemonize 是 no那 Type 理论上应该用 simple其实也分场景但最稳妥的还是按我上面的组合来。PIDFile 路径要和 redis.conf 里的 pidfile 配置保持一致不然 systemd 可能读不到准确的进程号导致 stop 和 restart 动作失效。PrivateTmptrue 是为了安全隔离Redis 用不到 /tmp 目录的敏感资源开着无妨。保存之后执行重载和启动systemctl daemon-reload systemctl start redis systemctl enable redis systemctl status redis看到 active (running) 就说明服务正常启动了。以后维护就用systemctl restart redis # 重启 systemctl stop redis # 停止 systemctl status redis # 查看状态3.3 启动验证与自测用 redis-cli 测试一下连接和认证/usr/local/redis/bin/redis-cli -a 你的密码 ping返回 PONG 说明一切正常。如果想测试写入读取/usr/local/redis/bin/redis-cli -a 你的密码 set test_key hello get test_key能正常返回 hello 就说明 Redis 完整可用。测试完建议把这个测试键删掉保持库干净del test_key4. 安全加固与常见问题排查4.1 密码认证与网络保护Redis 默认不设密码、只监听本机回环地址这在开发环境问题不大但放到生产环境就是灾难。我在给客户做交付的时候见过不止一次因为 Redis 裸奔被挖矿程序扫到、数据库被勒索清空的情况处理起来非常头疼。配置密码的格式很简单requirepass YourStrongPassword注意 Redis 的密码认证有几种模式早期版本只支持 requirepass 这种明文密码7.0 之后又加了 ACL 用户体系。单机使用场景直接用 requirepass 就够了简单有效。如果你要精细控制某个应用只能读不能写那再去研究 ACL把特定用户绑定到特定 key 前缀和命令集合上。另外如果 Redis 只是给本机应用用的bind 配置保持 127.0.0.1 不要再动这是最安全的方式。只有明确需要远程访问的场景才考虑改成内网 IP并在防火墙上放行对应端口。至于防火墙的具体操作麒麟系统上一般用 firewalldfirewall-cmd --permanent --add-port6379/tcp firewall-cmd --reload在没有配置密码和绑定内网 IP 之前绝对不要先把防火墙端口打开。4.2 常见错误与处理方法make: cc: Command not found说明 gcc 没有装好。执行 yum install -y gcc 重新装或者检查 PATH 是否包含 /usr/bin。zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory缺少 jemalloc 库。要么yum install -y jemalloc-devel要么干脆用 make MALLOClibc 跳过它Redis 一样能跑。*Could not create server TCP listening socket:6379: bind: Address already in use八成是有旧 Redis 进程还占着端口。先用netstat -tlnp | grep 6379查到进程 PIDkill 掉再启动。systemd 启动后状态是 active (exited)一般是 Type 配置和 daemonize 配置不匹配。检查 redis.conf 里的 daemonize 是否为 yes同时确认 PIDFile 路径是否正确。redis-cli 连接时报 NOAUTH Authentication required这是绝对正常的——因为你设置了 requirepass 但没带密码。用redis-cli -a 密码或者进到交互界面先auth 密码即可。系统重启后 Redis 没起来检查一下systemctl is-enabled redis是不是返回 enabled。如果显示 disabled执行systemctl enable redis即可。4.3 几个现场实战经验经验一不要把 redis-server 直接跑在 /root 下有些朋友图省事下载完解压就直接在源码目录里启动 Redis。这样有个大坑redis.conf 里 dir 参数如果没改Redis 会把 dump.rdb 写在当前目录也就是 /root 或者其他随机目录。以后你要做备份或者迁移数据文件很难找。规范做法就是我上面写的把持久化目录单独建好比如 /var/lib/redis配置文件里显式指定一切都在掌控之内。经验二建议关闭 THP 透明大页如果你看 Redis 日志出现WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis.的警告那是内核开启了 THPRedis 的高频写入性能会受影响甚至偶尔出现延迟尖刺。临时关闭执行echo never /sys/kernel/mm/transparent_hugepage/enabled永久生效可以写入 /etc/rc.local 或创建 systemd 单元但考虑到麒麟系统的内核模块路径可能略有差异先用临时方式验证下效果也行。实际上大多数场景下只要你没有极端的高频小写入需求这个警告可以忽略但正式环境我还是建议关掉。经验三配置完 Redis Desktop Manager 连不上如果你用的是 Windows 上的 Redis Desktop ManagerRDM或者 Another Redis Desktop Manager 连麒麟服务器上的 Redis连不上时优先排查三样东西第一bind 是否允许远程访问第二防火墙 6379 端口是否放行第三selinux麒麟默认大多关闭但万一开着就要加规则。RDM 里填的地址应该用服务器的内网 IP 而不要写 127.0.0.1血泪教训很多人都是在这里卡了半小时。5. Redis 的基础玩法与性能验证5.1 简单测试一下读写性能Redis 装完、服务跑起来之后我习惯先用自带的 redis-benchmark 快速测一下机器性能确认没有配置上的硬伤。/usr/local/redis/bin/redis-benchmark -h 127.0.0.1 -p 6379 -a 你的密码 -c 50 -n 100000-c 是并发连接数-n 是请求总数。我拿一台 4 核 8G 的麒麟服务器跑了下SET/GET 基本在 8 万到 10 万 QPS 出头这个数据在单机缓存场景下完全够用了。如果你测出来只有几千 QPS那大概率是配置有问题或者机器负载太高得往网络、CPU 亲和性这些方向排查。5.2 Redis 你真的用对了吗装完 Redis 只是开始真正重要的是你会不会用它。平时给团队做分享的时候我经常强调一个点Redis 不是万能的但理解它的核心数据类型能帮你解决大量实际业务问题。String最基础缓存热点数据、计数器、分布式锁都能用。Hash适合存对象比如用户信息、商品详情替代数据库的重复查询。List消息队列的简单实现或者存最近浏览记录这类有时间顺序的数据。Set去重场景比如标签体系、关注关系还能做交集并集运算。ZSet带权重的有序集合排行榜功能基本都用它。我见过不少项目Redis 装了但实际使用还停留在“存个 key读个 value”的阶段。其实光是把数据库的热点查询换到 Redis Hash 上接口响应时间就能从几百毫秒降到几毫秒效果立竿见影。还有一个小建议生产环境务必开 AOF 持久化并且用 everysec 的写盘策略——最多丢 1 秒数据但不会因为断电导致整个缓存数据全丢。纯内存模式的 Redis 一旦宕机重启缓存全失对高业务量系统来说可能就是一场事故。5.3 升级 Redis 的注意事项如果你后续想升级 Redis 版本比如从 6.x 升到 7.x流程也很简单下载新源码包、编译、停掉旧服务、替换二进制文件、启动新服务。但有两个坑要提醒你不同大版本的 RDB 文件格式可能不兼容升级前一定要备份 dump.rdb 和 appendonly.aof 文件。我在现场就遇到过 Redis 7 启动时因为旧 RDB 文件格式问题导致加载失败的情况把备份文件恢复回去才没造成数据事故。如果启用了 ACL 用户配置或者旧版本的 Lua 脚本升级前一定要仔细对比官方 release notes有些行为变更不兼容。6. 写在最后的几点建议这套“银河麒麟源码编译安装 Redis systemd 托管”的流程我在好几台机器上都完整跑过了从 X86 服务器到 ARM 架构的机器都有基本不会因为架构差异翻车这也是为什么我最后坚持写成教程分享出来。有一点额外想告诉你的不要看到网上有人用 docker 跑 Redis 就直接抄。容器化在开发和测试环境确实方便但在银河麒麟这种偏稳定交付的服务器系统上直接二进制安装 Redis资源占用更小、排查问题更直观、和系统集成的体验也更好。等以后业务量真的起来了、需要主从或者集群了再考虑上 docker 编排也不晚。对了如果你装完之后发现 Redis 占了大量内存——别急着怀疑是不是系统中毒了。先去 redis-cli 里执行info memory看看 used_memory_human 和 used_memory_rss 的差距。Redis 会因为内存碎片和预分配策略RSS 占用比实际数据量高出一截这是正常现象。实在觉得高可以配置 maxmemory 限制 Redis 最大可用内存加上 maxmemory-policy allkeys-lru 让它自动淘汰冷数据就能把内存控制在合理范围内。这也算是我这些年折腾 Redis 的一个心得工具装起来很容易难的是理解它为什么这么设计然后在真实场景里把它用对。希望这篇教程能帮你少走点弯路。
返回列表