Redis 数据库工程化部署安装流程

Redis 数据库工程化部署安装流程

📌 文档说明 :本文档以 Docker 方式快速部署 Redis 7.2。为兼顾可读性,教程中直接使用了示例访问密码 redis123,便于初学者照做。生产环境请务必修改默认密码并收紧访问权限(详见下文「安全提醒」)


目录

  • 一、配置需求
  • 二、大概流程简述
  • 三、验证环节
  • 四、具体流程(docker-compose 工程化部署)
  • 五、常用管理命令
  • 六、验证连接
  • 七、备份与恢复
  • 八、监控与告警
  • 九、故障排查
  • 十、升级与回滚
  • 附录 A:安全加固清单
  • 附录 B:配置参数速查表

一、配置需求

1. 系统要求
  • 一台装了 Docker 的服务器
  • 该服务器能与本地 win 电脑 ping 通
  • 操作系统:Ubuntu 22.04(推荐)
2. 资源需求
  • Redis 7.2 镜像(Docker 官方仓库)
  • 国内的能用来拉取镜像的 docker 镜像源
3. 预备配置参数
参数
端口 6379
访问密码 redis123
数据目录(宿主机) /opt/redis/data
配置目录(宿主机) /opt/redis/conf
备份目录(宿主机) /opt/redis/backup

二、大概流程简述

  1. 拉取官方 Redis 镜像
  2. 编写 redis.conf 配置文件(持久化、内存策略、安全)
  3. 编写 docker-compose.yml 部署文件
  4. 调整宿主机内核参数(Redis 专用优化)
  5. 启动容器(含数据持久化、健康检查、资源限制、日志轮转)
  6. 验证连接

三、验证环节

1. 验证 Docker 环境
复制代码
# 检查 Docker 是否安装
sudo docker --version

(如图所示结果)

显示类似 Docker version 24.03.1, build xxxx 就说明已安装。

复制代码
# 检查 Docker 服务是否运行
sudo systemctl status docker

(如图所示结果)

看到 active (running) 就正常。

退出查看:ctrl+c

2. 验证镜像源是否能进行拉取镜像
复制代码
# 拉取测试镜像
sudo docker pull hello-world

(失败结果如图所示)

(成功结果如图所示)

能正常运行就说明镜像源没问题。

如果拉取失败,配置国内 Docker 镜像加速器

创建文件

复制代码
sudo mkdir -p /etc/docker

sudo vim /etc/docker/daemon.json

配置加速镜像 清空文件内容,写入以下 JSON(注意格式)

开始编写按:i

json 复制代码
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.1ms.run",
    "https://docker.anyhub.us.kg"
  ],
  "dns": ["223.5.5.5", "114.114.114.114"]
}

退出编写+保存+退出:esc+:wq

应用配置

复制代码
sudo systemctl daemon-reload

重启 docker

复制代码
sudo systemctl restart docker

配置成功后,重新执行上面的拉取命令测试即可。

四、具体流程(docker-compose 工程化部署)

💡 本节使用 docker-compose 将部署配置文件化,做到「一份配置,处处可起」,便于维护、复现与升级。密码仍沿用 redis123(仅教程示例,生产请修改)。

1. 拉取 Redis 镜像
复制代码
sudo docker pull redis:7.2
2. 准备部署目录
复制代码
sudo mkdir -p /opt/redis/{data,conf,backup,logs}
cd /opt/redis
3. 调整宿主机内核参数(Redis 工程化关键)

Redis 对内核有两个硬性要求,不改会导致后台保存失败或性能下降:

复制代码
# 1) 允许内存超分,否则 BGSAVE 可能因 fork 失败而报错
sudo sysctl -w vm.overcommit_memory=1

# 2) 增大最大连接数队列,避免高并发下连接被丢弃
sudo sysctl -w net.core.somaxconn=1024

# 3) 关闭透明大页 THP(会导致 fork 延迟飙升)
sudo bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
sudo bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'

