Redis13 - 持久化RDB、AOF

持久化的两种方式

由于redis是基于内存的存储方式,所以redis内数据的特点是掉电易失,所以redis也提供了持久化的方案。
常用持久化的两种方案:

  • 快照/副本 - 复制出一份数据的镜像
  • 日志 - 逐条记录操作

关于Linux进程通信的相关概念

管道:

1.衔接作用,前一个命令的输出 作为后一个命令的输入
2.管道会触发创建子进程

#当前解释程序的进程ID
echo $$                 - 19251
#当前解释程序的进程ID   $$ = $BASHPID
echo $BASHPID           - 19251
#$$ 高于管道,先开辟进程再执行管道
echo   $$ | more        - 19251
#$BASHPID 优先级低于管道,先开启管道,管道会触发创建子进程,再开启了两个子进程
echo $BASHPID  | more   - 19524

Linux父子进程通信

1.父子进程概念的引出

num=0
echo $num              - 0
((num++))
echo $num              - 1
((num++)) | echo ok    - ok
echo $num              - 1
echo $$                - 13646
echo $$ | more         - 13646
echo $BASHPID          - 13646
#抛出了子进程
echo $BASHPID | more   - 13672
echo $BASHPID | more   - 13674
echo $BASHPID | more   - 13676

2.常规思想中,进程数据是隔离的

echo  $$              - 13646
echo $num             - 1  当前bash的num == 1
#启动一个新的进程
/bin/bash
echo $$               - 13679
#查看进程
pstree -
systemd─┬─AliSecGuard───6*[{AliSecGuard}]
        ├─AliYunDun───22*[{AliYunDun}]
        ├─AliYunDunUpdate───3*[{AliYunDunUpdate}]
        ├─2*[agetty]
        ├─aliyun-service───2*[{aliyun-service}]
        ├─atd
        ├─auditd───{auditd}
        ├─crond
        ├─dbus-daemon
        ├─dhclient
        ├─ntpd
        ├─polkitd───5*[{polkitd}]
        ├─redis-server───3*[{redis-server}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd───sshd───bash───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        └─tuned───4*[{tuned}]
#sshd───sshd───bash───bash───pstree可以看出启动的进程是当前bash的子进程
 echo $num    - 没有值,之前bash中的num == 1
由此可得在常规思想中,进程数据是隔离的

3.进阶思想,父进程其实可以让子进程看到数据

echo $num   - 1
export num
echo $num   - 1
/bin/bash
echo $num -1
进阶思想,父进程可以让子进程看到数据

4.在linux中,export的环境连变量,子进程的修改不会破坏父进程(子进程修改数据,父进程的数据不会修改)

1.echo num=1

2.#编辑脚本
vim  test.sh
#切换到子进程
#!/bin/bash
#打印子进程的num并且修改为999
echo $$
echo #num
num=999
echo num:$num
#子进程睡眠20秒,再打印num
sleep 20
- 休眠之后切换到父进程  观察num的数值
echo #num

#编辑完文件后,把该文件修改为可执行文件
3.chmod +x test.sh
4../test.sh &在后台运行脚本查看结果
5.echo $num   - 1     子进程睡眠后观察父进程的num=1
6.999         -       子进程num依然等于999
在linux中,export的环境连变量,子进程的修改不会破坏父进程

4.在linux中,export的环境连变量,父进程的修改不会破坏子进程

echo $num   - 1
./test.sh &
#子进程休眠,给num赋值888
num=888
#子进程依然是999
999

Redis如何创建副本

首先要思考的是:如果redis是父进程,有10G数据,那么
1.Redis创建子进程的速度如何
2.创建子进程后内存空间是10G还是20G?

在我们操作程序时,操作系统会帮我们维护内存,把应用程序的虚拟内存映射为物理内存



此时当我们使用系统调用System Call:fork(),会为我们创建子进程,在创建子进程的过程中,根据之前的知识,子进程可以看到父进程的数据,只需把指针指向具体物理地址,不需要复制数据,速度相对快,占用空间小

man 2 fork
fork

redis创建子进程

当我们修改数据时,父进程指向新的物理地址,bash依旧指向原来的物理地址,此时bash依旧可以把执行持久化操作时间点的数据做对应操作。


cow

Redis的持久化配置

1.RDB

save 900 1
save 300 10
save 60 10000
默认开启,如果什么都不写就是空
dbfilename dump.rdb - RDB文件名
dir var/lib/redis/6379 -RDB文件路径

RDB的优点:

  • 类似java的序列化,恢复速度相对快

RDB的缺点:

  • 不支持拉链,只有一个dump.rdb,需要每天或者定时把dump.rdb文件考出并添加时间
  • 丢失数据相对多,时间点和时间点之间的窗口的数据容易丢失


    RDB总结
2.AOF

把redis的写操作记录到文件中

appendonly yes
no-appendfsync-on-rewrite no #RDB时是否AOF
aof-use-rdb-preamble no #是否开启RDB、AOF混用

AOF的优点:

  • 丢失数据少

AOF的缺点:

  • 数据体量无限变大,恢复慢

Redis中,RDB和AOF可以同时开启,如果开启了AOF只会用AOF恢复数据。
为了减少日志体量

  • 4.0之前:Redis会删除抵消的命令,合并重复的命令。最终得到一个纯指令文件。
  • 4.0之后:将老的数据RDB到AOF文件中,将增量数据以指令的方式append到AOF文件中,得到一个混合体

AOF级别:

appendfsync no
appendfsync always
appendfsync everysec

详解appendfsync
刷写AOF的过程是Redis先把数据写入内核buffer(4K左右),再刷写给磁盘(类似flush方法),appendfsync配置是控制刷写的频率

  • appendfsync no:当buffer满了刷写给磁盘,最多丢失一个buffer大小的数据
  • appendfsync always:每一条数据刷写一次,最多丢失一条数据
  • appendfsync everysec:每一秒数据刷写一次,最多丢失一秒内数据,最大不到一个buffer大小(推荐)
总结:
appendfsync

AOF总结

验证

  • 关闭redis
  • vi /etc/redis/6379.conf
  • daemonize no 为了看前台的日志
  • logfile /var/log/redis_6379.log注释掉 日志打印到屏幕
  • appendonly yes
cd /var/lib/redis/6379
rm -rf appendonly.aof
rm -rf dump.rdb

#启动redis
redis-server /etc/redis/6379.conf
set k1 hello
  • 打开AOF文件
    *代表 下一条指令由几个元素组成,比如这里2 - select ,0
    $代表这个元素又几个字符组成
*2     
$6
SELECT
$1
0
*3
$3
set
$2
k1
$5
hello
  • bgsave
Background saving started by pid 17043
17043:C 29 Jun 2020 12:29:29.454 * DB saved on disk
17043:C 29 Jun 2020 12:29:29.454 * RDB: 4 MB of memory used by copy-on-write
17036:M 29 Jun 2020 12:29:29.461 * Background saving terminated with success
  • 检查持久化是否成功
redis-check-rdb  dump.rdb
  • 删除抵消指令
set k1 a
set k1 b
set k1 c
#观察AOF文件再执行以下操作 
BGREWRITEAOF
  • 修改配置 开启RDB、AOF混合
aof-use-rdb-preamble yes
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342