redis持久化机制

RDB&AOF

Redis提供了这两种持久化机制

  • RDB,会在一段时间的指定时间点生成数据集快照
  • AOF,会记录server端收到的每一条写指令,类似数据库的binlog,server重启后以此为依据进行崩溃恢复,新命令以redis格式保存,并进行追加,后台会进行重写以保证体积不超限。
  • 如果仅作为缓存加速,可以不开启
  • 同时开启情况下会使用aof进行崩溃恢复

RDB

redis提供了两个函数save(阻塞式)和bgsave(fork子进程生成rdb文件),rdb的载入同样是自动的,但是有aof的情况下会优先aof。

RDB相关配置

保存点(save point):Redis 如果每 N 秒数据发生了 M 次改变就保存快照文件 如 save 900 1 #900秒后至少1个key有变动

stop-writes-on-bgsave-error yes | no
在bgsave失败是拒绝客户端的写入请求,生产环境一般设置no ,一般由于内存不足会导致bgsave失败,这时候完全可以设置告警,提前干预扩容迁移等操作。

rdbcompression yes(|no)
如果 rdbcompression 配置为 yes,那么即代表 redis 进行 RDB 文件生成中,如果遇到字符串对象并且其中的字符串值占用超过 20 个字节,那么就会对字符串进行 LZF 算法进行压缩。

rdbchecksum yes | no
创建rbd文件时,使用crc64在加载时校验,由于是冗余校验算法,会带来性能损耗,所以可以关闭

RDB的优点

  • RDB适合做备份,保存了某个时间点的数据集,可以用于历史恢复
  • 适合灾备恢复
  • bgsave是fork子进程进行的,不会阻塞当前线程
  • 比起aof,rdb的加载速度更快(aof是命令而rdb是数据)

RDB的缺点

  • 容易导致数据丢失,和生成频率有关,但生成频率过高也容易导致性能影响
  • rdb需要主线程fork子线程执行,这个过程用到了cow(写时拷贝),但是页表的拷贝是不可避免的,当redis实例本身内存比较庞大时,拷贝页表就会占据cpu和内存,分配和初始化大内存块的成本可能很高,导致服务可能产生停顿。

AOF

aof实现

AOF通过保存写命令来记录状态,持久化分为三步(命令追加append、文件写入write、文件同步fsync)
append将命令追加到AOF缓冲区,write将缓冲区内容写入到程序缓冲区,fsync将程序缓冲区的内容写入到文件

append:aof功能开启后每执行一次写命令,都会将命令追加到aof_buf缓冲区末尾。

write和fsync:
Redis server进程是一个事件循环(这里可以去学习一下redis的事件循环概念,相当于redis的底层实现原理了),server 每结束一个事件循环之前都会调用 flushAppendOnlyFile 函数,考虑是否将 aof_buf 缓冲区中的内容吸入和保存到 AOF 文件,而 flushAppendOnlyFile 函数的行为由 appendfsync 选项(可配置)来控制。

always:每个事件循环都将aof_buf中的内容写入aof文件,并调用fsync同步到磁盘,开销极大,效率低,安全性高。

no:每个事件循环都将aof_buf中的内容写入aof文件,但何时同步(刷盘)由操作系统确定,安全性无法保证,写入aof的速度快,但刷盘时间长。

everysec:每个事件循环都将aof_buf中的内容写入aof文件,每秒执行一次刷盘,推荐,既可保证安全又保证效率。

aof重写

aof在上述过程中文件不断变大,过大的aof占据磁盘空间,并且导致恢复时间边长,因此在适当情况下,redis会对aof文件进行重写,去除文件中的冗余命令来减小体积。

aof重写涉及大量的写操作,如果直接调用会导致服务阻塞,所以起单独线程执行aof重写,重写后的文件包含了可以恢复当前数据的命令最小集。

重写时,如果有新的指令,会先执行后将命令追加到aof_buf和重写缓冲区,待子进程完成后发送完成信号,接下来就会将aof重写缓冲区的内容追加到新的aof文件,并且完成原子性覆盖。

两个配置:
auto-aof-rewrite-percentage 100 这个配置表示,redis每次会记录上一次rdb文件的体积,当超过上一次rdb体积100%(根据配置)后执行重写。
auto-aof-rewrite-min-size 128mb 这个配置是防止rdb文件较小,但满足了重写百分比条件的情况,如果想禁用重写设置为0既可。

aof优点

  1. 比rdb更可靠,如果刷盘策略设置为everysec,重启后最多丢失一秒数据。
  2. 由于aof文件采用追加方式,即便断电后再启动也可以正常工作和恢复数据,rdb断电后文件直接整体异常。
  3. aof的重写机制保证aof文件不会太大,重写会创建新文件,同时忘aof_buf和重写缓冲区写入,两个文件的新内容在替换前是不存在差距的,新文件重写完就会替换旧文件。
  4. 如果不小心执行了删库命令,先不用跑路,立马stop服务,在aof重写前,把aof的最后一条删库命令删除然后重新恢复就可以啦

aof缺点

  • 相同数据集下aof一般比rdb要大
  • 如果设置always的刷盘策略可能导致性能很差

混合持久化:4.0之后可以开启混合持久化,aof重写时将rdb内容写到aof开头,好处是结合两者优点,可以快速加载和避免丢失数据,坏处是可读性变差。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值