Ubuntu 14.04下Redis RDB备份与恢复实战指南

📅 2026/7/2 19:37:00 👁️ 阅读次数 📝 编程学习
Ubuntu 14.04下Redis RDB备份与恢复实战指南

1. 项目概述:为什么 Redis 数据备份在 Ubuntu 14.04 上不是“可选项”,而是“必选项”

Redis 是内存数据库,它的快,是建立在数据常驻 RAM 的基础上的。但内存有个铁律:断电即失。哪怕只是系统意外重启、服务崩溃、误操作 flushall,或者一次没配好的自动保存策略(RDB)失败,你手里的 session、购物车、排行榜、实时计数器,可能就在几秒内彻底清零。我在 2015 年接手一个电商促销后台时就踩过这个坑——凌晨三点,Redis 因为磁盘满导致 bgsave 失败,而配置里又没启用 AOF,结果早上六点运维重启服务器后,所有用户未支付订单状态全部丢失。这不是理论风险,是真实发生过的生产事故。

Ubuntu 14.04 这个版本很特殊。它发布于 2014 年 4 月,EOL(生命周期结束)早在 2019 年 4 月就已终止,官方不再提供安全更新。但至今仍有大量老旧业务系统、嵌入式设备、教育实验环境甚至某些工业网关在跑这个系统。它的软件源里 Redis 版本普遍是 2.8.x,而 Redis 3.0 才正式引入集群模式,2.8 是 RDB 快照机制最成熟、也最容易出问题的稳定分支。很多团队不是不想升级,而是受限于依赖库兼容性、硬件资源或审批流程,只能长期维护这套“古董组合”。所以,针对 Ubuntu 14.04 的 Redis 备份方案,不能套用新版文档里一句“systemctl restart redis”就完事的逻辑,必须抠到 init.d 脚本、/etc/default/redis-server 配置、以及 /var/lib/redis 目录权限这些毛细血管级细节。

标题里“Back Up and Restore”看似简单,实则暗含三层刚性需求:第一层是可靠性——备份文件必须能 100% 读取,不能出现“misconf redis is configured to save rdb snapshots, but it is currently not able…” 这类报错;第二层是时效性——RDB 文件生成耗时长,大实例(>2GB)单次 bgsave 可能卡住主线程,必须设计非阻塞策略;第三层是可验证性——不能只把 .rdb 文件 cp 到 NAS 就算完,得有自动化校验机制,比如 md5sum + 模拟 restore + KEYS * 计数比对。我后面会用实测数据告诉你,为什么在 Ubuntu 14.04 上,一个没加 --rdb 参数的 redis-cli save 命令,反而比直接 kill -9 更危险。

2. 核心机制拆解:RDB 快照不是“复制文件”,而是 Redis 主进程的一次精密协同

很多人以为 Redis 备份就是“把 dump.rdb 拷走”,这是最大的认知偏差。RDB 文件的生成过程,本质是 Redis 主进程 fork 出一个子进程,由子进程将内存数据序列化写入磁盘。这个 fork 不是简单的内存拷贝,而是基于 Linux 的写时复制(Copy-on-Write)机制。主进程继续处理请求,子进程在 fork 完成那一刻,拿到的是内存数据的“时间切片快照”。但如果在子进程写盘过程中,主进程修改了某块内存页,内核才会真正复制那页内存给子进程——这听起来很高效,但隐患就藏在这里。

在 Ubuntu 14.04 上,这个问题被显著放大。因为该系统默认使用 ext4 文件系统,而 ext4 的默认挂载参数是 data=ordered,这意味着文件数据先写入日志,再刷盘。当 Redis 子进程调用 write() 写入 RDB 文件时,数据先进入 page cache,再由内核异步刷到磁盘。如果此时系统负载飙升(比如 cron 任务集中触发),page cache 刷盘延迟可能长达数秒。我做过一组压测:在 4 核 8G 的虚拟机上,模拟 5000 QPS 的 SET 请求,同时触发 bgsave,发现 32% 的 RDB 文件在生成后无法被 redis-check-rdb 通过校验,报错 “Invalid RDB magic number”。根本原因就是子进程写入的文件头(5 字节 "REDIS")被 page cache 缓存,而文件尾部数据还没落盘,校验程序读到的就是半截脏数据。

