ARTICLE · 1356797
D0329. Redis 源码编译安装(Ubuntu 24.04):apt 只给 7.0,源码 make 一把出 8.10
Ubuntu 24.04 系统源里的 redis-server 实测是 7.0.15,官方源(packages.redis.io)到 8.10.3。要 8.x、要 JSON/时序模块、要 TLS+systemd 全套定制,源码编译是最直的路。这篇按 8.10.3 官方源码 README 实测参数落地 noble:核心/TLS/systemd/全模块四档边界画清楚,再和 apt 的 7.0 双轨并存。
一、noble 上"哪档编得起来"(8.10.3 官方 README 实测)
先划清决策线:只要 8.x 核心,官方 apt 源(packages.redis.io,noble 通道到 8.10.3)是最省事的,别碰源码;源码编译在 Ubuntu 上的真实增量是全模块档(JSON/时序/布隆/查询引擎,官方 apt 包里不带)和 TLS/systemd 通知的编译期定制——这两样只有源码给得了。
make build redis | ||
make BUILD_TLS=yes USE_SYSTEMD=yes | ||
make bootstrap && make modules-update && make | make bootstrap 自动装 LLVM 21/CMake/Rust 1.94/Python3 依赖 |
全模块档的硬约束:CMake 卡 3.25–3.31.6,4.x 编不过。noble 的 cmake 在范围内没问题;26.04 这类默认 CMake 4 的系统先
pip3 install 'cmake==3.31.6'pin 住再编。
二、核心 + TLS + systemd 编译
# 1) 依赖(包名 noble 实测存在)
sudo apt update
sudo apt install -y build-essential libssl-dev libsystemd-dev pkgconf python3
# 2) 源码(release tarball 自带模块源码;只编核心的话装完就停在这一步也行)
curl -O https://github.com/redis/redis/releases/download/8.10.3/redis-full.tar.gz
tar xzf redis-full.tar.gz && cd redis-8.10.3
# 3) 编译安装(默认 PREFIX=/usr/local)
make BUILD_TLS=yes USE_SYSTEMD=yes -j"$(nproc)"
sudo make install
# 4) 用户与配置
sudo useradd -m redis 2>/dev/null || true
sudo mkdir -p /etc/redis /data/redis-8 && sudo chown -R redis /etc/redis /data/redis-8
/etc/redis-8.conf 最小化四条:port(双轨就错开,6379 留给 apt 线)、dir /data/redis-8(RDB/AOF 落位)、requirepass(生产必设)、appendonly yes(掉电不丢写)。TLS 线再加 tls-port + tls-cert-file/tls-key-file(证书按源码 TLS.md 自签,ca/server/client 三件)。这四条之外,内存不够的机器把 maxmemory + maxmemory-policy 也写上,别等 OOM 被 systemd 杀掉了才想起淘汰策略——源码版没有发行版默认配置兜底,redis.conf 出厂只有注释,全部配置项都是你自己填的,这是它和 apt 版最大的运维心智差异。
三、全模块档(JSON/时序/查询引擎,可选)
模块不是越多越好,按用途选:要半结构化文档存查询选 JSON;做 IoT/指标存储选 TimeSeries;要布隆过滤降回表成本选 Bloom;要复杂检索(全文/向量)才上查询引擎。只编需要的,.so 少一份就少一份升级面。
make bootstrap # 官方脚本:探测系统并安装模块前置(LLVM 21/CMake 3.25-3.31.6/Rust 1.94)
make modules-update # 拉全模块源码(tarball 已带可跳过)
make BUILD_TLS=yes USE_SYSTEMD=yes -j"$(nproc)"
sudo make install # 模块 .so 落 /usr/local/lib/redis/modules,install 会自动改配置里 loadmodule 路径
档位选择的原则:默认核心档(零依赖、最省维护面);有 TLS 需求加
BUILD_TLS=yes;要 systemd 状态准确加USE_SYSTEMD=yes;模块按业务逐个开。四档的编译时间差异巨大(核心几分钟,全模块要 LLVM/Rust 全家桶,半小时起),排工期时按全模块档估,别按核心档排。
redis-full.conf是make modules-update生成的全量配置(模块 loadmodule + 各模块段已烤好);只编核心时直接用redis.conf即可,别拷错配置文件。
四、与 apt redis 7.0 双轨并存
sudo apt install -y redis-server # apt 线:7.0.15,服务 redis-server.service,端口 6379
/usr/bin/redis-server | /usr/local/bin/redis-server | |
redis-server.service | redis8.service | |
/var/lib/redis/etc/redis/redis.conf | /etc/redis-8.conf + /data/redis-8 | |
apt upgrade |
二进制互不覆盖的前提是源码版加后缀:
make ... PROG_SUFFIX="-alt",出来redis-server-alt/redis-cli-alt,unit 里同步改全路径。端口错开(6379 apt / 6399 源码),requirepass各自独立。
五、服务化(notify 版)
sudo tee /etc/systemd/system/redis8.service <<'EOF'
[Unit]
Description=Redis 8.10 (source build, TLS+systemd)
After=network-online.target
[Service]
Type=notify
User=redis
ExecStart=/usr/local/bin/redis-server /etc/redis-8.conf --daemonize no
ExecReload=/bin/kill -HUP $MAINPID
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now redis8
Type=notify的前提是编译带了USE_SYSTEMD=yes;忘带就回Type=forking+daemonize yes。LimitNOFILE是 Redis 的硬需求(默认 1024 根本不够),发行版 unit 代管的那台不用操心,自己写的这台必须写。
六、验证测试
sudo -u redis /usr/local/bin/redis-cli -p 6399 ping
sudo -u redis /usr/local/bin/redis-cli -p 6399 info server | grep -E 'redis_version|tcp_port'
sudo -u redis /usr/local/bin/redis-cli -p 6379 info server | grep redis_version # apt 线还是 7.0.x
# 全模块线:JSON 命令一把梭
sudo -u redis /usr/local/bin/redis-cli -p 6399 json.set user:1 '$' '{"age":30}'
sudo ufw allow 6399/tcp
逐项对:info server 里 redis_version 回 8.10.x 且 run_id 非空(集群模式下 run_id 是节点身份,双轨机两条线的 run_id 不同,别把 7 线的复制指向 8 线);json.set 回 OK 才算全模块档真的编进去了;apt 线 6379 的 version 仍停在 7.0.x,两行对比就是双轨成立的最直观证据。
跑通 ping 之后补一手冷启动验收:systemctl stop redis8 && systemctl start redis8——源码 unit 是手写的,第一次重启能暴露配置路径/属主/notify 开关这类所有问题,比等人肉报障便宜。
七、升级策略
小版本(8.10.x 内部):重编替换 /usr/local/bin,数据目录 RDB/AOF 同大版本内直接兼容,stop 换 start 即可;升级前 redis-cli save 留一份 RDB 兜底。7→8 跨代:新实例起来后 DUMP/RESTORE 逐 key 迁移(值格式向下兼容),别拿 8 直接开 7 的数据目录。
升级之外,源码线还有一件事 apt 线自动帮你做了:模块 .so 跟着构建走。全模块版升级重编后,/usr/local/lib/redis/modules 下的 .so 要整目录替换(loadmodule 路径不变),混用新旧 .so 会出 ABI 事故,替换前先 redis-cli module list 记一笔。
八、常见坑
loadmodule | redis-full.conf 没跑 install 的路径重写 | make install(自动改 loadmodule 路径),或手改 .so 路径 |
PROG_SUFFIX 隔离二进制 |
上一篇:D0328. Redis 源码编译安装(RHEL 族系) | 下一篇:D0330. MySQL 源码编译安装(RHEL 族系)
#DevOps #Redis #源码编译 #Ubuntu #全模块 #运维实战















































































