暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis#2——Redis持久化

别动我的月亮啊 2021-01-21
160


  • 1 Redis持久化简介

    • 1.1 什么是持久化

    • 1.2 持久化过程保存什么

  • 2 RDB

    • 2.1 save指令

    • 2.2 save指令相关配置

    • 2.3 RDB启动方式——save指令工作原理

    • 2.4 RDB启动方式——后台执行bgasve

    • 2.5 RDB启动方式——save配置

    • 2.6 RDB特殊启动形式

    • 2.7 RDB的优点

    • 2.8 RDB缺点

  • 3 AOF

    • 3.1 RDB弊端的解决思路

    • 3.2 AOF概念

    • 3.3 AOF写数据过程

    • 3.4 AOF功能开启

    • 3.5 AOF重写

    • 3.6 AOF重写流程

    • 3.7 RDB和AOF区别


Redis的持久化

1 Redis持久化简介

1.1 什么是持久化

在操作系统中,内存和硬盘以块为单位交换信息。内存中可以选择当某个块不再使用时再将内容中刷新到硬盘,也可以选择硬盘和内存同步更新数据(实现数据保护)。

Redis是工作在内存上的,一旦出现断电等意外情况,那么redis中的数据将会丢失。因而redis有自己的持久化方案来确保数据安全性。

1.2 持久化过程保存什么

  • **保存数据快照:**将操作中的所有数据都保存下来
  • **保存日志:**将操作过程记录下来

redis使用了以上两种的保存方案——RDB
AOF

2 RDB

2.1 save指令

持久化命令:save
。相当于用户主动使用ctrl+s
保存数据,保存到一个rdb文件中。需要用户主动去保存。

2.2 save指令相关配置

save指令相关配置

2.3 RDB启动方式——save指令工作原理

假如有多个客户端,因为redis是单线程,它们与服务器的通信是通过任务队列完成的。而save指令的执行会阻塞当前Redis服务器,直到当前RDB过程完成为止,有可能会造成长时间阻塞,线上环境不建议使用

2.4 RDB启动方式——后台执行bgasve

使用命令——bgsave
。与save
指令不同的是,它的执行时间不是立刻执行,而是服务器根据实际情况来选择什么时候保存。

bgsave指令执行过程

2.5 RDB启动方式——save配置

  • 配置
save second changes

  • 作用

满足限定时间范围内key的变化达到指定数量就触发持久化

  • 参数

second:监控时间范围

changes:监控key的变化

  • 位置

在conf文件中进行配置

save配置原理

save配置原理

save配置需要根据实际业务情况进行设置,频度过高或过低都会出现性能问题,结果可能是灾难性的。save配置启动后执行的是bgsave操作

2.6 RDB特殊启动形式

  • 全量复制:主从复制有关
  • 服务器运行过程中重启:debug reload
  • 关闭服务器时指定保存数据:shutdown save

2.7 RDB的优点

  • RDB是一个紧凑压缩的二进制文件,存储效率较高
  • RDB内部存储的是redis在某个时间点的数据快照,非常适合用于数据、全量复制等场景
  • RDB恢复数据的速度要比AOF快很多
  • 应用:服务器每X小时执行bgsave,并将RDB文件拷贝到远程机器中,用于灾难恢复

2.8 RDB缺点

  • RDB方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的可能性丢失数据
  • bgsave指令每次运行要执行fork操作创建子进程,要牺牲掉一些性能
  • Redis的众多版本中未进行RDB文件格式的统一,有可能出现各版本服务之间数据格式无法兼容现象
  • 存储数据量大,大数据情况下效率低,IO性能较低

3 AOF

3.1 RDB弊端的解决思路

  • 不记录所有数据,而是记录部分数据
  • 改记录数据为记录操作过程
  • 对所有操作均进行记录,排除丢失数据的风险

3.2 AOF概念

独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令达到恢复数据的目的。

AOF主要作用是数据持久化的实时性,目前已经是Redis持久化的主流方式

3.3 AOF写数据过程

Redis每次接收一条数据不会马上执行,而是将指令存储到AOF写命令刷新缓存区
。然后通过命令将这些指令存储到.aof
文件当中。这中间有三种写策略:

AOF写数据三种策略

  • always(每次):每次写入操作都存储到AOF文件中,数据0误差,性能较差。
  • everysec(每秒):每秒将缓冲区中指令同步到AOF文件中,数据准确性较高,性能较高
  • no(系统控制):由操作系统控制,整体过程被可控

3.4 AOF功能开启

  • 配置:appendonly yes|no
    作用:是否开启AOF持久化功能,默认为不开启状态。
  • 配置:appendfsync always|everysec|no
    作用:AOF写策略
  • 配置:appendfilename filename
    作用:AOF持久化文件名,默认文件名为appendonly.aof,建议配置为appendonly-端口号.aof
  • 配置:dir
    作用:AOF持久化文件保存路径

3.5 AOF重写

AOF遇到的问题

连续指令的优化

随着命令不断写入,AOF文件会越来越大。为了解决这个问题,Redis引入AOF重写机制压缩文件体积。也就是只记录会对最终结果造成影响的操作

AOF重写作用

  • 降低磁盘占用量,提高磁盘利用率
  • 提高持久化效率,降低持久化写时间
  • 降低数据恢复用时,提高数据恢复效率

AOF重写规则

  • 进程内已超时的数据不再写入文件
  • 忽略无效指令,只保留最终数据的写入命令
  • 对同一数据的多条写命令合并为一条命令

AOF重写方式

  • 手动重写:

    bgrewriteaof

  • 自动重写:

    auto-aof-rewrite-min-size size				# 当aof文件达到size时就开始重写,比对当时的文件大小 —— aof_current_size
    auto-aof-rewrite-percentage percentage # 使用一个增量的比较方式,当文件大小达到总文件大小 —— aof_base_size 百分比时就重写

AOF重写工作原理

AOF重写工作原理

3.6 AOF重写流程

AOF重写流程
基于everysec开启重写的流程

3.7 RDB和AOF区别

RDB和AOF的区别

RDB和AOF如何选择?

简单来说:如果对数据非常敏感,不允许数据出错,建议使用默认的AOF持久化方案;如果数据呈现阶段有效性(阶段内无丢失),建议使用RDB持久化方案

综合对比

  • RDB与AOF的选择实际上是在做一种权衡,每种都有利有弊
  • 如不能承受数分钟以内的数据丢失,对业务数据非常敏感,选用AOF
  • 如能承受数分钟以内的数据丢失,且追求大数据集的恢复速度,选用RDB
  • 灾难恢复用RDB
  • 双保险策略,同时开启RDB和AOF,重启后,Redis优先使用AOF恢复数据,降低丢失数据的量。


文章转载自别动我的月亮啊,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论