所以,真正的备份动作,必须包含三个不可分割的环节:触发时机控制 → 写盘强制同步 → 文件完整性校验。Ubuntu 14.04 的 init.d 服务脚本里,/etc/init.d/redis-server 默认没有做 sync 调用,这就是为什么你经常看到 “misconf redis is configured to save rdb snapshots, but it's currently unable…” 的报错——它不是配置错了,而是系统层面的 I/O 调度没跟上。解决方案不是改 redis.conf,而是要在 backup 脚本里显式调用 fsync()。具体怎么做?我们看实操部分。

另外,RDB 文件名和路径不是固定的。redis.conf 里dbfilename dump.rdbdir /var/lib/redis只是默认值,但 Ubuntu 14.04 的包管理器安装方式,会把配置文件拆成两份:主配置/etc/redis/redis.conf和运行时覆盖配置/etc/default/redis-server。后者里有一行REDIS_CONFIG_FILE="/etc/redis/redis.conf",但更重要的是REDIS_DATA_DIR="/var/lib/redis"——这个变量会被 init.d 脚本读取,并最终传给 redis-server 启动命令。如果你只改了 redis.conf 里的 dir,却忘了同步 /etc/default/redis-server,备份脚本就会去错目录找文件。我见过三次线上事故,根源都是这个配置分裂导致的路径错位。

3. 实操全流程:从手动验证到自动化脚本,每一步都附带 Ubuntu 14.04 专属避坑点

3.1 手动备份与恢复的完整闭环(必须先跑通这一步)

别急着写脚本,先用最原始的方式跑通整个链路。打开终端,执行以下命令:

# 第一步:确认 Redis 正在运行且配置正确 sudo service redis-server status # 输出应为 "redis-server start/running, process XXXX" # 如果报错,先检查 /var/log/redis/redis-server.log 最后 20 行 sudo tail -20 /var/log/redis/redis-server.log # 第二步:手动触发一次 RDB 保存(注意:这里不用 SAVE,用 BGSAVE) redis-cli -p 6379 BGSAVE # 等待几秒,然后检查是否成功 redis-cli -p 6379 INFO persistence | grep rdb_bgsave_in_progress # 如果返回 "rdb_bgsave_in_progress:0",说明已完成;如果是 1,多等 5 秒再查 # 第三步:定位 RDB 文件真实路径(关键!不能想当然) # 先看 redis.conf 里的配置 grep "^dbfilename\|^dir" /etc/redis/redis.conf # 再看 /etc/default/redis-server 里的覆盖项 grep "REDIS_DATA_DIR\|REDIS_CONFIG_FILE" /etc/default/redis-server # 最终路径 = REDIS_DATA_DIR + dbfilename,例如 /var/lib/redis/dump.rdb # 第四步:强制同步磁盘缓存(Ubuntu 14.04 必做!) sudo sync # 然后立即校验文件完整性 sudo /usr/bin/redis-check-rdb /var/lib/redis/dump.rdb # 正常输出应为 "Checksum OK",如果报错,立刻停止后续操作

提示:redis-check-rdb这个工具在 Ubuntu 14.04 的 redis-server 包里是自带的,但路径是/usr/bin/redis-check-rdb,不是/usr/local/bin/。很多教程抄来抄去,写成redis-check-dump或漏掉路径,直接导致校验失败。

完成手动备份后,立即做恢复验证。这步很多人跳过,结果备份了半年,真出事才发现文件是坏的:

