Redis 二进制安装与 systemd 管理
本文档采用“源码编译生成二进制文件 + 自定义目录 + systemd 托管”的部署方式。Redis OSS 官方 release 包本质上是源码包,需要先编译生成 redis-server、redis-cli 等二进制文件,再安装到规划目录中。
环境要求
| 项目 | 建议 |
|---|---|
| 操作系统 | CentOS 7.9+ / Rocky Linux 8+ / Ubuntu 20.04+ |
| CPU | 2 核及以上 |
| 内存 | 测试环境 2GB+,生产环境按数据量评估 |
| 磁盘 | 建议 SSD,持久化和备份目录预留足够空间 |
| 用户 | 使用独立 redis 用户运行 |
部署规划
程序目录和实例目录分开。升级 Redis 时只切换 current 软链接,不直接改动数据目录。
/data/app/redis/
├── redis-7.2.5/ # Redis 安装目录
└── current -> redis-7.2.5/ # 当前版本软链接
/data/redis/
└── 6379/
├── conf/
│ └── redis.conf # 实例配置
├── data/ # RDB / AOF 数据
├── logs/
│ └── redis.log # 运行日志
├── run/
│ └── redis.pid # PID 文件
├── backup/ # 备份目录
└── scripts/ # 运维脚本
多实例部署时按端口拆分:
/data/redis/
├── 6379/
├── 6380/
└── 6381/
安装编译依赖
CentOS / RHEL / Rocky Linux:
yum install -y gcc make tar wget tcl openssl-devel systemd-devel
如果使用 Rocky Linux 8+ / RHEL 8+,也可以使用 dnf:
dnf install -y gcc make tar wget tcl openssl-devel systemd-devel
Ubuntu / Debian:
apt-get update
apt-get install -y build-essential tcl wget tar ca-certificates libssl-dev libsystemd-dev
创建用户和目录
CentOS / RHEL / Rocky Linux:
useradd -r -s /sbin/nologin redis
Ubuntu / Debian:
adduser --system --group --no-create-home --shell /usr/sbin/nologin redis
创建部署目录:
mkdir -p /data/app/redis
mkdir -p /data/redis/6379/{conf,data,logs,run,backup,scripts}
chown -R redis:redis /data/app/redis /data/redis
下载和编译
以下以 7.2.5 为例,实际部署时按标准版本选择。
cd /data/app/redis
export REDIS_VERSION=7.2.5
wget https://download.redis.io/releases/redis-${REDIS_VERSION}.tar.gz
tar -xzf redis-${REDIS_VERSION}.tar.gz
cd redis-${REDIS_VERSION}
编译 Redis:
make -j "$(nproc)" BUILD_TLS=yes USE_SYSTEMD=yes
参数说明:
| 参数 | 说明 |
|---|---|
BUILD_TLS=yes | 编译 TLS 支持,需要 OpenSSL 开发库 |
USE_SYSTEMD=yes | 编译 systemd notify 支持,配合 supervised systemd 和 Type=notify |
可选执行测试:
make test
安装到指定目录:
make PREFIX=/data/app/redis/redis-${REDIS_VERSION} install
ln -sfn /data/app/redis/redis-${REDIS_VERSION} /data/app/redis/current
chown -R redis:redis /data/app/redis
检查二进制文件:
/data/app/redis/current/bin/redis-server --version
/data/app/redis/current/bin/redis-cli --version
基础配置
创建 /data/redis/6379/conf/redis.conf:
bind 0.0.0.0
protected-mode yes
port 6379
daemonize no
supervised systemd
pidfile /data/redis/6379/run/redis.pid
loglevel notice
logfile /data/redis/6379/logs/redis.log
dir /data/redis/6379/data
dbfilename dump.rdb
requirepass change-me
masterauth change-me
maxmemory 1gb
maxmemory-policy allkeys-lru
appendonly yes
appenddirname appendonlydir
appendfsync everysec
save 900 1
save 300 10
save 60 10000
slowlog-log-slower-than 10000
slowlog-max-len 128
生产环境不要使用示例密码,建议通过配置管理或密钥系统统一分发。
关键配置说明:
| 配置 | 说明 |
|---|---|
daemonize no | 交给 systemd 管理进程,不让 Redis 自己后台化 |
supervised systemd | Redis 向 systemd 通知启动状态 |
dir | RDB / AOF 数据目录 |
appendonly yes | 开启 AOF,降低异常宕机的数据丢失窗口 |
maxmemory | 实例最大内存,需要按机器容量和业务数据量调整 |
systemd 服务
创建 /etc/systemd/system/redis-6379.service:
[Unit]
Description=Redis Server 6379
Documentation=https://redis.io/docs/
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis-6379
RuntimeDirectoryMode=0755
PIDFile=/data/redis/6379/run/redis.pid
ExecStart=/data/app/redis/current/bin/redis-server /data/redis/6379/conf/redis.conf --supervised systemd
ExecStop=/data/app/redis/current/bin/redis-cli -a change-me -p 6379 shutdown
Restart=always
RestartSec=5
TimeoutStartSec=90
TimeoutStopSec=90
LimitNOFILE=100000
PrivateTmp=true
ProtectSystem=full
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
加载并启动:
systemctl daemon-reload
systemctl enable --now redis-6379
systemctl status redis-6379
查看日志:
journalctl -u redis-6379 -n 100
tail -f /data/redis/6379/logs/redis.log
启动验证
/data/app/redis/current/bin/redis-cli -a change-me -p 6379 ping
/data/app/redis/current/bin/redis-cli -a change-me -p 6379 info server
/data/app/redis/current/bin/redis-cli -a change-me -p 6379 info persistence
期望 ping 返回:
PONG
检查 systemd 和 Redis 配置:
systemctl is-enabled redis-6379
systemctl is-active redis-6379
/data/app/redis/current/bin/redis-cli -a change-me -p 6379 config get dir
/data/app/redis/current/bin/redis-cli -a change-me -p 6379 config get appendonly
防火墙放行
生产环境建议只允许业务网段访问 Redis,不要直接对公网开放。
CentOS / RHEL / Rocky Linux:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port protocol="tcp" port="6379" accept'
firewall-cmd --reload
firewall-cmd --list-all
Ubuntu / Debian:
ufw allow from 10.0.0.0/24 to any port 6379 proto tcp
ufw status numbered
内核参数
Redis 建议开启内存 overcommit,并调大 TCP backlog。
cat > /etc/sysctl.d/99-redis.conf <<'EOF'
vm.overcommit_memory = 1
net.core.somaxconn = 1024
EOF
sysctl --system
关闭透明大页:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
使用 systemd 持久化关闭透明大页:
cat > /etc/systemd/system/disable-transparent-huge-pages.service <<'EOF'
[Unit]
Description=Disable Transparent Huge Pages
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=redis-6379.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'
[Install]
WantedBy=basic.target
EOF
systemctl daemon-reload
systemctl enable --now disable-transparent-huge-pages
systemctl status disable-transparent-huge-pages
常用管理命令
# 启动
systemctl start redis-6379
# 停止
systemctl stop redis-6379
# 重启
systemctl restart redis-6379
# 查看状态
systemctl status redis-6379
# 开机自启
systemctl enable redis-6379
# 取消开机自启
systemctl disable redis-6379
Redis CLI 常用检查:
/data/app/redis/current/bin/redis-cli -a change-me -p 6379 info memory
/data/app/redis/current/bin/redis-cli -a change-me -p 6379 info clients
/data/app/redis/current/bin/redis-cli -a change-me -p 6379 slowlog get 10
升级流程
- 下载并编译新版本到
/data/app/redis/redis-x.y.z。 - 在测试环境验证配置兼容性和数据恢复。
- 生产环境停止实例前备份 RDB / AOF。
- 停止 Redis:
systemctl stop redis-6379。 - 切换
/data/app/redis/current软链接到新版本目录。 - 启动 Redis:
systemctl start redis-6379。 - 检查
systemctl status、Redis 日志、INFO输出和业务连接。
回滚时切回旧版本软链接,再重启服务。