Redis 如何实现数据不丢失?
Redis 数据不丢失
Redis 默认是内存数据库,断电数据会丢失。为实现数据不丢失,主要通过以下方式: 1. 持久化: - RDB(快照):定期保存内存数据到磁盘。 - AOF(追加文件):记录每条写操作,日志重放恢复。 2. 高可用: - 主从复制:数据同步到从节点。 - 哨兵(Sentinel):监控并自动切换。 - 集群(Cluster):分布式存储和容错。
核心点
- 持久化保证重启不丢,高可用防止故障丢失。
1. 持久化机制详解
(1) RDB(Redis Database Backup)
- 原理:
- 定时将内存数据快照(Snapshot)保存到磁盘文件(
dump.rdb
)。 - 触发方式:
- 手动:
SAVE
(阻塞)、BGSAVE
(后台)。 - 自动:配置文件条件(如
save 900 1
:900 秒内 1 次写操作)。 - 过程:
- Fork 子进程,生成快照,写到临时文件,完成后替换旧文件。
- 优点:
- 文件小,恢复快。
- 适合冷备份。
- 缺点:
- 时间窗口丢失:快照间隔内数据可能丢失。
- Fork 开销大(大内存时)。
- 配置:
save 900 1
save 300 10
save 60 10000
(2) AOF(Append Only File)
- 原理:
- 将每条写命令(如
SET
、DEL
)追加到日志文件(appendonly.aof
)。 - 重启时重放日志恢复数据。
- 同步策略:
always
:每条命令同步,最高可靠性。everysec
:每秒同步,平衡性能和可靠性。no
:操作系统决定,性能最高但易丢数据。- 重写(Rewrite):
- 定期压缩 AOF(如
BGREWRITEAOF
),减少文件体积。 - 优点:
- 数据丢失少(
everysec
最多丢 1 秒)。 - 日志可读,易修复。
- 缺点:
- 文件大,恢复慢。
- 配置:
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
(3) RDB + AOF 混合
- 原理:
- Redis 4.0+ 支持,RDB 提供全量快照,AOF 记录增量。
- 优点:
- 结合 RDB 恢复快和 AOF 高可靠。
- 实现:
- 重启时加载 RDB,再重放 AOF。
2. 高可用方案
(1) 主从复制
- 原理:
- 主节点(Master)写,从节点(Slave)同步数据。
- 异步复制,主写后从通过
SYNC
或增量同步。 - 优点:
- 主挂后从节点有副本。
- 读写分离提升性能。
- 缺点:
- 异步可能丢数据(主从延迟)。
- 配置:
replicaof 127.0.0.1 6379
(2) 哨兵(Sentinel)
- 原理:
- 监控主从节点,检测主故障后自动切换从节点为主。
- 过程:
- 哨兵心跳检测主节点。
- 主挂后投票选举新主。
- 更新客户端配置。
- 优点:
- 自动化故障转移。
- 缺点:
- 切换期间可能丢数据。
- 配置:
sentinel monitor mymaster 127.0.0.1 6379 2
(3) Redis Cluster
- 原理:
- 数据分片(16384 个槽),多主多从,故障自动迁移。
- 一致性哈希分配槽。
- 优点:
- 高可用,部分节点故障仍可工作。
- 分布式扩展。
- 缺点:
- 配置复杂,事务支持弱。
- 配置:
cluster-enabled yes
3. 实现“数据不丢失”的最佳实践
- 持久化:
- 开启 AOF(
everysec
),结合 RDB。 - 高可用:
- 主从 + 哨兵:小型系统。
- 集群:大规模分布式。
- 综合方案:
- AOF 保证写操作不丢,RDB 加速恢复,哨兵/集群防单点故障。
示例
appendonly yes
appendfsync everysec
save 60 1000
replicaof 192.168.1.2 6379
- 主节点持久化 + 同步到从节点。
4. 延伸与面试角度
- 与性能:
always
可靠但慢,everysec
平衡。- 局限:
- 宕机前未同步的数据仍可能丢失。
- 硬件故障需额外备份。
- 实际应用:
- 电商:库存用 AOF + 哨兵。
- 缓存:RDB 足够。
- 面试点:
- 问“原理”时,提 RDB 和 AOF。
- 问“高可用”时,提哨兵和集群。
总结
Redis 通过 RDB 和 AOF 持久化防止重启丢失,主从、哨兵、集群保证故障不丢。最佳实践是混合持久化加高可用架构。面试时,可提配置或画主从结构,展示理解深度。