个人博客网:https://wushaopei.github.io/    (你想要这里多有)

Redis持久化的取舍和选择

        持久化的作用
RDB
AOF
RDB和AOF的选择

一、持久化的作用

  什么是持久化

           持久化的实现方式

1、什么是持久化?

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

如图:

2、持久化方式:

  快照:

  1. MySQL Dump
  2. Redis RDB

   写日志:

  1. MySQL Binlog
  2. Hbase HLog
  3. Redis AOF

二、 RDB1

        什么是RDB
触发机制-主要三种方式
触发机制-不容忽略方式
实验

1、什么是RDB?

Redis是在内存中保存数据的,redis通过一条命令将redis的数据完整的生成一个快照,然后保存到硬盘当中,也就是RDB文件。该文件是二进制的编码保存的。

当我们需要对redis做一个恢复,比如对redis做一个重启,那我们就可以去加载RDB某时某刻的一个二进制备份文件恢复到redis当中。

2、触发机制-主要三种方式:

  • save(同步)
  • bgsave(异步)
  • 自动

3、save命令:

客户端对redis发送一条save命令,redis就会创建一个RDB文件

代码如下:

redis > save
OK

文件策略: 如存在老的RDB文件,新替换老

复杂度:   O(N)

4、 API—— bgsave命令

客户端去执行bgsave,它不会同步的去执行命令,而是使用linux的一个函数 fork(),生成主进程的子进程,也就是redis的子进程,让子进程去执行createRDB生成RDB文件。

某些情况下,在fork()阶段可能因为bgsave操作太多而造成阻塞。(概率极低)

bgsave命令的文件策略和复杂度与save是相同的。

5、save和bgsave的对比:

三、RDB2

1、 自动生成RDB策略:

1)该策略通过配置来实现,参数如下:

2)解析:

第一条: 900秒内改变了一条数据,执行一次save操作

第二条: 300秒内改变了10条数据,执行一次save操作

第三条: 60秒内改变了10000条数据,执行一次save操作

注意: 具体时间和数据量可以通过redis.conf修改

3)配置文件:

上图就是配置文件中的RDB配置参数。

dbfilename dump.rdb

dir ./

日志文件名与存放目录

stop-writes-on-bgsave-error yes            Bgsave发生错误就停止写入

rdbcompression yes                                  对rdb文件采取压缩

rdbchecksum yes                                       对rdb文件进行校验

4)最佳配置:

dbfilename dump-${port}.rdb

dir /bigdiskpath

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

一般不采取默认的save 持久化时间、文件数规则,根据具体的项目要求定义;

Rdb的持久化文件采取 dump-${port}.rdb ,即配置端口号的方式进行创建。从而对rdb文件进行区分、避免相互覆盖;

对bgsave错误采取停止写入操作;

并进行默认压缩和校验操作。

2、触发机制-不容忽略方式:

  1. 全量复制
  2. debug reload
  3. shutdown

以上三个操作都会触发rdb文件的生成。

3、RDB总结

1)RDB是Redis内存到硬盘的快照,用于持久化

2)save通常会阻塞Redis

3) bgsave 不会阻塞Redis,但是会fork新进程

4)save自动配置满足任一就会被执行

5)有些触发机制不容忽视

四、AOF1

AOF

        RDB现存问题
什么是AOF
AOF三种策略
AOF重写

1、RDB的问题:

RDB存在耗时、耗性能的问题。

分析:

1.O(n)数据:耗时

RDB生成redis的数据就是将redis在内存中的数据dump到硬盘当中,然后形成一个rdb文件,首先,它是比较耗时的,我们需要把所有数据全部进行dump,并且它是一个IO的过程,本身的写操作会消耗不少CPU;

2.fork() : 消耗内存,copy-on-write策略

其次,涉及到了性能上的消耗。Redis的RDB存在一个fork()的过程,即对主进程拆分出子进程的操作,虽然是使用的copy-on-write策略,并未对全部数据做操作,但依旧会产生内存的消耗。

3.Disk I/O : IO性能

