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

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、每天晚上将当前机器上的备份复制一份到其他机器上,以防机器损坏。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容