首页 / Redis 入门教程 / 备份、容灾与迁移

Redis 入门教程

备份、容灾与迁移

本教程共 40 篇 · 第 37 篇 · 更新于 2026-08-02

备份容灾RDB主从复制哨兵迁移恢复

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.confdir 指定的目录,文件名由 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 即可自动加载。具体步骤:

  1. 停止目标 Redis 实例(或确保不会在加载前又触发一次空快照覆盖文件)。
  2. 将备份的 dump.rdb 放到该实例的 dir 目录下,文件名与 dbfilename 一致。
  3. 启动 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.confsave 配置会在「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 恢复意图,需先理清持久化策略。
  • 误区四:「迁移完就完事。」务必在新实例上 DBSIZEKEYS 抽样或比对样本键,确认数据完整再切流量。

提示:本章正文统一以 Redis 8.x(最新稳定版) 表述。需补充的是,官方 redis.io 下载页另将 8.8 标注为 “Latest stable”,而 GitHub 上 redis/redis 的最新发布 tag 为 8.10.0;二者同属 8.x 系列,RDB 文件格式与复制协议对教材内容没有影响。