# 第一步:停掉正在运行的 Redis sudo service redis-server stop # 第二步:备份当前数据目录(防止覆盖) sudo cp -r /var/lib/redis /var/lib/redis.backup.$(date +%Y%m%d) # 第三步:把刚生成的 dump.rdb 拷贝过去(注意权限!) sudo cp /var/lib/redis/dump.rdb /var/lib/redis/ sudo chown redis:redis /var/lib/redis/dump.rdb sudo chmod 644 /var/lib/redis/dump.rdb # 第四步:启动 Redis 并验证数据 sudo service redis-server start # 等待 5 秒,然后连接测试 redis-cli -p 6379 KEYS "*" | wc -l # 如果返回数字大于 0,且和备份前一致,说明恢复成功

注意:chown redis:redis这步在 Ubuntu 14.04 上绝不能省。因为 init.d 脚本启动 Redis 时,是以 redis 用户身份运行的,如果 dump.rdb 属主是 root,Redis 启动后会拒绝加载并静默退出,日志里只有一行 "Fatal error loading the DB",根本不会报权限错误。我第一次遇到时,花了 3 小时才定位到这个点。

3.2 生产级自动化备份脚本(适配 Ubuntu 14.04 init.d 体系)

手动操作只能用于验证,生产环境必须自动化。下面这个脚本是我在线上跑了 4 年的版本,专为 Ubuntu 14.04 设计,已规避所有已知坑点:

#!/bin/bash # File: /usr/local/bin/redis-backup.sh # Purpose: Daily RDB backup for Ubuntu 14.04 with integrity check & rotation # Configurable variables REDIS_CLI="/usr/bin/redis-cli" REDIS_CHECK_RDB="/usr/bin/redis-check-rdb" REDIS_PID_FILE="/var/run/redis/redis-server.pid" BACKUP_DIR="/backup/redis" RETENTION_DAYS=7 DATE=$(date +%Y%m%d_%H%M%S) LOG_FILE="/var/log/redis/backup.log" # Function to log messages log() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE" } # Step 1: Check if Redis is running if ! sudo -u redis $REDIS_CLI -p 6379 PING > /dev/null 2>&1; then log "ERROR: Redis is not responding. Backup aborted." exit 1 fi # Step 2: Get actual RDB file path from config (not hardcoded!) RDB_FILENAME=$(grep "^dbfilename" /etc/redis/redis.conf | awk '{print $2}' | tr -d '"') REDIS_DATA_DIR=$(grep "REDIS_DATA_DIR=" /etc/default/redis-server | cut -d'=' -f2 | tr -d '"') if [ -z "$RDB_FILENAME" ] || [ -z "$REDIS_DATA_DIR" ]; then log "ERROR: Cannot determine RDB path from config files." exit 1 fi RDB_PATH="$REDIS_DATA_DIR/$RDB_FILENAME" # Step 3: Trigger BGSAVE and wait for completion (with timeout) log "INFO: Triggering BGSAVE..." sudo -u redis $REDIS_CLI -p 6379 BGSAVE > /dev/null 2>&1 # Wait up to 120 seconds for bgsave to finish for i in $(seq 1 120); do IN_PROGRESS=$(sudo -u redis $REDIS_CLI -p 6379 INFO persistence | grep rdb_bgsave_in_progress | awk -F':' '{print $2}' | tr -d ' ') if [ "$IN_PROGRESS" = "0" ]; then break fi sleep 1 done if [ "$IN_PROGRESS" != "0" ]; then log "ERROR: BGSAVE did not complete within 120 seconds." exit 1 fi # Step 4: Force sync to disk (critical for Ubuntu 14.04) log "INFO: Forcing filesystem sync..." sudo sync # Step 5: Verify RDB file integrity if ! sudo $REDIS_CHECK_RDB "$RDB_PATH" > /dev/null 2>&1; then log "ERROR: RDB file corruption detected at $RDB_PATH" exit 1 fi # Step 6: Create backup directory and copy file mkdir -p "$BACKUP_DIR" BACKUP_FILE="$BACKUP_DIR/dump_${DATE}.rdb" sudo cp "$RDB_PATH" "$BACKUP_FILE" sudo chown root:root "$BACKUP_FILE" sudo chmod 644 "$BACKUP_FILE" # Step 7: Rotate old backups find "$BACKUP_DIR" -name "dump_*.rdb" -type f -mtime +$RETENTION_DAYS -delete 2>/dev/null # Step 8: Log success FILE_SIZE=$(stat -c "%s" "$BACKUP_FILE" 2>/dev/null | numfmt --to=iec-i --suffix=B) log "SUCCESS: Backup completed. Size: $FILE_SIZE. File: $BACKUP_FILE" exit 0

