camhan 2019-12-06
redis提供了两种持久化的方法来将数据以二进制的方式存储到硬盘,一种为在某一时刻生成快照的RDB持久化,另一种为将写入命令追加到aof的持久化文件的持久化
在 Redis 运行时,RDB 程序将当前内存中的数据库快照保存到磁盘文件中,在 Redis 重启动
时,RDB 程序可以通过载入 RDB 文件来还原数据库的状态。RDB文件非常适合备份以及用于灾难恢复
rdb分为手动触发和自动触发,自动触发需要在配置文件中定义
rdb持久化默认在配置文件中开启的
vim /etc/redis/6379.conf
此配置表示在15分钟内至少修改一次,或者在5分钟内至少修改十次,或者在1分钟内修改10000次会触发rdb操作
是否对快照数据进行压缩存储
rdbcompression yes
是否使用CRC64算法进行数据校验,如果开启那么将增加10的性能消耗
rdbchecksum yes
指定生成的文件名
dbfilename dump.rdb
指定文件存放的目录
dir /var/lib/redis/6379
rdb的手动触发需要手动调用SAVE或BGSAVE命令
AOF持久性会记录服务器接收的每个写入操作,这些操作将在服务器启动时再次运行,以重建原始数据集。使用与Redis协议本身相同的格式记录命令,并且采用仅追加方式。当日志太大时,Redis可以在后台重写日志。AOF的主要作用是解决了数据持久化的实时性
默认采用everysec模式
当AOF太大时,Redis会简单地从头开始将其重写到临时文件中。重写不是通过读取旧的文件,而是由Redis fork一个子进程直接访问内存中的数据,将其转换为写命令同步到新的aof文件,因此Redis可以创建更小的AOF文件,并且在写入新的AOF时不需要读取磁盘。
重写终止后,临时文件将被fsync同步在磁盘上,并覆盖旧的AOF文件。
当aof被重写的过程中又有新数据写入怎么办?这可能会导致数据不一致
新写入的数据会放到旧的aof文件里,同时也会追加到aof的重写缓冲区中,最后替换掉旧的aof文件
vim /etc/redis/6379.conf
是否在后台aof文件重写期间调用fsync,默认为no,表示调用
no-appendfsync-on-rewrite no
当前aof文件增长量超过上次afo文件大小的100%时,则触发rewrite,如果为0,则禁用自动触发重写
auto-aof-rewrite-percentage 100
aof文件重写最小的文件大小,低于这个值将不会触发重写操作
auto-aof-rewrite-min-size 64mb
当子进程重写AOF文件时,每生成32 MB的数据,文件就会把数据落盘,防止单次文件数据过大造成阻塞
aof-rewrite-incremental-fsync yes
使用rdb和aof混合持久化方式,会将aof重写操作时的数据状态保存为rdb格式,而重写之后的redis命令会继续追加到rdb数据之后
aof-use-rdb-preamble yes
rdb与aof同时存在时,优先使用aof进行数据恢复
欢迎关注个人公号“没有故事的陈师傅”