由内存往硬盘中写文件是一个IO的过程,文件越大,对IO性能影响越大。

4.不可控、丢失数据

使用RDB的缺陷在于,当T1执行多个命令后,在T2时间点满足了RDB自动创建条件后,进行了dump操作;当再次执行多个写命令后,由于系统或其他原因导致redis服务器宕机。

此时,默认是会在服务器重新恢复后通过rdb文件将最后一次dump的数据恢复到redis中,那么这里就可能会存在最后一次dump后执行的写命令无法得到恢复的问题。即,数据存在丢失的问题。

因此,这一RDB机制所能保障的数据安全是不可靠的。

解决RDB数据不完整的方法:使用AOF持久化机制

什么是AOF?

2、AOF运行原理——创建

当客户端向redis执行一条写命令时,redis会向AOF文件同步写入那条写操作的命令。该写入操作是实时的。

3、AOF运行原理——恢复:

4、AOF的三种策略:

always
    everysec
    No

5、 Redis的AOF写入方案

redis在执行AOF的写命令时,不是直接写入到硬盘当中,而是先将写命令的日志写入到硬盘的缓冲区当中,缓冲区会根据一些策略将数据刷新到硬盘对应的aof文件中,从而提高AOF文件写入的效率。

1)策略1: always

而always的意思代表用户在redis客户端每一条写入的命令都会进行同步写入到硬盘当中,这样数据就不会有丢失的危险。

2)策略2:everysec

Redis的命令写入到缓冲区中,缓冲区会在每一秒执行一次命令日志刷新到硬盘当中的操作。

注意:

①这可能会在redis宕机后丢失一秒的数据

        ②这是redis的默认配置

3)策略3:no

操作日志刷新到硬盘的频率和时间有操作系统来决定,操作系统决定什么时候刷新,就什么时候刷新。

6、对三种策略的比较:

五、AOF2

1、AOF的问题:

由于时间的推移或写入命令的变多、并发量的增加,AOF文件会变得很大,从而导致很多问题发生。比如:使用AOF来进行恢复会非常慢,并且文件的无限制增大,对于硬盘的管理还是写入命令的速度都会有一定的影响。

解决方案: AOF重写

2、重写图示:

AOF重写原理:将一些过期的、重写的、一些可以优化的命令进行化简成一个很少的文件。

3、AOF重写作用:

  • 减少硬盘占用量
  • 加速恢复速度

4、例子:

Incr key

Incr key

.......

Incr key(一亿次)

比如incr命令或incrby命令,做自增操作。此时有一个key,它自增到了一个亿,相对于AOF文件来说,它需要做一亿次incr操作,那么,可以想象到,它的文件会是非常大的,它会占用很多的空间。

优化:

Incr key 10000000000(一亿)

使用AOF重写进行优化后就只需要执行一次incr命令就可以了。

同样的,在进行恢复的时候,执行一次incr命令远比执行一亿次incr要高效的多。

5、AOF重写实现两种方式:

  • bgrewriteaof
  • AOF重写配置

6、bgrewriteaof :

客户端对redis服务端的主进程发送一条 bgrewriteaof命令,redis会去异步执行aof操作,并返回类似OK的结果给客户端。

当redis得到 bgrewriteaof命令后,会fork()出一个子进程,由子进程去执行 aof重写操作。

注意:AOF重写操作是对redis中的命令进行回溯,从而实现对命令的优化精简重写。

7、AOF重写配置:

配置:

例:

①AOF文件达到100MB执行重写

②AOF文件的增长幅度达到原来80%进行重写

统计:

8、执行重写操作的基本条件,必须同时满足:

自动触发机制:

aof_current_size > auto-aof-rewrite-min-size

当前文件必须达到最小尺寸

aof_current_size-aof_base_size/aof_base_size >auto-aof-rewrite-percentage

增长幅度满足增长率:当次文件的尺寸减去上次重写文件的尺寸的差除以上次重写文件的尺寸的比率。

9、AOF重写流程:

解析:

3-1进程是指子进程依旧会将写命令写入到aof_buf当中,然后去写到AOF文件当中。

