持久化的作用

什么是持久化

redis的所有数据保存在内存中,对数据的更新将异步的保存到硬盘上

持久化的实现方式

快照:某时某刻数据的一个完整备份(mysql的Dump,redis的RDB)
写日志:任何操作记录日志,要恢复数据,只要把日志重新走一遍即可
mysql的 Binlog,Hhase的 HLog,Redis的 AOF

RDB

什么是RDB

触发机制-主要三种方式

# 1.save(同步)
'''
1 客户端执行save命令----》redis服务端----》同步创建RDB二进制文件
2 会造成redis的阻塞(数据量非常大的时候)
3 文件策略:如果老的RDB存在,会替换老的
4 复杂度 o(n)
'''
# 2.bgsave(异步,Backgroud saving started)
'''
1 客户端执行save命令----》redis服务端----》异步创建RDB二进制文件(fork函数生成一个子进程(fork会阻塞reids),执行createRDB,执行成功,返回给reids消息)
2 此时访问redis,会正常响应客户端
3 文件策略:跟save相同,如果老的RDB存在,会替换老的
4 复杂度 o(n)
'''
# 3.自动(通过配置)
'''
配置 seconds changes
save 900 1
save 300 10
save 60 10000
如果60s中改变了1w条数据,自动生成rdb
如果300s中改变了10条数据,自动生成rdb
如果900s中改变了1条数据,自动生成rdb 以上三条符合任意一条,就自动生成rdb,内部使用bgsave
'''
# 配置:
save 900 1 #配置一条
save 300 10 #配置一条
save 60 10000 #配置一条
dbfilename dump.rdb # rdb文件的名字,默认为dump.rdb(以端口号作为文件名,可能一台机器上很多reids,不会乱)
dir /hkw/redis/data/ # rdb文件存在当前目录(保存路径放到一个大硬盘位置目录)
stop-writes-on-bgsave-error yes # 如果bgsave出现错误,是否停止写入,默认为yes
rdbcompression yes # 采用压缩格式
rdbchecksum yes # 是否对rdb文件进行校验和检验 # 最佳配置
save 900 1
save 300 10
save 60 10000
dbfilename dump_6379.rdb
dir /hkw/redis/data/
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes

触发机制-不容忽略的方式

1.全量复制  # 没有执行save和bgsave没有添加rdb策略,还会生成rdb文件,如果开启主从复制,主会自动生成rdb
2.debug reload # debug级别的重启,不会将内存中的数据清空
3.shutdown save # 关闭会出发rdb的生成

RDB问题

耗时,耗性能;不可控,可能会丢失数据

AOF

AOF介绍

客户端每写入一条命令,都记录一条日志,放到日志文件中,如果出现宕机,可以将数据完全恢复

AOF的三种策略

日志不是直接写到硬盘上,而是先放在缓冲区,缓冲区根据一些策略,写到硬盘上

always:redis--》写命令刷新的缓冲区---》每条命令fsync到硬盘---》AOF文件

everysec(默认值):redis——》写命令刷新的缓冲区---》每秒把缓冲区fsync到硬盘--》AOF文件

no:redis——》写命令刷新的缓冲区---》操作系统决定,缓冲区fsync到硬盘--》AOF文件

命令 always everysec no
优点 不丢失数据 每秒一次fsync,丢失1秒数据 不用管
缺点 IO开销大,一般的sata盘只有几百TPS 丢1秒数据 不可控

AOF 重写

随着命令的逐步写入,并发量的变大, AOF文件会越来越大,通过AOF重写来解决该问题

原生AOF AOF重写
set hello world
set hello java
set hello hehe
incr counter
incr counter
rpush mylist a
rpush mylist b
rpush mylist c
过期数据
set hello hehe
set counter 2
rpush mylist a b c

本质就是把过期的,无用的,重复的,可以优化的命令,来优化

这样可以减少磁盘占用量,加速恢复速度

实现方式

bgrewriteaof:

客户端向服务端发送bgrewriteaof命令,服务端会起一个fork进程,完成AOF重写

AOF重写配置

配置名 含义
auto-aof-rewrite-min-size AOF文件重写需要尺寸
auto-aof-rewrite-percentage AOF文件增长率
统计名 含义
aof_current_size AOF当前尺寸(单位:字节)
aof_base_size AOF上次启动和重写的尺寸(单位:字节)

自动触发时机(两个条件同时满足):

