Redis持久化RDB和AOF

前言

Redis的高速建立在数据存储在内存中, 但是断电的话, 就会导致数据丢失的问题.
为此我们需要对数据进行持久化到硬盘中.
Redis提供了两种持久化存储方案, Redis在启动时会优先加载AOF文件恢复数据.

  1. AOF(Append Only File): 记录每次执行的命令到日志中, 恢复数据时重新执行一次日志文件中的命令.
  2. RDB(Redis Database Backup): 将数据库的所有数据直接写入磁盘

RDB ( Redis Database Backup )

RDB会将当前Redis中所有存储的数据持久化到dump.rdb文件中.

save 持久化 ( 阻塞 )

Redis是单线程的, 所以save命令一旦执行, 其时间复杂度是O(n), 数据量一大, Redis就会阻塞后面的请求.
所以一般不直接使用save命令进行持久化.

bgsave 持久化 ( fork子进程 )

Redis提供了bgsave命令, fork一个子进程来进行save. 这样就不会阻塞住原本的进程.
fork后的子进程执行save命令, 会创建一个临时RDB文件, 待持久化完毕后, 覆盖之前的RDB文件.
但是fork这个操作, 仍然是阻塞的,

save seconds changes ( 定时持久化 )

Redis的配置文件中, 还提供了另一种RDB持久化方式, 格式: save <seconds> <changes>

1
2
3
4
# save "" # 关闭 RDB
save 900 1
save 300 10
save 60 10000

表示seconds秒内改变了changes次数据, 则自动bgsave.
缺点也很明显, 无法控制生成RDB的频率

最佳配置 ( 开启 RDB 时 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 注释掉所有的 save 命令
# save 900 1
# save 300 10
# save 60 10000

# 2. 指定 RDB 文件名
dbfilename dump-6379.rdb
# 3. 指定存储文件夹, 放RDB文件、AOF文件、log文件
dir /data
# 4. 指定 bgsave 发生错误时停止写入
stop-writes-on-bgsave-error yes
# 5. 压缩 RDB 文件
rdbcompression yes
# 6. 校验 RDB 文件
rdbchecksum yes

值得注意的是, 即使在配置文件中关闭RDB自动持久化, 在以下情况, 仍会产生RDB文件.

  1. 主从复制之全量复制时, 会生成RDB文件
  2. debug reload重启Redis, 会生成RDB文件
  3. shutdown save保存退出时, 会生成RDB文件

AOF(Append Only File)

AOF会将执行的命令优化(重写)后, 保存到内存中, 然后再从内存fsync到硬盘中.
待恢复时, 重新执行这些命令.

1
2
3
4
5
6
7
# 1. 打开 AOF 持久化
appendonly no

# 2. 三种 fsync 方式
# appendfsync always # 每次执行命令都会 fsync
appendfsync everysec # 每秒执行 fsync
# appendfsync no # 取决于操作系统执行 fsync (不可控)

手动重写

假设要执行以下命令

1
2
3
set a a
set a b
set a c

那么AOF肯定不会傻傻的将这3条命令写到AOF文件中, 因为只要保证set a c即可.
忽略中间态, 这就是AOF重写.
可以极大的减少AOF文件大小, 加快AOF恢复速度.

要手动重写, 只需要执行bgrewriteaof命令即可.
它会fork一个子进程来执行AOF重写操作.

自动重写

Redis也在配置文件/etc/redis.conf中提供了满足一定条件就自动重写的配置.

1
2
3
4
# 1. 当 AOF 文件大于某个值时进行重写
auto-aof-rewrite-min-size 64mb
# 2. AOF 文件增长率, 下次就是到达 128mb、 256mb 就会重写.
auto-aof-rewrite-percentage 100

我们可以在redis-cli客户端查看info信息.

1
2
3
4
info persistence
# AOF开启, 才会追加以下信息
# aof_current_size AOF 文件当前大小
# aof_base_size 上次AOF文件重写时的大小

当满足以下条件时, AOF文件会自动重写.

1
2
aof_current_size > auto_aof_rewrite_min_size
aof_current_size - aof_base_size / aof_base_size > auto_aof_rewrite_percentage

最佳配置 ( 开启 AOF 时 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. 开启 AOF
appendonly yes
# 2. 指定 AOF 文件名
appendfilename appendonly-6379.aof
# 3. 指定存储文件夹, 放RDB文件、AOF文件、log文件
dir /data
# 4. AOF 每秒保存一次, 宕机最多丢失一秒数据
appendfsync everysec
# 5. AOF 重写时是否正常执行 AOF
no-appendfsync-on-rewrite yes
# 6. 当 AOF 文件大于 64mb 时进行重写
auto-aof-rewrite-min-size 64mb
# 7. AOF 文件增长率, 下次就是到达 128mb、 256mb 就会重写
auto-aof-rewrite-percentage 100

参考资料

点击进入云乞讨模式!
  • 本文作者: Ahaochan
  • 本文链接: Redis_RDB_and_AOF
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
0%