除此之外,我们为了能让新的aof_buf文件能够将新的增量数据写到AOF文件当中,可以使用图中的3-2进程来完成。3-2进程会将增量数据写入到一个新的AOF文件当中,最终,会用新的AOF文件来替代老的AOF文件来完成这一重写的完整过程。

10、AOF功能的相关配置:

 appendonly  yes

要使用AOF的所有功能,必须将该配置打开,置为 yes

appendfilename "appendonly-${port}.aof"

在默认文件名appendonly的基础上添加端口port已区分不同的AOF文件,避免覆盖

appendfsync everysec

使用每秒一次的刷新策略

dir /bigdiskpath

用于保存RDB、AOF的文件目录,一般选择比较大的目录存放,必要情况,可以进行分盘操作

no-appendfsync-on-rewrite yes

在做AOF重写时要不要做append操作,这里的配置意思是我们不做append操作。因为AOF的重写是很消耗性能的,要将子进程的数据从缓存刷新到磁盘当中是有很大的消耗的。

六、AOF实验

1、AOF功能演示:

修改配置:

客户端查看配置:

动态设置appendonly:

127.0.0.1:6379> config get appendonly
1) "appendonly"
2) "no"
127.0.0.1:6379> config set appendonly yes
OK

配置启动重写:

127.0.0.1:6379> config rewrite
OK

测试:

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> set hello java
OK
127.0.0.1:6379> set hello redis
OK

[root@rich redis]# more appendonly.aof

127.0.0.1:6379> incr counter
(integer) 1
127.0.0.1:6379> incr counter
(integer) 2
127.0.0.1:6379> rpush list a
(integer) 1
127.0.0.1:6379> rpush list b
(integer) 2
127.0.0.1:6379> rpush list c
(integer) 3

查看是否生成.aof文件:

查看所有的写操作:

[root@rich redis]# head appendonly.aof

写操作的命令会被进行append

重写aof文件

重写后文件:

查看重写:

重写结果:

七、RDB和AOF抉择

RDB 和 AOF 比较

RDB最佳策略

AOF最佳策略

最佳策略

1、RDB与AOF:

问题:在工具目录下,既有RDB文件,也有AOF文件,那么当redis挂掉,重启之后,它时是加载RDB还是AOF呢?(数据安全性)

Redis会优先加载AOF,因为AOF的数据级别是比较高的,大部分情况下,它能够保存比RDB更新的数据。

2、RDB最佳策略:

①“关”,建议把RDB关掉,rdb不具备有实时数据安全性;

②集中管理,部分场景下比较适合使用,按天、小时进行备份的情况下,数据量级相对较轻,文件比较小、容易传输及管理

③主从,从开? 在从节点进行RDB的策略,注意操作不要太重

3、AOF 最佳策略:

①“开”:缓存和存储;大部分情况下建议开AOF,有利于持久化;并且大部分情况下只会丢失 1 秒的数据。

②AOF重写集中管理,

③everysec,每秒去刷盘

4、最佳策略:

①小分片就是使用maxmemory进行规划;

 比如:我們每個分片的最大内存maxmemory 只设置4G,那么无论是fork()等复制传输都会产生较小的开销;

②缓存或者存储

③监控(硬盘、内存、负载、网络)

④足够的内存 (避免内存的不满,导致over)