写入配置使其重启后永久生效

复制代码
sudo tee -a /etc/sysctl.conf > /dev/null <<'EOF'
vm.overcommit_memory = 1
net.core.somaxconn = 1024
EOF

将 THP 关闭命令加入开机自启(rc.local 或 systemd 单元),避免重启后失效。

📌 说明:以上三项是 Redis 官方文档明确列出的生产建议,漏配往往在数据量上来后才暴露问题。

4. 编写 redis.conf

/opt/redis/conf/ 目录下创建 redis.conf

复制代码
sudo vim /opt/redis/conf/redis.conf

写入以下内容(开始编写按 i,退出按 esc+:wq):

ini 复制代码
# /opt/redis/conf/redis.conf

################################# 网络 #################################
bind 0.0.0.0                # 允许外部访问;生产建议改为内网 IP
protected-mode yes          # 保护模式:无密码时拒绝外部访问
port 6379
tcp-backlog 511
timeout 0                   # 客户端空闲不主动断开
tcp-keepalive 300

################################# 通用 #################################
daemonize no                # 容器内必须为 no,由 Docker 管理前台进程
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
databases 16

################################# 安全 #################################
requirepass redis123        # 访问密码(示例,生产请用强密码)
# 禁用/重命名危险命令,防止误操作清空数据
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command KEYS ""

################################# 内存 #################################
maxmemory 1gb               # 上限按宿主机内存规划,预留缓冲
maxmemory-policy allkeys-lru   # 达到上限后淘汰最近最少使用的 key

################################# 持久化(RDB) ########################
save 900 1                  # 900s 内至少 1 个 key 变化则触发快照
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
dbfilename dump.rdb
dir /data                   # 容器内数据目录(与挂载点对应)

################################# 持久化(AOF) ########################
appendonly yes              # 开启 AOF,数据更安全(默认 no)
appendfilename "appendonly.aof"
appendfsync everysec        # 每秒刷盘,兼顾性能与安全
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

📌 说明bind 0.0.0.0 + requirepass 必须配合使用;若密码为空则 protected-mode 会拒绝外部连接。

5. 授权目录属主
复制代码
# 官方 redis 镜像内运行账户的 UID:GID 为 999:999
sudo chown -R 999:999 /opt/redis/data /opt/redis/conf /opt/redis/logs

📌 说明:授权后容器才有权读写挂载的数据与配置目录。

6. 编写 docker-compose.yml

/opt/redis/ 目录下创建 docker-compose.yml

yaml 复制代码
# /opt/redis/docker-compose.yml
services:
  redis:
    image: redis:7.2
    container_name: redis_server
    restart: unless-stopped          # 宕机自动拉起,手动停止则不拉起
    # 通过自定义配置启动;密码沿用 redis123(示例,生产请改强密码)
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    ports:
      - "6379:6379"                  # 对外暴露端口;如仅需本机访问改为 "127.0.0.1:6379:6379"
    volumes:
      - /opt/redis/data:/data                              # 数据持久化(RDB + AOF)
      - /opt/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf  # 挂载配置文件
      - /opt/redis/logs:/logs                              # 预留日志目录
    environment:
      TZ: Asia/Shanghai
    # 资源限制,避免单个容器拖垮宿主机
    deploy:
      resources:
        limits:
          cpus: '2.0'
          memory: 2G
    # 健康检查:容器假活时能被发现
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "redis123", "ping"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 10s
    # 日志轮转,防止日志撑满磁盘
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
7. 启动服务
复制代码
# 后台启动(老版本命令:sudo docker-compose up -d)
# 老版本不支持 docker compose(空格分隔)这个子命令。
sudo docker compose up -d

# 查看状态(等待片刻后 STATUS 应显示 healthy)
sudo docker compose ps

# 查看实时日志
sudo docker compose logs -f redis
8. 验证服务可用
复制代码
sudo docker exec -it redis_server redis-cli -a redis123 ping

