美文网首页
【Redis】—02、Redis的数据持久化

【Redis】—02、Redis的数据持久化

作者: 云之图 | 来源:发表于2022-12-10 10:59 被阅读0次

1、Redis的持久化方式

1.1、redis为了防止数据丢失以及服务重启时能够恢复数据,Redis支持数据的持久化,主要分为两种方式,分别是RDB和AOF。

1.2、Redis 支持的持久化机制 有三种:

1、RDB(Redis DataBase)持久化

2、AOF(Append Only File)持久化

3、RDB-AOF 混合持久化

1.3、Redis 默认有 16 个数据库,分别是 DB0 ~ DB15。

2、RDB

RDB持久化是把当前进程数据生成快照保存到磁盘上的过程,由于是某一时刻的快照,那么快照中的值要早于或者等于内存中的值。

生成的rdb文件的名称以及存储位置由redis.conf中的dbfilenamedir两个参数控制,默认生成的rdb文件是dump.rdb。

2.1、触发方式

触发rdb持久化的方式有2种,分别是手动触发和自动触发。

手动触发

redis客户端执行save命令和bgsave命令都可以触发rdb持久化,但是两者还是有区别的。

1.使用save命令时是使用redis的主进程进行持久化,此时会阻塞redis服务,造成服务不可用直到持久化完成,线上环境不建议使用;

2.bgsave命令是fork一个子进程,使用子进程去进行持久化,主进程只有在fork子进程时会短暂阻塞,fork操作完成后就不再阻塞,主进程可以正常进行其他操作。

3.bgsave是针对save阻塞主进程所做的优化,后续所有的自动触发都是使用bgsave进行操作。

自动触发

在以下4种情况时会自动触发

1、redis.conf中配置save m n,即在m秒内有n次修改时,自动触发bgsave生成rdb文件;

2、主从复制时,从节点要从主节点进行全量复制时也会触发bgsave操作,生成当时的快照发送到从节点;

3、执行debug reload命令重新加载redis时也会触发bgsave操作;

4、默认情况下执行shutdown命令时,如果没有开启aof持久化,那么也会触发bgsave操作;

配置示例:

save 900 1

save 300 10

save 60 10000

配置分别表示:

900秒(15分钟)内有1个更改

300秒(5分钟)内有10个更改

60秒内有10000个更改


2.2、bgsave 命令的执行流程:

1、若父进程存在正在执行的子进程,直接返回

2、fork 操作(创建子进程) 执行过程中,父进程进入阻塞状态

3、fork 操作 完成后,父进程继续响应其他命令

4、创建 “.rdb” 文件,并存储 父进程内存中的数据

5、父进程 得到通知,以新的 “.rdb” 文件 替换旧的 “.rdb” 文件

2.3、bgsave 命令的原理:COW(Copy On Write)

在 Linux 操作系统中,可以通过 glibc库 中的 fork 函数 创建一个子进程,该进程与父进程完全相同,并且共享 父进程 的内存空间

当 父进程 或 子进程 需要修改内存中的数据时,会将对应的 page 进行复制,然后对副本进行修改

2.4、RDB 的优缺点:

优点

RDB文件是某个时间节点的快照,默认使用LZF算法进行压缩,压缩后的文件体积远远小于内存大小,适用于备份、全量复制等场景;

Redis加载RDB文件恢复数据要远远快于AOF方式;

缺点

RDB方式实时性不够,无法做到秒级的持久化;

每次调用bgsave都需要fork子进程,fork子进程属于重量级操作,频繁执行成本较高;

RDB文件是二进制的,没有可读性,AOF文件在了解其结构的情况下可以手动修改或者补全;

版本兼容RDB文件问题;

3、AOF

3.1、AOF介绍

aof方式持久化是使用文本协议将每次的写命令记录到aof文件中,经过文件重写后记录最终的数据生成命令,在redis启动时,通过执行aof文件中的命令恢复数据。

aof方式主要解决了数据实时性持久化的问题,aof方式对于兼顾数据安全性和性能非常有帮助。

说明:

目前 Redis 持久化 的主流方式(解决了数据持久化的实时性) 

以 独立日志 的方式,记录了每次写入的命令

生成一个 文本协议格式 的 文本文件(文件后缀为 “.aof”)

3.2AOD的启用

AOF 默认不开启,需要修改配置项来启动它:

appendonly yes # 启动 

aofappendfilename "appendonly.aof" # 设置文件名

注:AOF 保存的默认文件是 appendonly.aof

3.3、AOF可以配置三种刷盘策略:

appendfsync always:每次执行写命令都会刷盘,非常慢,也非常安全。

appendfsync everysec:每秒刷盘一次,兼顾性能和安全。

appendfsync no:将刷盘操作交给系统,很快,不安全。

推荐使用everysec,该策略下,最多会丢1秒的数据。


3.4、配置示例

打开配置文件,追加配置如下即可AOF配置。

vim /data/db/redis/6379/redis.conf

appendonly yes

appendfsync everysec

示例:
root@db01:/data/db/redis/6379# cat /data/db/redis/6379/redis.conf

daemonize yes   

port 6379

bind 172.21.209.40  127.0.0.1   

logfile /data/db/redis/6379/redis.log

dir /data/db/redis/6379/

dbfilename dump.rdb

requirepass 123456 

##RDB的配置

save 900 1

save 300 10

save 60 10000

##AOF的配置

appendonly yes

appendfsync everysec

4、两种方式对比

5、Redis混合持久化

重启 Redis 时,我们很少使用 RDB来恢复内存状态,因为会丢失大量数据。我们通常使用 AOF 日志重

放,但是重放 AOF 日志性能相对 RDB来说要慢很多,这样在 Redis 实例很大的情况下,启动需要花费很

长的时间。 Redis 4.0 为了解决这个问题,带来了一个新的持久化选项——混合持久化。

通过如下配置可以开启混合持久化(必须先开启aof):

# aof‐use‐rdb‐preamble yes

如果开启了混合持久化,AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件,而是将重写这一刻之前的内存做RDB快照处理,并且将RDB快照内容和增量的AOF修改内存数据的命令存在一起,都写入新的AOF文件,新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改名,覆盖原有的AOF文件,完成新旧两个AOF文件的替换。

于是在 Redis 重启的时候,可以先加载 RDB 的内容,然后再重放增量 AOF 日志就可以完全替代之前的AOF 全量文件重放,因此重启效率大幅得到提升。

5.1、混合持久化AOF文件结构如下:

6、Redis数据备份策略

1、写crontab定时调度脚本,每小时都copy一份rdb或aof的备份到一个目录中去,仅仅保留最近48

小时的备份。

2、每天都保留一份当日的数据备份到一个目录中去,可以保留最近1个月的备份。

3、每次copy备份的时候,都把太旧的备份给删了。

4、每天晚上将当前机器上的备份复制一份到其他机器上,以防机器损坏。

相关文章

  • 关于redis的几件小事(六)redis的持久化

    1.redis持久化的意义 redis持久化的意义,在于 故障恢复 。如果没有对数据进行持久化,那么如果redis...

  • Redis-2 数据持久化及持久化配置

    一、数据持久化 开启持久化功能后,重启redis,数据会自动通过持久化文件恢复!! 1、redis持久化 – 两种...

  • redis笔记(四)redis持久化

    redis持久化 Redis持久化机制:redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中...

  • redis与memcache区别

    1、持久化 redis是支持持久化存储,宕机重启数据不会丢失,memcache重启后数据丢失 redis持久化的方...

  • Redis常见面试题

    Redis常见面试题 Redis持久化机制 Redis是一个支持持久化的内存数据库,通过持久化机制把内存中的数据同...

  • Redis持久化

    Redis持久化 为什么要持久化 Redis是内存数据库,宕机后数据会消失。 Redis重启后快速恢复数据,要提供...

  • Redis与Memcached区别

    Redis优势 redis具有持久化机制,定期将内存中的数据持久化到硬盘。 redis具备binlog功能,所有操...

  • day40-Python连接Redis

    一、Redis 1.Redis数据库 Redis内存数据库 -> KV数据库 2.Redis持久化数据 Redis...

  • redis数据持久化

    redis数据持久化以及supervisor管理redis supervisor管理redis yum -y in...

  • 3. Redis的两种持久化策略

    前言:Redis的数据都存放在内存中,若没有配置持久化,Redis重启后对丢失数据,所以需要开启Redis的持久化...

网友评论

      本文标题:【Redis】—02、Redis的数据持久化

      本文链接:https://www.haomeiwen.com/subject/jiotqdtx.html