备份、容灾与迁移
本教程共 40 篇 · 第 37 篇 · 更新于 2026-08-02
37. 备份、容灾与迁移
数据无价。Redis 虽然以「快」著称,但一旦宕机、误删或磁盘损坏,没有备份就只能认命。「码上学」认为,备份与容灾是运维的底线工程:它平时看着没用,出事时就是生与死的区别。本章从最基础的 RDB 文件备份讲起,再上升到主从/哨兵的容灾架构,最后介绍实例间的数据迁移。
本节目标
- 掌握用
SAVE/BGSAVE生成 RDB 快照,并正确恢复数据。 - 理解 RDB 文件路径(
CONFIG GET dir)与备份拷贝要点。 - 理解主从复制与哨兵如何构成持续性的容灾能力。
- 了解实例间数据迁移的常用命令与工具。
- 规避「备份了却恢复不了」的常见陷阱。
一、RDB 备份:最朴素的快照
Redis 的 RDB(Redis Database)文件 dump.rdb 是某一时刻内存数据的二进制快照。拿到这个文件,就拿到了一份可移植的完整备份。
1-1 手动触发快照
SAVE 在主线程同步生成快照,期间会阻塞所有请求,生产环境慎用:
127.0.0.1:6379> SAVE
OK
更安全的做法是 BGSAVE,它 fork 一个子进程在后台写盘,主线程继续服务:
127.0.0.1:6379> BGSAVE
Background saving started
后台保存完成后,可以用 LASTSAVE 查看最近一次 RDB 成功的时间戳(Unix 秒):
127.0.0.1:6379> LASTSAVE
(integer) 1764567890
1-2 找到 RDB 文件位置
RDB 文件写在 redis.conf 中 dir 指定的目录,文件名由 dbfilename 决定(默认 dump.rdb)。用命令确认目录:
127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/var/lib/redis"
127.0.0.1:6379> CONFIG GET dbfilename
1) "dbfilename"
2) "dump.rdb"
1-3 恢复数据
RDB 的恢复是「冷恢复」:把 dump.rdb 拷贝回 dir 目录,再启动 Redis 即可自动加载。具体步骤:
- 停止目标 Redis 实例(或确保不会在加载前又触发一次空快照覆盖文件)。
- 将备份的
dump.rdb放到该实例的dir目录下,文件名与dbfilename一致。 - 启动 Redis,启动时自动读取 RDB 还原数据。
# 假设备份文件已放在 /var/lib/redis/dump.rdb
sudo cp /backup/redis/dump-20260802.rdb /var/lib/redis/dump.rdb
redis-server /etc/redis/redis.conf
注意点:如果同时开启了 AOF,Redis 8.x 启动时会优先加载 AOF 文件。恢复纯 RDB 备份时,需确认 AOF 未覆盖或先关闭 AOF,否则可能加载到空的/旧的 AOF。
恢复后务必校验:用 DBSIZE 看键总数、INFO keyspace 看各库分布,或抽样 GET 关键键确认数据真的回来了,而不是「进程起来了但库是空的」——这种「假恢复」比不恢复更危险,因为它让你误以为已安全。
1-4 自动备份与异地拷贝
redis.conf 中 save 配置会在「N 秒内 M 次写」时自动 BGSAVE,例如 save 900 1(900 秒内有至少 1 次改动)。但这只是「本地生成」,真正的备份还要把文件拷贝出去:
# 简单定时备份脚本思路(crontab 每日执行)
redis-cli BGSAVE
sleep 5
cp /var/lib/redis/dump.rdb /backup/redis/dump-$(date +%F).rdb
# 进一步上传到对象存储/异地机房,避免单机磁盘损坏同时丢失源与备份
生产建议:RDB 文件至少保留「本地 + 异地/对象存储」两份,并定期做恢复演练,验证文件可用。
二、主从复制:天然的实时容灾
备份解决「丢文件」,而复制解决「实例挂了服务还在」。Redis 的复制(Replication)让一个主节点(master)的数据实时同步到一个或多个从节点(replica)。从节点既是读扩展,也是一份持续更新的热备。
# 在从节点执行,指向主节点
redis-cli REPLICAOF 10.0.0.1 6379
若主节点设了密码,从节点需先配置 masterauth:
127.0.0.1:6379> CONFIG SET masterauth "S3cretP@ss"
OK
127.0.0.1:6379> REPLICAOF 10.0.0.1 6379
OK
复制建立后,主节点任何写操作都会异步传播到从节点。当主节点宕机,从节点仍持有完整数据,可作为恢复源或提升为新主。
三、哨兵:自动故障转移
主从复制仍需人工切换主从。哨兵(Sentinel)在一组独立进程中监控主从状态,主节点不可达时自动选举一个从节点提升为主,并通知客户端新地址,实现高可用容灾。哨兵本身也要部署多个(奇数个)以避免自身单点。
哨兵配置示例(sentinel.conf):
sentinel monitor mymaster 10.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
含义:监控名为 mymaster 的主节点;2 表示至少 2 个哨兵认为主观下线才触发客观下线;5 秒无响应判为下线;故障转移超时 10 秒。配合哨兵,即便主节点整机故障,服务也能在秒级恢复,数据由从节点兜底。
四、数据迁移:实例间搬数据
运维中常需把数据从旧实例迁到新实例(扩容、版本升级、上云)。几种可行路径:
4-1 redis-cli —rdb 拉取远程快照
redis-cli 支持直接从远程实例生成并下载 RDB:
redis-cli -h old-host -p 6379 --rdb dump-old.rdb
拿到 RDB 后,放到新实例的 dir 目录启动即可完成整库迁移。这是整实例搬家最简单可靠的方式。
4-2 MIGRATE 逐键迁移
MIGRATE 把单个键原子地从一个实例移动到另一个(先传值、再删源),适合少量键或双写过渡:
127.0.0.1:6379> MIGRATE 10.0.0.2 6379 user:1000 0 5000
OK
参数含义:目标 host、port、键名、目标数据库号、超时毫秒。
4-3 基于复制的「滚升」
升级大版本(如 6→8)时,常见做法是:先建一个 8.x 从节点挂到老主节点上,等数据同步完成、校验一致后,把从节点提升为主,再把流量切过来。这样无需停机,也天然完成了迁移。
提示:社区还存在 redis-shake、redis-dump 等第三方迁移工具,适合超大规模或特定异构场景。选用前请确认其与 Redis 8.x 的兼容性,并先在测试环境验证,避免引入额外风险。
五、常见误区
- 误区一:「开了
save自动快照就等于备份了。」自动快照只生成在本地磁盘,磁盘坏/机房故障仍会一起丢,必须拷贝到异地。 - 误区二:「有从节点就不需要 RDB 备份。」从节点是热备不是归档;误执行
FLUSHALL会同步到从节点,且无法按时间点回滚。RDB 冷备 + 复制热备应互补。 - 误区三:「恢复时直接把 rdb 丢进目录就行。」若 AOF 开启,启动优先加载 AOF,可能覆盖你的 RDB 恢复意图,需先理清持久化策略。
- 误区四:「迁移完就完事。」务必在新实例上
DBSIZE、KEYS抽样或比对样本键,确认数据完整再切流量。
提示:本章正文统一以 Redis 8.x(最新稳定版) 表述。需补充的是,官方 redis.io 下载页另将 8.8 标注为 “Latest stable”,而 GitHub 上 redis/redis 的最新发布 tag 为 8.10.0;二者同属 8.x 系列,RDB 文件格式与复制协议对教材内容没有影响。