aof_current_size>auto-aof-rewrite-min-size:当前尺寸大于重写需要尺寸

(aof_current_size-aof_base_size)/aof_base_size>auto-aof-rewrite-percentage:(增长率)当前尺寸减去上次重写的尺寸,除以上次重写的尺寸如果大于配置中的增长率

配置

# 将该选项设置为yes,打开
appendonly yes
# 文件保存的名字
appendfilename "appendonly_6379.aof"
# 采用第二种策略
appendfsync everysec
# 存放的路径
dir /bigdiskpath
# 在aof重写的时候,是否要做aof的append操作,因为aof重写消耗性能,磁盘消耗,正常aof写磁盘有一定的冲突,这段期间的数据,允许丢失
no-appendfsync-on-rewrite yes

RDB和AOF的选择

rdb和aof的比较

命令 rdb aof
启动优先级 高(挂掉重启,会加载aof的数据)
体积
恢复速度
数据安全性 丢数据 根据策略决定
轻重

rdb

优点:

  • RDB快照是一个压缩过的非常紧凑的文件,保存着某个时间点的数据集,适合做数据的备份,灾难恢复;
  • 可以最大化Redis的的性能,在保存RDB文件,服务器进程只需要fork一个子进程来完成RDB文件的创建,父进程不需要做IO操作;
  • 与AOF相比,恢复大数据集的时候会更快;

缺点:

  • RDB的数据安全性是不如AOF的,保存整个数据集的过程是比繁重的,根据配置可能要几分钟才快照一次,如果服务器宕机,那么就可能丢失几分钟的数据;
  • Redis数据集较大时,fork的子进程要完成快照会比较耗CPU、耗时;

AOF

优点:

  • 数据更完整,安全性更高,秒级数据丢失(取决fsync策略,如果是everysec,最多丢失1秒的数据);
  • AOF文件是一个只进行追加的日志文件,且写入操作是以Redis协议的格式保存的,内容是可读的,适合误删紧急恢复;

缺点:

  • 对于相同的数据集,AOF文件的体积要大于RDB文件,数据恢复也会比较慢;
  • 根据所使用的fsync策略,AOF的速度可能会慢于RDB。 不过在一般情况下,每秒fsync的性能依然非常高;

rdb最佳策略

rdb关掉,主从操作时

集中管理:按天,按小时备份数据

主从配置,从节点打开

aof最佳策略

开:缓存和存储,大部分情况都打开

aof重写集中管理

everysec:通过每秒刷新的策略

最佳策略

小分片:每个redis的最大内存为4g

缓存或存储:根据特性,使用不同策略

实时监控硬盘,内存,负载网络等

有足够内存

RDB和AOF如何选择

通常来说,应该同时使用两种持久化方案,以保证数据安全。

  • 如果数据不敏感,且可以从其他地方重新生成,可以关闭持久化。
  • 如果数据比较重要,且能够承受几分钟的数据丢失,比如缓存等,只需要使用RDB即可。
  • 如果是用做内存数据,要使用Redis的持久化,建议是RDB和AOF都开启。
  • 如果只用AOF,优先使用everysec的配置选择,因为它在可靠性和性能之间取了一个平衡。

当RDB与AOF两种方式都开启时,Redis会优先使用AOF恢复数据,因为AOF保存的文件比RDB文件更完整。

总结

rdb和aof的区别为:形式不同、启动效率不同、安全性不同。

形式不同

  • rdb:rdb在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。

  • aof:aof以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。

启动效率不同

  • rdb:通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。

  • aof:由子进程完成这些持久化的工作,可以极大地避免服务进程执行IO操作。如果数据集很大,aof的启动效率会更高。

安全性不同

  • rdb:系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。

  • aof:由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。