Redis 入门到分布式 (五) Redis持久化的取舍和选择的更多相关文章

  1. redis总结(一)的持久化的取舍和选择以及作用

    1.redis持久化 在客户端发布save的过程中有可能造成阻塞,如一千万条数据同时保存并生成二进制RDB文件的时候,此时就会延迟堵塞. 文件策略是如果存在老的RDB文件,会用新的文件替代老的文件如下 ...

  2. redis入门(15)redis的数据备份和恢复

    redis入门(15)redis的数据备份和恢复

  3. redis入门(14)redis集群下的数据分区存储

    redis入门(10)redis集群下的数据分区存储

  4. Redis 入门到分布式 (一)Redis初识

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.Redis特性目录 Redis的特性: 速度快 持久化 多种数据结构 支持多种编辑语言 功能丰富 简 ...

  5. Redis 入门到分布式 (二)API的理解和使用

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 内容: 通用命令 单线程架构 数据结构和内部编码 一.常用的通用命令: keys       计算所有的 ...

  6. redis入门指南(五)—— 复制与哨兵

    写在前面 学习<redis入门指南>笔记,结合实践,只记录重要,明确,属于新知的相关内容. 一.复制 1.在复制中,数据库分为两类,一类主数据库,一类从数据库,主库用来读写,从库用来读,主 ...

  7. <Redis> 入门X 分布式锁

    分布式其实就是多进程的程序,当多个进程访问一个资源,会造成问题: 1.资源共享的竞争问题 2.数据的安全性 分布式锁的解决方案: 1.怎么去获取锁 数据库 zookeeper redis 2.怎么释放 ...

  8. Redis 入门到分布式 (八)Redis Sentinel

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) sentinel-目录 主从复制高可用 安装配置 实现原理 架构说明 客户端连接 常见开发运维问题 一. ...

  9. Redis 入门到分布式 (三) Redis客户端的使用

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.Java客服端:jedis 获取Jedis Jedis基本使用 Jedis连接池使用 1.Jedis ...

随机推荐

  1. SpringMVC源码学习:容器初始化+MVC初始化+请求分发处理+参数解析+返回值解析+视图解析

    目录 一.前言 二.初始化 1. 容器初始化 根容器查找的方法 容器创建的方法 加载配置文件信息 2. MVC的初始化 文件上传解析器 区域信息解析器 handler映射信息解析 3. Handler ...

  2. Day_08【面向对象】扩展案例4_年龄为30岁的老王养了一只黑颜色的2岁的宠物……

    #分析以下需求,并用代码实现: 1.定义动物类 属性: 年龄,颜色 行为: eat(String something)方法(无具体行为,不同动物吃的方式和东西不一样,something表示吃的东西) ...

  3. screen命令两种用法

    screen命令用法举例 screen命令,故名思议于屏幕有关. 1. screen用于关闭shell应用不退出 思路:创建一个单独的shell窗口,在此窗口中启动应用,然后把这个shell放置于后台 ...

  4. python --内建结构 汉诺塔结构

    规则: 1.每次移动一个盘子 2.任何时候大盘子在下面,小盘子在上面 方法: 1.n=1:直接将A上的盘子移动到c 上面,A->C 2.n=2: 1>A->B 2>A-> ...

  5. Python --函数学习2

    一.函数参数和返回值 --参数:负责给函数传递一些必要的数据或者信息 -形参(形式参数):在函数定义的时候用到的参数,没有具体值,只是一个占位符号 -实参(实际参数):在调用函数的时候输入的值 exa ...

  6. 重要的serialVersionUID

    所有序列化的DO都需要加上 serialVersionUID 否则未来可能就有一个坑在等着你 当你需要修改序列化的实体累的时候 之前缓存内容反序列化就会失败,如果这个缓存很多个地方都在存取 使用 那么 ...

  7. 【SMB源码解析系列】——003.SMB游戏基本框架

    前面有了解到RESET中断相关代码,结尾处通过一句jmp进入了无限循环,之后CPU将会在每一帧PUU进入VBlank状态时,接收NMI中断信号, 跳转至NMI代码处继续执行,直到遇见RTI指令时又返回 ...

  8. 00005-js 获取uuid

    admin.guid = function () { function S4() { return (((1+Math.random())*0x10000)|0).toString(16).subst ...

  9. Kafka面试你不得不知道的基础知识

    Java内存管理面试指南一 Java基础面试指南一 Java基础面试指南二 Java基础面试指南三 Java基础面试指南四 Java线程面试指南一 Java线程面试指南二 Redis面试指南一 Kaf ...

  10. 二、YARN

    一.YARN 介绍 yarn 是下一代 MapReduce,即 MRv2,是在第一代 MapReduce 基础上演变而来的,主要是为了解决原始 Hadoop 扩展性较差,不支持多计算框架而提出的,通俗 ...