kun's blog

vuePress-theme-reco kun    2020 - 2021
kun's blog kun's blog

Choose mode

  • dark
  • auto
  • light
Home
Category
  • Linux
  • Java
  • Spring
  • DevOps
  • Blog
  • Java 并发
  • Cache
  • API加密
  • Redis
  • Spring Cloud
  • Summer
tag
TimeLine
GitHub
author-avatar

kun

42

Article

39

Tag

Home
Category
  • Linux
  • Java
  • Spring
  • DevOps
  • Blog
  • Java 并发
  • Cache
  • API加密
  • Redis
  • Spring Cloud
  • Summer
tag
TimeLine
GitHub

Redis 的两种持久化策略

vuePress-theme-reco kun    2020 - 2021

Redis 的两种持久化策略


kun 2021-06-16 RedisRDBAOF

redis 有两种持久化策略:RDB和AOF。

# RDB

RDB是一种快照持久化策略,顾名思义,就是通过保存快照来备份redis中的数据。

# RDB 配置

RDB是redis默认的持久化策略,redis.conf 中相关配置如下:

save 900 1                          #900秒内至少1个key被修改则保存快照
save 300 10                         #300秒内至少10个key被修改则保存快照
save 60 10000                       #60秒内至少1000-个key被修改则保存快照
stop-writes-on-bgsave-error yes     #快照创建失败后是否继续执行写命令
rdbcompression yes                  #是否对快照文件进行压缩
dbfilename dump.rdb                 #生成的快照文件名
dir ./                              #生成的快照存放位置

# 关闭RDB

save ""
# save 900 1
# save 300 10
# save 60 10000 

# 触发 RDB 备份

  • save 命令:暂停用户线程进行备份;
  • bgsave命令:fork 子线程进行备份;
  • 触发 redis.conf 中配置的快照备份规则时启动的是 bgsave。
  • shutdown:当使用 shutdown 命令关闭 redis 时,会自动执行一个 save 命令然后再关闭服务。
  • 从机上线:配置主备后,从机上线会给主机发送 sync 命令,此时主机会执行一次 bgsave 命令,然后将快照数据发给从机。

# RDB 工作方式

当触发 RDB 备份时:

  • Redis 调用 forks 同时拥有父进程和子进程;
  • 子进程将数据写入一个临时的 RDB 文件当中;
  • 当子进程完成新 RDB 文件的写入时,Redis 用新文件替换老文件。

# RDB 的优点

  • 文件紧凑,适合做历史备份,可以方便的恢复到某一时间点的状态(灾备);
  • 可以通过 fork 子进程来进行备份,对性能影响小;
  • 恢复大量数据时比 aof 快;

# RDB的缺点

save 命令会阻塞用户线程; bgsave 命令 fork 子线程会占用资源; 定期持久化会有丢失数据的风险; 如果数据吞吐量过大,RDB 会频繁 fork 子进程进行备份,影响性能。

# AOF

与快照持久化不同的是aof持久化是将新的写命令追加到aof文件的莫问,恢复时从头执行一遍aof文件中的命令就行了。

# AOF 配置

aof默认是不开起的,redis.conf 中增加如下配置开启:

appendonly yes                      #是否开启aof持久化
appendfilename "appendonly.aof"     #aof文件名称
# appendfsync always                #备份策略,每次执行写命令都追加到aof文件末尾
appendfsync everysec                #每秒追加一次新的写入操作
# appendfsync no                    #把备份时机交给操作系统
no-appendfsync-on-rewrite no        #进行aof文件压缩时是否进行同步
auto-aof-rewrite-percentage 100     #
auto-aof-rewrite-min-size 64mb      #

# AOF 工作方式

AOF 重写和 RDB 创建快照一样,都巧妙地利用了写时复制机制:

  • Redis 执行 fork() ,现在同时拥有父进程和子进程。
  • 子进程开始将新 AOF 文件的内容写入到临时文件。
  • 对于所有新执行的写入命令,父进程一边将它们累积到一个内存缓存中,一边将这些改动追加到现有 AOF 文件的末尾,这样样即使在重写的中途发生停机,现有的 AOF 文件也还是安全的。
  • 当子进程完成重写工作时,它给父进程发送一个信号,父进程在接收到信号之后,将内存缓存中的所有数据追加到新 AOF 文件的末尾。
  • Redis 原子地用新文件替换旧文件,之后所有命令都会直接追加到新 AOF 文件的末尾。

# AOF 的优点

  • 默认备份策略是 everysec ,使用默认策略最多丢失 1 秒内的数据;
  • aof 文件过大时会自动进行重写,只保存恢复当前数据的最小命令集合;重写是在新的 aof 文件中进行的,重写完成才会替换老的 aof 文件。
  • 写命令会有序的追加在 aof 文件的末尾,内容易读,方便分析和恢复数据。

# AOF 的缺点

  • 相同大小的数据集,aof 文件体积通常大于 rdb 文件;
  • 处理巨大的写入量时,RDB 能提供比 AOF 更好的安全性。

# 总结

RDB 和 AOF 这两种持久化策略各有特点,如果资源允许,最好同时使用两种备份方式。

  • RDB
  • RDB 配置
  • 关闭RDB
  • 触发 RDB 备份
  • RDB 工作方式
  • RDB 的优点
  • RDB的缺点
  • AOF
  • AOF 配置
  • AOF 工作方式
  • AOF 的优点
  • AOF 的缺点
  • 总结