Redis数据持久化机制
- RDB(Redis DataBase):把数据以快照的形式保存在磁盘
- AOF(Append Only File):将每一个收到的写命令都通过write函数追加到文件中,类似于日志记录。
- 保障数据的安全最好采用两种机制结合,
BGSAVE
做全量持久化,AOF
做增量持久化
RDB持久化
触发RDB持久化过程分为手动触发和自动触发
手动触发命令
-
save: 阻塞当前Redis服务器,直到RDB过程完成为止,对于内存 比较大的实例会造成长时间阻塞,线上环境不建议使用 。
-
bgsave: Redis进程执行fork操作创建子进程,RDB持久化过程由子 进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短 。
自动触发命令
- 在配置文件中配置,如在redis.conf中
# 900s内至少达到一条写命令
save 900 1
# 300s内至少达至10条写命令
save 300 10
# 60s内至少达到10000条写命令
save 60 10000
这种触发方式与bgsave命令类似,达到触发条件时,会forks一个子进程进行数据同步
不过最好不要通过这方式来触发RDB持久化,因为设置触发的时间太短,则容易频繁写入rdb文件,影响服务器性能,时间设置太长则可能会因为意外宕机等情况造成数据丢失。
- 主从复制时,主节点自动触发
- Debug Reload
- 执行Shutdown命令且redis没有开启AOF持久化
该机制的优缺点
优点
- RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间点上的数据快照。非常适用于备份,全量复制等场景。 可用来灾难恢复,根据指定时间段备份的快照恢复不同版本的数据集
- Redis加载RDB恢复数据远远快于AOF的方式
缺点
- 无法做到实时(秒级)持久化,该机制需创建子进程属于重量级操作,频繁操作影响性能
RDB文件说明
-
RDB是一个紧凑的单一文件,很方便传送到远程服务器进行灾难备份
-
RDB文件保存在dir配置指定的目录下,文件名通过dbfilename配置指定。
## 动态设置存放路径
config set dir {newDir}
## 动态设置存放的文件名,默认是dump.rdb
config set dbfilename {newFileName}
### 执行完命令,在下次运行时RDB文件会保存到新目录
配置文件中其他相关配置
stop-writes-on-bgsave-error :默认值为yes。当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。(警示运维发生灾难)
rdbcompression ;默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。
rdbchecksum :默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗
AOF持久化
-
以独立日志的方式记录每次写命令, 重启时再重新执行AOF(Append Only File)文件中的命令达到恢复数据的目的
-
主要用来解决数据持久化的实时性
配置使用
## 开启AOF功能,默认为no
appendonly yes
## 配置AOF文件名,默认文件名是appendonly.aof
appendfilename {fileName}
## 文件保存路径与RDB文件一致,都是配置dir指定
工作流程
命令写入 (append)、文件同步(sync)、文件重写(rewrite)、重启加载 (load)
sync策略
### 在配置文件中设定
## 同步持久化。每次发生数据变更会被立即记录到磁盘,性能较差但数据完整性比较好
# appendfsync always
## 默认写入策略,每秒写入一次aof文件,所以最多可能会丢失1s的数据(生产环境首选)
# appendfsync everysec
## Redis服务器不负责写入aof,交由操作系统来处理什么时候写入aof文件。更快但也是最不安全的,不推荐使用。
# appendfsync no
重写机制
定期对AOF文件进行重写,达到压缩文件的目的;更小的AOF可以更快地被Redis加载;
-
进程内已经超时的数据不再写入文件
-
旧的AOF文件含有无效命令 ,如del,hdel,set等
-
多条写命令合并为一个
-
相关配置
### 手动触发:直接调用bgrewriteaof命令 ### 自动触发配置 auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认 为64MB ·auto-aof-rewrite-percentage:代表当前AOF文件空间 (aof_current_size)和上一次重写后AOF文件空间(aof_base_size)的比值 ### aof_current_size和aof_base_size可以在info Persistence统计信息中查看 自动触发时机 = aof_current_size > auto-aof-rewrite-minsize && (aof_current_size - aof_base_size)/aof_base_size >= auto-aof-rewritepercentage
应对AOF文件损坏
当写入AOF文件时,如果Redis服务器宕机,则AOF文件会出现格式错误,在重启服务器后,Redis服务器会拒绝重载该文件。所以如何防止此类情况发生:
- 备份现在的aof文件
- 使用 redis-check-aof命令修复aof文件
redis-check-aof -fix filename.aof
执行完重启redis就能加载已修复文件
重启Redis数据恢复流程
有错误的地方欢迎评论指正,谢谢