夜雨聆风学习资料网

ARTICLE · 1356797

D0329. Redis 源码编译安装(Ubuntu 24.04):apt 只给 7.0,源码 make 一把出 8.10

D0329. Redis 源码编译安装(Ubuntu 24.04):apt 只给 7.0,源码 make 一把出 8.10
个人开发了一个小程序,主要用于 A3 格式内容切分或缩小 A4 大小,两张 A5 发票合并为一个 A4 文档,方便打印。

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 通知的编译期定制——这两样只有源码给得了。

档位
命令
noble 工具链
核心
make build redis
gcc-13 自带,jemalloc 随源码打包,零依赖
核心 + TLS + systemd
make BUILD_TLS=yes USE_SYSTEMD=yes
libssl-dev 3.0 + libsystemd-dev,系统仓库直接装
全模块(JSON/TS/Bloom/查询引擎)
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

维度
apt redis 7.0
源码 redis 8.10
安装
/usr/bin/redis-server
(Debian 布局)
/usr/local/bin/redis-server
服务
redis-server.service
(Debian 自带 unit)
手写 redis8.service
数据/配置
/var/lib/redis
 + /etc/redis/redis.conf
自定:/etc/redis-8.conf + /data/redis-8
升级
apt upgrade
 补丁
重编 + RDB/AOF 直接兼容(同 8.x 大版本内)

二进制互不覆盖的前提是源码版加后缀: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 记一笔。

八、常见坑

现象
根因
处理
apt 装 8.x 想省事但版本不对
系统源只有 7.0.15,官方源才是 8.10.3
要么官方 apt 源(packages.redis.io)要么源码
全模块编到一半 CMake 报错
CMake 4.x 不在 3.25–3.31.6 区间
pin 3.31.6 后重编
loadmodule
 找不到 .so
手工拷了 redis-full.conf 没跑 install 的路径重写
走 make install(自动改 loadmodule 路径),或手改 .so 路径
systemd 起不来
notify 与编译开关不匹配
见第五节对照
双轨互相顶
端口/二进制/数据目录混用
端口 6379/6399 错开,PROG_SUFFIX 隔离二进制

上一篇:D0328. Redis 源码编译安装(RHEL 族系) | 下一篇:D0330. MySQL 源码编译安装(RHEL 族系)

#DevOps #Redis #源码编译 #Ubuntu #全模块 #运维实战

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料