【Redis 持久化 看这一篇文章就够了 (精简版)】

本文详细介绍了Redis的RDB和AOF两种持久化机制,包括它们的工作原理、触发条件、优缺点,以及如何进行问题定位和性能优化。特别关注了fork操作对性能的影响和AOF同步策略可能导致的阻塞问题。
摘要由CSDN通过智能技术生成

系列文章目录

【深入理解使用Redis(初识)】

【深入理解使用Redis (Redis API的理解和使用)】



前言

Redis支持RDB和AOF俩种持久化机制,持久化能有效的避免数据丢失问题。同时在启动Redis的可利用之前的持久化文件实现数据恢复或者初始化。本文将全面讲解持久化,并分析介绍常用的场景和问题


一、持久化之RDB

RDB持久化是把当前进程数据生成快照保存到硬盘的过程,RDB持久化可自动触发也可手动触发

1.触发机制

手动触发分别对应save和bgsave命令

  1. save 命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较大的实例阻塞实际较长,不建议线上环境使用
  2. bgsave 命令:Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞时间短。因此一般采用bgsave命令

自动一般就是save的相关配置 比如 save m n m秒内数据集存在n次修改时,自动触发bgsave
全量复制操作,也会自动bgsave,执行shutdown命令时,如果没有开启AOF持久化功能也会自动执行bgsave

2.RDB文件的处理

  1. 保存:RDB文件保存在dir配置的指定的目录下,文件名通过dbfilename配置指定,可以通过执行config set dir {newDir} 和config set dbfilename {newfilename运行期动态执行,当下次运行时RDB文件会保存到新目录 }
  2. 压缩:Redis默认才有LZF算法对生成的RDB文件做压缩处理,压缩后的文件远远小于内存大小,默认开启
  3. 校验:如果Rdis加损坏的RDB文件时会拒绝启动

2.RDB优缺点

  1. 优点
    a,RDB是紧凑压缩的二进制文件,是Redis在某个时间点的数据快照。非常适合用于备份,全量复制等场景。用于灾难恢复
    b, Redis加载RDB恢复数据快于AOF的方式
  2. 缺点
    a, RDB方式数据没办法做到实时持久化/秒级持久化。
    b, RDB采用定制的二进制格式保存,存在老版本redis无法兼容新版本RDB格式的问题

二、持久化之AOF

AOF全称append only file ,是以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用时解决了数据持久化的实时性。目前也是Redis持久化的主流方式。

1.使用

开启AOF需要设置配置:appendonly yes, 默认是不开启的。AOF的文件名通过appendfilename配置设置,默认的文件名是appendonly.aof。保存路径同RDB持久化方式一致
AOF的操作流程如下:
1) 写入命令追加到aof_buf 缓冲区中

2) AOF缓冲区根据对应策列向硬盘做同步操作
2.1)同步策略:always 每次写入倒要同步AOF文件,不建议;everysec 默认配置,建议使用,no 同步操作交给操作系统,每次同步AOF的文件周期不可控,数据安全性无法保证

3)随着AOF的文件越来越大,要定期重写
3.1)重写时把Redis进程内的数据转化为写命令同步到新的AOF文件,这样会过滤掉超时数据的写命令,以及一些无效命令,并且之前的多条命令可以合并成一个。
3.2)重写手动触发:直接调用bgrewriteaof 命令,自动触发根据参数配置auto-aof-rewrite-min-size,表示重写时文件最小体积

4)Redis重启时,加载AOF文件数据恢复

三、问题定位与优化

  1. fork操作
  • 当Redis做RDB或AOF重新的时候,必不可少的就是执行fork操作创建子进程,该操作耗时跟进程总内存相关,建议使用物理机,或者每个Redis实例的内存控制在10G以内。
  1. 子进程开销监控和优化,主要涉及的消耗是CPU,内存和硬盘。如果有问题可通过这三个角度分析问题
  • CPU消耗优化:CPU不要是单核,不要和其他CPU密集型服务部署到一起,避免造成过度竞争,如果有多个redis实例,尽量保证同一时间只有一个子进程在执行重写工作
  • 内存消耗优化:避免大量写入的时候做子进程重写操作
  • 硬盘开销优化:避免高硬盘负载的服务部署在一起,AOF重写时不进行fsync操作
  1. AOF追加阻塞
    AOF持久化同步策略常用的是everysec,对于这种方式,redis会使用另外一条线程每秒执行fsync同步硬盘。当系统硬盘资源繁忙时,就会造成阻塞。

总结

1)Redis提供俩种持久化方式:RDB和AOF
2) RDB 是一次性快照的方式,产生的文件紧凑,更有效,读取速度更快,当时开销比较大,无法实时持久化,常用于数据冷备和复制传输
3)AOF是追加命令到文件实时持久化。但是这样文件会逐渐变大,且命令冗余,需要定期执行重写操作来优化文件
4)多实例的情况下,注意避免CPU和IO资源竞争。
5)持久化注意阻塞场景

  • 32
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值