RDB
Redis 在进行 RDB 持久化时,会 Fork 一个子线程出来进行持久化,由于 Redis 是单线程的,所以持久化的时候主线程不会进行任何 IO 操作
持久化时,先创建一个临时文件,并把数据写入这个临时文件中,待全部写完后,再把临时文件替换上次的持久化文件。在进行大规模的恢复时,RDB 比 AOF 高效
缺点:最后一次持久化后的数据可能会丢失
save 900 1 # 900s内修改了一个数据
save 300 10
save 60 10000
dbfilename dump.rdb
每次进行 RDB 持久化操作时,都会生成一个 dump.rdb 文件
如何触发 RDB 持久化
- 显示使用 save 命令,或者使用 bgsave 异步持久化
- 当使用 flushall 命令删除所有库时
- 退出 Redis 时
RDB 文件的恢复与备份
Redis 在启动时,会自动到启动目录下查找 dump.rdb 文件,并根据文件内容进行初始化
> config get dir # 查看rdb文件的目录
> cp dump.rdb dump.rdb.bak # 备份
> mv dump.rdb.bak dump.rdb # 恢复
AOF
Append Only File
AOF 是以追加日志文件的方式,将所有的命令记录下来,在恢复时再把文件记录的命令运行一次
缺点:可能导致最后一秒的数据丢失
保存的文件:appendonly.aof
当 RDB、AOF 同时开启时,默认使用 AOF
appendonly no # 默认关闭AOF
appendfsync always # 每次写入时同步
appendfsync everysec # 每秒同步
appendfsync no # 不主动进行同步,把同步实际交给操作系统
如果开启了 AOF,但 AOF 文件被破坏时,Redis 将不能启动,需要利用 redis-check-aof 恢复文件
[root@wes bin]# ls
chardetect dump.rdb jsonschema redis-check-rdb
cloud-id jsondiff myconf redis-cli
cloud-init jsonpatch redis-benchmark redis-sentinel
cloud-init-per jsonpointer redis-check-aof redis-server
[root@wes bin]# redis-check-aof --fix appendonly.aof
AOF 的优缺点
优点:
- 每一次修改都同步,文件的完整性会更好
- 每秒同步一次,但可能会丢失一秒的数据
- 从不同步,效率最高
缺点:
- 相对于数据文件来说,AOF 远大于 RDB,修复速度比 RDB 慢
- AOF 运行效率比 RDB 慢
重写压缩
当 AOF 的文件大小达到一个阈值(64M)的时候,Redis 会对 AOF 文件的内容进行重写压缩,只保留可以恢复数据的最小指令集
使用命令 bgrewriteaof 可以显示重写
auto-aof-rewrite-percentage # 设置重写的y