Redis 持久化
由于redis 的数据都存储在内存里,为了避免进程退出导致丢失数据,redis 引入了持久化机制。redis 的持久化有rdb、aof两种机制。
一、rdb
rdb持久化也叫做快照持久化,就是把当前的数据生成快照保存到硬盘,是一种全量备份。它可以通过手动触发和自动触发。
手动触发
save命令和bgsave命令都可以可以手动触发rdb。不同的是save命令会阻塞当前redis服务器, 直到rdb过程完成为止。而bgsave命令(fork操作)会创建一个子进程负责rdb持久化,此后父进程不再受到影响(copy on write 机制),可以继续响应请求。因此我们在进行rdb持久化时应该使用bgsave命令,save命令已经被废弃。
自动触发
save m n 表示在m秒内数据存在n次修改时, 自动触发bgsave。
默认情况下redis 使用的就是自动触发机制,打开redis.windows-service.conf文件(windows下,服务安装方式)
redis 默认给我们配置了三个条件,当任何一个条件满足时,就会执行bgsave。
rdb文件
默认情况下我们会在 redis 目录下看到一个名为dump.rdb的文件,这就是rdb持久化生成的文件。我们也可以通过如下命令更改存储路径和文件名称。
config set dir {newdir} 设置存储路径
config set dbfilename {newfilename} 设置存储文件名称默认情况下redis采用lzf算法对生成的rdb文件做压缩处理, 压缩后的文件远远小于内存大小, 可以通过命令 config set rdbcompression {yes|no} 进行开启或关闭。
优缺点
从上面可以看到rbd保存的是某个时间节点的数据,比较适合定期备份,无法做到实时持久化。
rdb文件使用特定二进制格式保存数据, 由于redis有多个格式的rdb版本, 存在各个版本格式不兼容的问题。
redis 加载 rdb 恢复数据远远快于 aof 的方式。
二、aof
aof持久化的原理是把redis 每次的写命令(对内存进行修改)记录到单独的文件日志文件中,重启时再重新执行aof文件中的命令达来恢复数据,它解决了rdb方式的实时性问题。
默认情况下aof不开启,需要在配置文件中设置appendonly yes来开启,aof文件名通过appendfilename配置设置,默认文件名是appendonly.aof。保存路劲同rdb持久化方式一致,通过dir配置设定。
aof的工作流程操作:命令写入(append)、文件同步(sync)、文件重写(rewrite)、重启加载(load)。
命令写入(append)
所有的写入命令会追加到aof_buf(缓冲区) 中,redis可以提供多种缓冲区同步硬盘的策略, 在性能和安全性方面做出平衡。
文件同步(sync)
aof缓冲区根据对应的策略向硬盘做同步操作。
redis提供了多种aof缓冲区同步文件策略, 由参数appendfsync控制。
always:命令写入aof_buf后立即调用系统fsync操作同步到aof文件,fsync完成后线程返回。
no:命令写入aof_buf后调用系统write操作,不对aof文件做fsync同步;同步由操作系统负责,通常同步周期为30秒。
everysec:命令写入aof_buf后调用系统write操作,write完成后线程返回;fsync同步文件操作由专门的线程每秒调用一次。
可以看到always配置数据安全性高但性能非常慢,no配置性能高但数据不安全,而everysec配置可以做到兼顾性能和数据安全性,它是redis 的默认配置。
文件重写(rewrite)
随着 aof 文件越来越大, 需要定期对 aof 文件进行重写, 达到压缩的目的。
aof 文件重写就是把 redis 当前进程内的数据转化为写命令同步到新 aof 文件里,再将操作期间发生的增量 aof 日志追加到这个文件中,最后替换掉原 aof 文件。
aof重写过程可以手动触发和自动触发:
·手动触发: bgrewriteaof 命令。
·自动触发: 有两个参数
auto-aof-rewrite-min-size:运行aof重写时文件最小体积。
auto-aof-rewrite-percentage:当前aof文件空间(aof_current_size) 和上一次重写后aof文件空间(aof_base_size) 的比值。
默认配置文件如下
意思是当aof文件的体积大于64mb,并且aof文件的体积比上一次重写之后的体积大了至少一倍(100%)的时候,redis将执行 bgrewriteaof 命令。
重启加载(load)
当 redis 服务器重启时, 可以加载 aof 文件进行数据恢复。
当 aof 持久化开启且存在 aof 文件时, 优先加载 aof 文件,aof关闭或者 aof 文件不存在时, 加载 rdb 文件。
redis 4.0 混合持久化
一般来说我们使用aof 方式保证数据的安全性,但是当 aof 文件很大时,redis 启动将要花费很长时间,rdb 文件加载到时很快,但是存在丢失数据的情况。因此redis 4.0 引入了混合持久化的机制,它既可兼顾数据安全,又可提高 redis 的重启效率。
混合持久化同样也是通过 bgrewriteaof 命令完成的,不同的是当开启混合持久化时,会先将内存中的数据以 rdb 方式写入 aof 文件,然后在将重写缓冲区的增量命令以 aof 方式写入到文件,最后用新文件替换旧的的 aof 文件。新的 aof 文件前一部分是 rdb 格式的全量数据后一部分是aof格式的增量数据(通常这部分 aof 日志会很小)。redis 重启时,会先加载 rdb 内容再加载剩余的 aof 。这样就可以替代之前的 aof 全量文件重放,提高重启效率。
混合持久化默认关闭的,可以通过修改配置文件aof-use-rdb-preamble或命令 config set aof-use-rdb-preamble {yes|no} 开启或关闭。