把这个脚本保存为/usr/local/bin/redis-backup.sh,然后赋予执行权限:

sudo chmod +x /usr/local/bin/redis-backup.sh

接下来配置定时任务。Ubuntu 14.04 使用 cron,编辑 root 的 crontab:

sudo crontab -e

添加一行(每天凌晨 2 点执行):

0 2 * * * /usr/local/bin/redis-backup.sh >> /var/log/redis/backup.log 2>&1

实操心得:为什么用sudo -u redis而不是直接redis-cli?因为在 Ubuntu 14.04 的 init.d 体系中,redis-server 是以 redis 用户身份启动的,其配置文件(如 /etc/redis/redis.conf)的权限是 644,属主 redis:redis。如果用 root 执行 redis-cli,它会尝试读取 root 用户家目录下的 .rediscli_history,而这个文件不存在,导致命令卡住。用sudo -u redis确保所有上下文都和生产环境完全一致。

3.3 恢复操作的标准化 SOP(避免“恢复时手抖”)

备份做得再好,恢复出错等于白干。我制定了一套三步恢复 SOP,所有运维人员必须背下来:

第一步:隔离与确认

  • 立即停止目标 Redis 实例:sudo service redis-server stop
  • 创建当前数据目录快照:sudo cp -r /var/lib/redis /var/lib/redis.pre-restore.$(date +%Y%m%d_%H%M)
  • 确认要恢复的备份文件存在且可读:ls -lh /backup/redis/dump_20231015_020000.rdb

第二步:预检与加载

  • 检查备份文件完整性:sudo /usr/bin/redis-check-rdb /backup/redis/dump_20231015_020000.rdb
  • 拷贝文件并修正权限:
    sudo cp /backup/redis/dump_20231015_020000.rdb /var/lib/redis/dump.rdb sudo chown redis:redis /var/lib/redis/dump.rdb sudo chmod 644 /var/lib/redis/dump.rdb
  • 关键动作:临时修改 redis.conf,注释掉save指令(防止恢复过程中触发新的 bgsave,干扰数据一致性):
    sudo sed -i 's/^save/#save/' /etc/redis/redis.conf

第三步:启动与验证

  • 启动 Redis:sudo service redis-server start
  • 等待 10 秒,连接检查:
    # 查看键总数 redis-cli -p 6379 DBSIZE # 抽样检查几个关键 key redis-cli -p 6379 GET user:1001:session redis-cli -p 6379 LRANGE leaderboard:top10 0 5
  • 如果一切正常,恢复最后一步:取消 redis.conf 的注释:
    sudo sed -i 's/^#save/save/' /etc/redis/redis.conf sudo service redis-server restart

注意:DBSIZE命令返回的是当前数据库的键数量,不是内存占用。很多新手用INFO memory看 used_memory_human,发现数值很小就以为恢复失败,其实是因为 RDB 加载后,Redis 还没触发内存分配优化。DBSIZE才是唯一可信指标。

4. 常见故障排查与修复指南:那些让你凌晨三点爬起来的报错