返回 PONG 即表示 Redis 正常工作。

⚠️ 安全提醒(务必阅读)

  • bind 0.0.0.0 + 弱密码 redis123 在公网环境极危险,历史上大量 Redis 被挖矿/勒索都是因此。生产环境务必修改为强密码 ,并将 bind 收紧为内网 IP。
  • 6379 端口不要直接暴露公网,应通过防火墙/安全组限制来源 IP。
  • 禁用了 CONFIG 命令后,所有配置变更必须改 redis.confdocker compose restart,避免线上被任意改配置。
  • 应用代码中不要硬编码密码,推荐使用环境变量或配置中心。

五、常用管理命令

以下命令均在 /opt/redis/ 目录(docker-compose.yml 所在目录)下执行。

复制代码
# 查看容器状态
sudo docker compose ps

# 查看实时日志
sudo docker compose logs -f redis

# 停止服务(保留数据)
sudo docker compose stop

# 启动服务
sudo docker compose start

# 重启服务(修改配置后使其生效)
sudo docker compose restart

# 进入容器内的 redis-cli
sudo docker exec -it redis_server redis-cli -a redis123

# 进入容器 shell 排查
sudo docker exec -it redis_server bash

# 停止并删除容器(数据目录 /opt/redis/data 保留,不会丢数据)
sudo docker compose down

# 修改 compose 或 redis.conf 后重新生效
sudo docker compose up -d

进入 redis-cli 后常用命令:

复制代码
INFO                        # 查看服务综合信息(内存、连接、持久化)
DBSIZE                      # 当前库 key 数量
MEMORY USAGE <key>          # 查看单个 key 占用内存
CONFIG GET maxmemory        # 注意:本配置已禁用 CONFIG,仅供未禁用时参考
CLIENT LIST                 # 查看当前连接的客户端
SLOWLOG GET 10              # 查看最近 10 条慢查询

六、验证连接

1. 服务器本地验证
复制代码
# 进入容器内部连接 Redis
sudo docker exec -it redis_server redis-cli -a redis123

(成功结果如图所示)

2. Windows 本地连接
使用 Python 测试连接

进入虚拟环境,安装 redis 库:

复制代码
pip install redis

(成功结果如图所示)

创建测试脚本:

python 复制代码
# test01.py

import redis

try:
    r = redis.Redis(
        host="192.168.1.128",
        port=6379,
        password="redis123",
        decode_responses=True,
    )
    # 写入
    r.set("hello", "redis-world")
    # 读取
    print("连接成功!hello =", r.get("hello"))
    print("Redis 版本:", r.info()["redis_version"])
except Exception as e:
    print("连接失败:", e)
finally:
    r.close()

⚠️ 注意 :请将代码中的 192.168.1.128 替换为您自己的服务器 IP 地址。

(成功结果如图所示)

运行脚本:

复制代码
python test01.py

七、备份与恢复

Redis 的备份有两条路:RDB 快照AOF 文件 ,二者都在 /opt/redis/data 中。没有备份等于裸奔

1. 手动备份(物理文件拷贝)

最安全的方式是先触发 BGSAVE,再拷贝文件

复制代码
# 1) 触发后台保存,生成最新的 dump.rdb
sudo docker exec redis_server redis-cli -a redis123 BGSAVE

# 2) 等 BGSAVE 完成后拷贝到备份目录
sudo cp /opt/redis/data/dump.rdb /opt/redis/backup/dump_$(date +%F).rdb
sudo cp /opt/redis/data/appendonly.aof /opt/redis/backup/appendonly_$(date +%F).aof 2>/dev/null

📌 说明 :务必先 BGSAVE 再拷贝,否则拷到的是上一次快照,可能丢最近写入。

2. 定时备份(crontab)

在宿主机执行 crontab -e,添加:

