Redis 持久化
[TOC]
两种持久化方式
RDB(Redis DataBase)
在不同的时间点,将 redis 存储的数据生成快照并存储到磁盘等介质上;
####优点
RDB 是一种快照式的持久化方法,redis 会单独 fork 一个子进程,主进程不用进行任何 IO 操作,这样 Redis 具有极高的进行。
持久化过程中,数据会写到临时文件,待持久化过程结束,才会用临时文件替换上次持久化好的文件,这样保证了数据的完整性。
进行大规模的数据恢复,RDB 比 AOF 方式更加高效 ####缺点
对持久化数据的完整性保证不高,在 RDB 模式下,即使 5 分钟持久化一次,当 redis 故障时,仍然可能会有 5 分钟的数据丢失。
相关配置
AOF(Append Only File)
将 redis 执行过的所有写指令记录下来,在下次 redis 重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
优点
充分保证数据的持久化,正确的配置一般最多丢失 1 秒的数据
aof 文件内容是以 Redis 协议格式保存, 易读
缺点
同样数据规模的情况下,AOF 文件要比 RDB 文件的体积大
AOF 方式的恢复速度也要慢于 RDB 方式
重新启动 redis 时会极低的概率会导致无法将数据集恢复成保存时的原样(日志因为某些原因而包含了未写入完整的命令(比如写入时磁盘已满,写入中途停机,等等), redis-check-aof 工具也可以轻易地修复这种问题)
相关配置
AOF 重写
#####原理
因为采用了追加方式,如果不做任何处理的话,AOF 文件会变得越来越大,为此,redis 提供了 AOF 文件重写(rewrite)机制,即当 AOF 文件的大小超过所设定的阈值时,redis 就会启动 AOF 文件的内容压缩,只保留可以恢复数据的最小指令集。
例如我们调用了 100 次 INCR 指令,在 AOF 文件中就要存储 100 条指令,但这明显是很低效的,完全可以把这 100 条指令合并成一条 SET 指令,这就是重写机制的原理。
操作
自动重新详见 aof 配置
命令执行: BGREWRITEAOF
详细过程
在重写即将开始之际,redis 会创建(fork)一个“重写子进程”,这个子进程会首先读取现有的 AOF 文件,并将其包含的指令进行分析压缩并写入到一个临时文件中。
与此同时,主工作进程会将新接收到的写指令一边累积到内存缓冲区中,一边继续写入到原有的 AOF 文件中,这样做是保证原有的 AOF 文件的可用性,避免在重写过程中出现意外。
当“重写子进程”完成重写工作后,它会给父进程发一个信号,父进程收到信号后就会将内存中缓存的写指令追加到新 AOF 文件中。
当追加结束后,redis 就会用新 AOF 文件来代替旧 AOF 文件,之后再有新的写指令,就都会追加到新的 AOF 文件中了。
评论