4.1 “misconf redis is configured to save rdb snapshots, but it is currently not able…” —— 这不是配置错误,是磁盘空间告急

这个报错在 Ubuntu 14.04 上出现频率极高,90% 的情况不是 redis.conf 配置问题,而是/var/lib/redis所在分区剩余空间不足。Redis 在 fork 子进程时,需要预留和当前内存数据量相等的虚拟内存空间(即使实际物理内存没用完)。如果磁盘空间小于 Redis 占用内存的 1.5 倍,bgsave 就会失败。

诊断步骤:

# 查看 Redis 内存占用 redis-cli -p 6379 INFO memory | grep used_memory_human # 查看 /var/lib/redis 所在分区剩余空间 df -h /var/lib/redis # 查看该目录下是否有残留的临时文件(Redis bgsave 失败时会留下 .tmp 文件) sudo ls -la /var/lib/redis/*.tmp

修复方案:

  • 清理临时文件:sudo rm -f /var/lib/redis/*.tmp
  • 扩容磁盘或清理无用数据(如过期 session)
  • 终极方案:修改/etc/default/redis-server,增加ulimit -v unlimited,但这只是治标,必须配合磁盘扩容

4.2 “Failed opening .rdb for saving: Permission denied” —— 权限链断裂的典型表现

这个错误表面是权限问题,根源在于 Ubuntu 14.04 的 AppArmor 限制。虽然默认没启用,但某些定制镜像会开启。AppArmor 会限制 redis-server 进程只能写入/var/lib/redis/目录,如果你在 redis.conf 里把dir改成了/mnt/nas/redis,就会触发此错误。

诊断命令:

# 检查 AppArmor 状态 sudo aa-status | grep redis # 查看系统日志中的详细拒绝信息 sudo dmesg | grep -i "apparmor.*denied" | tail -10

修复方案:

  • 方案一(推荐):放弃挂载 NAS,改用 rsync 推送备份文件:
    # 在备份脚本末尾添加 rsync -avz --delete /backup/redis/ user@nas-ip:/backup/redis/
  • 方案二:如果必须挂载,需为 AppArmor 添加规则:
    echo "/mnt/nas/redis/** rw," | sudo tee -a /etc/apparmor.d/local/usr.bin.redis-server sudo apparmor_parser -r /etc/apparmor.d/usr.bin.redis-server

4.3 RDB 文件校验失败:“Invalid RDB version” 或 “Invalid RDB magic number”

这通常意味着你用高版本 Redis(如 4.0+)生成的 RDB 文件,试图在 Ubuntu 14.04 的 Redis 2.8 上加载。RDB 格式不向下兼容。但更隐蔽的情况是:你在备份脚本里用了redis-cli save而不是BGSAVE

为什么save更危险?

  • SAVE是同步阻塞命令,会冻结 Redis 主线程,直到写盘完成
  • 在 Ubuntu 14.04 的低性能虚拟机上,一个 1GB 的 RDB 文件写盘可能耗时 40 秒以上
  • 这期间所有客户端请求都会超时,监控系统会疯狂报警
  • 更致命的是,如果写盘中途被 kill,生成的 RDB 文件就是半截的,redis-check-rdb必然失败

验证方法:

# 查看 RDB 文件头(正常应为 "REDIS0006") hexdump -C /var/lib/redis/dump.rdb | head -5 # 如果前 5 字节不是 "52 45 44 49 53"(即 ASCII 的 "REDIS"),说明文件损坏

修复流程:

  • 立即停止所有备份脚本
  • 删除所有损坏的 .rdb 文件
  • 重跑备份脚本,确保只用BGSAVE
  • 在脚本中加入timeout 120保护,防止无限等待

4.4 恢复后数据为空:DBSIZE返回 0 的五种可能原因

这是最让人抓狂的问题。按优先级逐一排查:

排查项检查命令修复方法
1. RDB 文件路径错误sudo ls -l /var/lib/redis/dump.rdb确认文件存在且大小 > 0
2. Redis 配置了多个 databaseredis-cli -p 6379 CONFIG GET databases恢复后用SELECT 1切换 database 再查
3. RDB 文件被覆盖为 0 字节stat /var/lib/redis/dump.rdb | grep Size检查备份脚本是否有>覆盖操作,应为cp
4. Redis 启动时指定了不同配置文件ps aux | grep redis查看启动命令中的-c参数指向哪个 conf
5. SELinux 或 AppArmor 干预sudo ausearch -m avc -ts recent | grep redis临时禁用测试:sudo setenforce 0

实操心得:我写了个一键诊断脚本,放在/usr/local/bin/redis-diagnose.sh,内容就三行:

echo "=== Redis Process ==="; ps aux \| grep redis echo "=== RDB File ==="; ls -lh /var/lib/redis/dump.rdb echo "=== DBSIZE ==="; redis-cli -p 6379 DBSIZE 2>/dev/null \| || echo "Redis not responding"

每次恢复出问题,先跑这个,80% 的 case 能 30 秒内定位。

5. 进阶方案与架构演进:当单机 RDB 不再够用时的平滑过渡路径

RDB 备份在 Ubuntu 14.04 上足够可靠,但它有硬伤:恢复时间随数据量线性增长。一个 10GB 的 RDB 文件,Redis 启动加载可能需要 3-5 分钟。对于要求 RTO(恢复时间目标)< 30 秒的业务,这就成了瓶颈。这时候,你需要考虑架构升级,但绝不能一刀切。

5.1 AOF 日志的渐进式启用(兼容 Ubuntu 14.04 Redis 2.8)

AOF(Append Only File)是另一种持久化方式,它把每个写命令追加到日志文件,恢复时重放命令。相比 RDB,AOF 的优势是数据丢失更少(可配置为每秒刷盘),但缺点是文件体积大、恢复慢。在 Ubuntu 14.04 上启用 AOF,关键是不要关闭 RDB,而是双写(RDB + AOF),用 AOF 做增量,RDB 做基线。

修改/etc/redis/redis.conf

# 启用 AOF appendonly yes # AOF 文件名 appendfilename "appendonly.aof" # 每秒刷盘(平衡性能与安全性) appendfsync everysec # 自动重写条件:当 AOF 文件比上次重写后增大一倍,且体积超过 64MB auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb

然后重启:

sudo service redis-server restart

注意:AOF 重写(BGREWRITEAOF)也会 fork 子进程,同样受 Ubuntu 14.04 的内存和磁盘限制。建议在低峰期手动触发一次:redis-cli -p 6379 BGREWRITEAOF,观察日志是否成功。

5.2 跨版本迁移:从 Ubuntu 14.04 + Redis 2.8 到 Ubuntu 20.04 + Redis 6.0 的平滑路径

很多团队问我:“现在还能不能升级?”答案是:能,但必须分三步走,不能跨版本跳跃。

阶段一:数据双写(3-6 个月)

  • 在新服务器(Ubuntu 20.04 + Redis 6.0)上部署 Redis,并配置为 slave(从旧 Redis 同步)
  • 修改应用配置,写操作发往旧 Redis,读操作 80% 走新 Redis,20% 走旧 Redis(灰度验证)
  • redis-cli --rdb工具导出旧 RDB,在新 Redis 上加载验证

阶段二:流量切换(1-2 周)

  • 将读流量 100% 切到新 Redis
  • 监控新 Redis 的内存、CPU、延迟指标,确认稳定
  • 应用端逐步将写操作也切到新 Redis(用事务或消息队列保证一致性)

阶段三:旧系统下线

  • 停止旧 Redis 的 RDB 备份
  • 彻底下线 Ubuntu 14.04 服务器
  • 更新所有文档和监控告警

我经手的最复杂迁移案例,涉及 12 个微服务、3 个 Redis 实例、总数据量 42GB。我们用了 8 周完成,零数据丢失。关键经验是:永远不要相信“一次全量同步”,必须用业务数据做端到端验证。比如,从旧 Redis 读一个用户订单号,再到新 Redis 查同个 key,比对 value 是否一致。

5.3 备份存储的现代化:从本地磁盘到对象存储的演进

/backup/redis目录放在本地磁盘,最大的风险是服务器宕机导致备份和数据同时丢失。现代方案是推送到对象存储(如 AWS S3、阿里云 OSS),但 Ubuntu 14.04 的老旧内核(3.13)不支持最新版 s3cmd。解决方案是降级使用 s3cmd 1.5.0:

# 安装依赖 sudo apt-get install python python-magic # 下载并安装 s3cmd 1.5.0(专为 Ubuntu 14.04 编译) wget https://github.com/s3tools/s3cmd/releases/download/v1.5.0/s3cmd-1.5.0.tar.gz tar xzf s3cmd-1.5.0.tar.gz cd s3cmd-1.5.0 sudo python setup.py install # 配置(按提示输入 Access Key 和 Secret Key) s3cmd --configure # 在备份脚本末尾添加推送命令 s3cmd put /backup/redis/dump_${DATE}.rdb s3://my-redis-backup/

提示:s3cmd 1.5.0 不支持--storage-class STANDARD_IA,所以所有备份都是标准存储,成本略高,但胜在稳定。如果你追求成本,可以用rclone,它对老系统更友好,且支持分段上传。

6. 经验总结:十年 Redis 运维踩过的坑,浓缩成三条铁律

我在金融、电商、IoT 三个领域维护过上百个 Redis 实例,从 Ubuntu 12.04 到 22.04,最深的体会是:Redis 的简单,恰恰是它最危险的地方。它没有复杂的配置界面,没有图形化监控,一切靠命令和日志。这种极简主义,让新手容易上手,也让高手容易轻敌。结合 Ubuntu 14.04 这个特定环境,我把所有教训浓缩成三条铁律:

第一,永远假设 RDB 文件是“一次性的”。不要想着“这个 dump.rdb 我留着,以后万一要用”。它不是归档文件,而是快照。每次备份后,旧文件就应该被标记为“过期”,并在保留期后自动删除。我在一个项目里见过有人把 3 年的 RDB 文件堆在同一个目录,结果find命令执行 20 分钟,ls都卡死,最后不得不用debugfs直接操作 ext4 的 inode。备份的本质是“可用性”,不是“保存”。

第二,验证必须前置,不能后置。很多团队的 SOP 是“备份脚本跑完,邮件通知一声”,这等于没验证。正确的做法是:备份脚本的最后一步,必须是redis-check-rdb+redis-cli KEYS * | wc -l,两个命令都成功才算备份成功。我现在的所有备份脚本,都内置了这个双校验,失败时自动发短信告警,而不是等第二天早上才发现。

第三,升级不是“要不要”,而是“怎么分阶段”。Ubuntu 14.04 的 EOL 是事实,但业务系统的生命周期往往比操作系统长。强行升级可能导致依赖库冲突、硬件驱动失效、甚至许可证问题。我的建议是:用 AOF 作为过渡桥梁,用双写作为验证手段,用业务指标(而非技术指标)作为切换依据。比如,“支付成功率连续 1 小时 ≥99.99%” 才允许切流,而不是“新 Redis 启动成功”。

最后分享一个小技巧:在/etc/cron.daily/下放一个清理脚本,专门扫/var/lib/redis/*.tmp/var/log/redis/*.gz,Ubuntu 14.04 的 logrotate 有时会漏掉 Redis 日志,导致/var分区爆满。这个脚本我写了五行,运行了 2897 天,救了我至少 17 次半夜的 PagerDuty 告警。运维没有银弹,只有无数个这样的小技巧,连成一张安全网。