复制代码
# 每天凌晨 2:30 触发 BGSAVE 并备份 RDB+AOF,保留最近 14 天
30 2 * * * docker exec redis_server redis-cli -a redis123 BGSAVE && sleep 30 && cp /opt/redis/data/dump.rdb /opt/redis/backup/dump_$(date +\%F).rdb && find /opt/redis/backup -name "dump_*.rdb" -mtime +14 -delete

⚠️ 注意 :crontab 中 % 必须转义为 \%,否则命令会被截断。

3. 恢复
复制代码
# 1) 停止服务
cd /opt/redis && sudo docker compose stop

# 2) 用备份覆盖数据目录(清空前确认!)
sudo cp /opt/redis/backup/dump_2026-06-26.rdb /opt/redis/data/dump.rdb
# 若开启 AOF,建议同时覆盖 appendonly.aof 或先关闭 AOF 再用 RDB 恢复

# 3) 重新启动
sudo docker compose start

⚠️ 注意:恢复前请先停止业务写入;RDB 与 AOF 同时存在时 Redis 优先加载 AOF,若两者不一致以 AOF 为准。重要数据建议先在测试库演练。


八、监控与告警

容器跑起来不等于健康,需要持续监控。

1. 容器层面
复制代码
# 实时资源占用
sudo docker stats redis_server

# 健康状态(compose 方式下已配置 healthcheck)
sudo docker inspect --format='{{.State.Health.Status}}' redis_server
2. Redis 层面(轻量方案)

进入 redis-cli 后执行:

复制代码
# 综合信息(重点看 used_memory、connected_clients、rdb_last_bgsave_status)
INFO

# 内存使用详情
MEMORY STATS

# 连接的客户端列表
CLIENT LIST

# 最近慢查询
SLOWLOG GET 10

# 持久化失败计数(rdb_last_bgsave_status 应为 ok)
INFO persistence

重点关注指标:

指标 含义 健康信号
used_memory 已用内存 接近 maxmemory 需扩容或调淘汰策略
connected_clients 当前连接数 异常飙升可能为连接泄漏
rdb_last_bgsave_status 最近一次 RDB 结果 必须 ok
rejected_connections 被拒连接数 持续 > 0 说明 somaxconn/并发超限
keyspace_misses 未命中次数 突增可能为缓存穿透
3. 专业监控(可选,进阶)

接入 redis_exporter + Prometheus + Grafana,可图形化监控内存、命中率、持久化延迟、主从复制状态等,并配置告警(邮件/钉钉/飞书)。


九、故障排查