04-Redis系列之-持久化(RDB,AOF)的更多相关文章

  1. redis 系列16 持久化 RDB

    一.概述 Redis是内存数据库,一旦服务器进程退出,服务器中的数据库内存数据状态也会消失.为了解决这个问题,Redis提供了RDB 持久化功能,这个功能可以将redis在内存中的数据库状态保存到磁盘 ...

  2. Redis之数据持久化RDB与AOF

    Redis之数据持久化RDB与AOF https://www.cnblogs.com/zackku/p/10087701.html 大家都知道,Redis之所以性能好,读写快,是因为Redis是一个内 ...

  3. redis的持久化(RDB&AOF的区别)

    RDB 是什么? 在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里. Redis会单独创建(fork)一个子进程来进行持久化,会 ...

  4. Redis持久化rdb&aof

    Redis持久化rdb&aof 前言 持久化:即把数据存储于断电后不会丢失的设备中,通常是硬盘 常见的持久化方式: 主从:通过从服务器保持持久化,如mongoDB的replication se ...

  5. Redis之持久化(RDB AOF)

    Redis 提供了 RDB 和 AOF 两种持久化方案: RDB:生成指定时间间隔内的 Redis 内存中数据快照,是一个二进制文件 dumpr.rdb AOF:记录 Redis 除了查询以外的所有写 ...

  6. redis 系列17 持久化 AOF

    一.概述 除了上篇介绍的RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能.与RDB保存数据库中的键值对来记录数据库状态不同,AOF是通过保存redis服务器 ...

  7. Redis持久化--RDB+AOF(转)

    1.Redis两种持久化方式 RDB 执行机制:快照,直接将databases中的key-value的二进制形式存储在了rdb文件中 优点:性能较高(因为是快照,且执行频率比aof低,而且rdb文件中 ...

  8. Linux 安装redis 基本配置 发布订阅,安全配置,持久化 rdb ,aof

    redis redis相关配置1.yum  源码 rpm  yum 快速,间接,高效,解决依赖关系,(自动安装到某个路径,不可控),通过yum安装的软件查询命令 rpm -ql nginx  yum源 ...

  9. 第十章 Redis持久化--RDB+AOF

    注:本文主要参考自<Redis设计与实现> 1.Redis两种持久化方式 RDB 执行机制:快照,直接将databases中的key-value的二进制形式存储在了rdb文件中 优点:性能 ...

  10. 进阶的Redis之数据持久化RDB与AOF

    大家都知道,Redis之所以性能好,读写快,是因为Redis是一个内存数据库,它的操作都几乎基于内存.但是内存型数据库有一个很大的弊端,就是当数据库进程崩溃或系统重启的时候,如果内存数据不保存的话,里 ...

随机推荐

  1. [转帖]mvcc多版本并发控制的原理

      https://baijiahao.baidu.com/s?id=1751185558149315946 MVCC多版本并发控制的原理:通过undo_log多版本链条,加上开启事务时产生的read ...

  2. [转帖]Linux中最全shell命令&常用注意事项

    在编辑linux脚本中不断的会用到复杂的脚本编辑,写文章记录. Linux命令大全(手册) – 真正好用的Linux命令在线查询网站 目录 推荐书籍: Linux常用命令 Linux 常用命令 在li ...

  3. [转帖]一个故事看懂CPU的SIMD技术

    https://www.cnblogs.com/xuanyuan/p/16048303.html 好久不见,我叫阿Q,是CPU一号车间的员工.我所在的CPU有8个车间,也就是8个核心,咱们每个核心都可 ...

  4. [转帖]window10下如何安装fio

    1.fio下载地址(实测有效): https://github.com/axboe/fio/releaseshttps://github.com/axboe/fio/releases 其他的地址如​​ ...

  5. Opentelemetry Metrics API

    Opentelemetry Metrics API 目录 Opentelemetry Metrics API 概览 在没有安装SDK情况下的API行为 Measurements Metric Inst ...

  6. file文件转为base64

    场景描述 在工作中,我们经常需要进行文件上传. 比如在进行图片上传的时候, 我们需要将上传的图片展示出来. 这个时候我们就需要将file文件转化为base64. 将file文件转化为base64 // ...

  7. 手写promise完成异常处理和状态只能够修改一次

    8.处理 Promise 抛出的异常 <script src="./Promise.js"></script> <script type=" ...

  8. vue动画 <transition-group> 使用半场动画

    <style> /* 给动画添加一组过度效果 */ .v-enter, .v-leave-to { opacity: 0.8; /* 从右向左进入 */ transform: transl ...

  9. LINUX安装和配置

    本篇文章为本人从零开始学习linux的学习心得,其中包含了 部署虚拟环境安装linux系统 .其中若有错误之处,请读者积极指出,让本人与读者共同进步. 第一章 部署虚拟环境安装linux系统及配置网路 ...

  10. go中的类型转换成interface之后如何复原

    go中interface转换成原来的类型 首先了解下interface 什么是interface? 如何判断interface变量存储的是哪种类型 fmt 反射 断言 来看下interface的底层源 ...