RDB
RDB是什么?
Redis持久化数据的两种方式之一,
另外一种是AOF。
Redis会定期保存数据快照至一个rbd文件中,
并在启动时自动加载rdb文件,
恢复之前保存的数据。
RDB 触发时机
-
手动触发
可以通过SAVE
或者BGSAVE
进行RDB备份- SAVE
直接调用 rdbSave ,
阻塞 Redis 主进程,
直到保存完成为止。
在主进程阻塞期间,
服务器不能处理客户端的任何请求。 - BGSAVE
fork 出一个子进程,
子进程负责调用 rdbSave ,
并在保存完成之后向主进程发送信号,
通知保存已完成。
Redis 服务器在BGSAVE 执行期间,
仍然可以继续处理客户端的请求。
- SAVE
-
自动触发
可以在Redis的配置文件中进行设置,
以达到满足条件自动触发RDB备份。- 配置方式
在配置文件中加上save 60 1000
,
则表示 60秒内如果数据变更达到1000次,
则满足触发RDB备份的条件。
配置方式可以加入多条,
满足任意条件,
则触发RDB备份
- 配置方式
其他可能
主从复制的时候
因为要复制给从节点最新信息,
所以也会触发
使用 shutdown 指令正常下线之前
也会触发一次
RDB的优缺点
- 优点
对性能影响最小,
Redis在保存RDB快照时会fork出子进程进行,
几乎不影响Redis处理客户端请求的效率。恢复数据的速度快,
相对于AOF,具有更快的数据恢复速度。适合数据库容灾备份,
生产的RDB文件可以移动到一些高可靠的文件系统,
比如HDFS。
- 缺点
不适合频繁触发备份,
所以没有备份的数据在宕机的时候会丢失。Redis如果存储的数据体量太大,
Fork子进程的时候会影响到Redis的可用性二进制文件,
无法人工读懂,
不能直接进行人工干预。
与其说优缺点,
我们其实不如思考适用场景,
没有完美的技术,
只要用到合适的场景,
他就是对的。
RDB文件生产过程
Redis fork 一个子进程
子进程将数据写入一个临时的RDB文件
当子进程完成对临时的RDB文件的写入,
将完成的RDB文件来覆盖 旧的RDB文件
这样就完成了一次RDB的备份,
并且不会因为备份失败而影响到之前的备份数据。