现象 可能原因 解决方案
容器启动后立即退出 daemonize yes 导致无前台进程 redis.conf 中必须 daemonize no;查看 sudo docker compose logs redis
连接提示 NOAUTH 未带密码 / 密码错误 redis-cli -a redis123,确认密码与 requirepass 一致
连接提示 MISCONF Redis is configured to save RDB... fork 失败,vm.overcommit_memory=0 执行 sudo sysctl -w vm.overcommit_memory=1
远程连接被拒绝 未监听 / 防火墙拦截 确认 bind 0.0.0.0;`ss -tlnp
内存打满被频繁淘汰 maxmemory 过小 / 大 key INFO memory 查看;用 MEMORY USAGE 定位大 key
BGSAVE 卡顿/延迟高 THP 未关闭 关闭透明大页:echo never > .../enabled
磁盘写满 AOF 文件/日志未轮转 配置 AOF 自动重写;确认 compose 已配 logging 轮转
启动报 Bad file descriptor redis.conf 路径或挂载错误 确认 volume 挂载与 dir /data 一致
常用排查命令汇总
复制代码
# 看容器日志(最近 200 行)
sudo docker compose logs --tail 200 redis

# 进入容器排查
sudo docker exec -it redis_server bash

# 查看端口监听
ss -tlnp | grep 6379

# 查看磁盘空间
df -h

# 查看内核参数
sysctl vm.overcommit_memory net.core.somaxconn
cat /sys/kernel/mm/transparent_hugepage/enabled

十、升级与回滚

1. 升级前必做
复制代码
# 1) 手动触发并备份(务必!)
sudo docker exec redis_server redis-cli -a redis123 BGSAVE
sleep 30
sudo cp /opt/redis/data/dump.rdb /opt/redis/backup/pre_upgrade_$(date +%F).rdb

# 2) 停止并删除旧容器(数据目录保留)
cd /opt/redis
sudo docker compose down
2. 升级(修改 compose 中的镜像版本)

修改 docker-compose.yml 中的 image: redis:7.2 为新版本(如 redis:7.4),然后:

复制代码
sudo docker compose up -d

⚠️ 跨大版本升级(如 6.x → 7.x)需关注兼容性变更:Redis 7 默认开启 AOF 多文件格式(multi-part AOF),旧 AOF 文件会被自动迁移。升级前请阅读官方 Release Notes,并在测试库演练。小版本升级(7.2.4 → 7.2.5)通常可直接升级。

3. 回滚

若升级后异常:

复制代码
cd /opt/redis
# 1) 将 docker-compose.yml 的 image 改回旧版本(如 redis:7.2)
# 2) 用备份恢复数据
sudo docker compose stop
sudo cp /opt/redis/backup/pre_upgrade_2026-06-26.rdb /opt/redis/data/dump.rdb
# 3) 重新启动
sudo docker compose start

附录 A:安全加固清单

生产环境上线前,逐项确认:

  • 修改默认密码requirepass 使用 24 位以上强密码,禁用 redis123
  • 收紧 bindbind 改为内网 IP,不要 0.0.0.0 暴露公网
  • 网络隔离:6379 端口不直接暴露公网;通过防火墙/安全组限制来源 IP
  • 禁用危险命令FLUSHALL/FLUSHDB/CONFIG/KEYS 重命名为空或随机串
  • 开启 ACL(进阶) :Redis 6+ 支持 ACL,为不同应用分配独立账号与最小命令权限
  • 启用持久化加密传输:跨网段访问建议 Stunnel/SSH 隧道或 Redis 6+ 的原生 TLS
  • 内核三项vm.overcommit_memory=1somaxconn≥1024、关闭 THP
  • 凭证管理:密码通过环境变量/密钥管理服务注入,禁止硬编码进代码或镜像
  • 定期备份 :开启定时备份并演练恢复,备份文件异地存储
  • 版本补丁:关注 Redis 安全公告,及时升级小版本(如修复历史未授权访问 CVE)

附录 B:配置参数速查表

类别 参数 本文档取值 说明
连接 端口 6379 默认端口
连接 密码 redis123 教程默认,生产必须修改
持久化 数据目录(宿主机) /opt/redis/data 绑定挂载路径
持久化 数据目录(容器内) /data Redis dir 指向
持久化 RDB 文件 dump.rdb 快照文件
持久化 AOF 文件 appendonly.aof 追加日志文件
持久化 appendfsync everysec 每秒刷盘,兼顾性能与安全
内存 maxmemory 1gb 上限按宿主机规划
内存 淘汰策略 allkeys-lru 达上限淘汰最近最少使用
部署 compose 目录 /opt/redis docker-compose.yml 所在目录
部署 配置文件 /opt/redis/conf/redis.conf 自定义配置
镜像 版本 redis:7.2 官方镜像
容器 名称 redis_server 本文档统一命名
重启 策略 unless-stopped 宕机自动拉起,手动停止不拉起
内核 vm.overcommit_memory 1 允许内存超分,避免 fork 失败
内核 somaxconn 1024 增大连接队列
内核 THP never 关闭透明大页,降低 fork 延迟
时区 TZ Asia/Shanghai 在 compose 中设置

📝 维护建议 :本文档内嵌了大量截图,导致文件体积较大。建议后续将图片迁移至 docs/images/ 目录并以相对路径引用,便于 Git 版本管理与团队协作。