Redis持久化(四)

编程

Redis提供两种持久化方式:

  1. RDB: 保存某个时间点的全量数据快照
  2. AOF: 保存redis写操作状态

RDB(快照)持久化

  • 手动触发

    • SAVE:阻塞Redis的服务器进程,直到RDB文件被创建完毕

    • BGSAVE:Fork出一个子进程来创建RDB文件,不阻塞服务器进程 lastsave 指令可以查看最近的备份时间

  • 自动触发

    • 根据redis.conf配置里的save m n定时触发(用的是BGSAVE)

    • 主从复制时,主节点自动触发

    • 执行Debug Relaod

    • 执行Shutdown且没有开启AOF持久化

# 在几秒内改动了多少数据就触发持久化

# 想禁用的话不设置save 或者save ""

#表示900s内如果有1条是写入命令,就触发产生一次快照,可以理解为就进行一次备份

#表示300s内有10条写入,就产生快照

#若要禁用RDB,可直接save ""

save 900 1

save 300 10

save 60 10000

# 备份进程出错主进程停止写入操作

stop-writes-on-bgsave-error yes

# 是否压缩rdb文件 推荐no 相对于硬盘成本cpu更值钱

rdbcompression yes

AOF(Append-Only-File)持久化 :

  • 记录除了查询以外的所有变更数据库状态的指令

  • 以append的形式追加保存到AOF文件中(增量)

  • 日志重写解决AOF文件不断增大的问题,原理如下

    • 调用fork,创建一个子进程

    • 子进程把新的AOF写到一个临时文件里,不依赖原来的AOF文件

    • 主进程持续将新的变动同时写到内存和原来的AOF里

    • 主进程获取子进程重写AOF完成信号,往新AOF同步增量变动

    • 使用新的AOF文件替换掉旧的AOF文件

# 默认关闭若要开启将no改为yes

appendonly no

# append文件的名字

appendfilename "appendonly.aof"

# AOF文件的写入方式

# always一旦缓存区内容发生变化就写入AOF文件中

appendfsync always

# everysec 每个一秒将缓存区内容写入文件 默认开启的写入方式

appendfsync everysec

# 将写入文件的操作交由操作系统决定

appendfsync no

# 当AOF文件大小的增长率大于该配置项时自动开启重写(这里指超过原大小的100%)。

auto-aof-rewrite-percentage 100

# 当AOF文件大小大于该配置项时自动开启重写

auto-aof-rewrite-min-size 64mb

RDB和AOF的优缺点

RDB优点:全量数据快照,文件小,恢复快

RDB缺点:无法保存最近一次快照之后的数据,数据量大会由于I/O严重影响性能

AOF优点:可读性搞,适合保存增量数据,数据不一丢失

AOF缺点:文件体积大,恢复时间长

从持久化中恢复数据

只需要重新启动Redis即可。

启动时会先检查AOF文件是否存在,如果不存在就尝试加载RDB。那么为什么会优先加载AOF呢?因为AOF保存的数据更完整,通过上面的分析我们知道AOF基本上最多损失1s的数据。

性能与实践

通过上面的分析,我们都知道RDB的快照、AOF的重写都需要fork,这是一个重量级操作,会对Redis造成阻塞。因此为了不影响Redis主进程响应,我们需要尽可能降低阻塞。

  1. 降低fork的频率,比如可以手动来触发RDB生成快照、与AOF重写;
  2. 控制Redis最大使用内存,防止fork耗时过长;
  3. 使用更牛逼的硬件;
  4. 合理配置Linux的内存分配策略,避免因为物理内存不足导致fork失败。

在线上我们到底该怎么做?我提供一些自己的实践经验。

  1. 如果Redis中的数据并不是特别敏感或者可以通过其它方式重写生成数据,可以关闭持久化,如果丢失数据可以通过其它途径补回;
  2. 自己制定策略定期检查Redis的情况,然后可以手动触发备份、重写数据;
  3. 单机如果部署多个实例,要防止多个机器同时运行持久化、重写操作,防止出现内存、CPU、IO资源竞争,让持久化变为串行;
  4. 可以加入主从机器,利用一台从机器进行备份处理,其它机器正常响应客户端的命令;
  5. RDB持久化与AOF持久化可以同时存在,配合使用。
参考博客:

https://www.jianshu.com/p/9f4a3915df71 、

https://segmentfault.com/a/1190000015983518

以上是 Redis持久化(四) 的全部内容, 来源链接: utcz.com/z/514431.html

回到顶部