Redis 持久化机制 2

1. 什么是Redis持久化?

持久化是把事务的瞬时状态转化到持久状态。

数据持久化,狭隘的理解为把存储在内存中的数据进行一定的编码存储到持久化介质(例如磁带,磁盘,nand flash)的过程

1.1 Rerdis 有哪几种持久化?
  1. RDB 形式持久化

  2. AOF 形式持久化

  3. RDB+AOF混合形式持久化

官网介绍: http://redis.io/topics/persistence

1.2 什么场景需要Redis持久化?

1.数据并非核心,允许丢失部分:

2.或者兜底溯源数据库根本满足不了业务的性能需求:

3.或者直接利用redis服务本身高可用来达到数据不丢失: 成本太高

4.低成本的离线数据分析


2. RDB持久化

2.1 RDB是什么?

1.RDB属于redis内存数据的snapshots,即某时刻快照

2.RDB采用紧凑型二进制保存

2.2 启用RDB
  • RDB 配置
  1. dbfilename dump.rdb
    配置rdb的文件名
  2. save <seconds> <changes>
    表示经过多少 second 后,如果至少多少个变更的key,那么就会执行rdb snapshots一次
    例如: save 900 1
  3. stop-write-on-bgsave-error yes
    当rdb快照失败的时候,那么后续的变更key的请求都会返回错误(-MISCONF Errors),即请求失败。
    默认配置是yes,即如果开启了rdb,那么还是建议启用这个配置。如果本身rdb并不重要,丢失一段时间没关系,那么可以关闭。
  4. rdbcompression yes
    当rdb快照过程中,遇上key或者value是字符串,并且长度大于等于20的时候就会采用lzf进行压缩,并带上RDB_ENC_LZF标识,以便解析,建议配置。
    好处是:节省了大量的存储空间,在对rdb进行备份,迁移时节省时间
    坏处是:消耗了部分cpu,不管是rdb save过程还是load过程,所以相对分析时间会长一些。
  5. rdbchecksum yes
    启用该配置,会在生成rdb快照过程中,对所有的数据进行crc64计算,以便rdb解析时能够检验,判断rdb是否有被修改;
    这其中会消耗部分cpu算力,影响性能。如果都是rdb不公开,可以不设置。
# rdb持久化策略
save 900 1
save 300 10
save 60 10000
# 启用压缩
rdbcompression yes
# 启用校验
rdbchecksum yes
# 保存的文件位置
dbfilename "redis-6379.rdb"
2.3 可以使用以下的指令主动进行rdb持久化
  • RDB持久化过程
redis-cli -h 127.0.0.1 -p 6379 save
[root@192 conf]# redis-cli -h 127.0.0.1 -p 6379 save
OK
2.4 查看rdb文件内容
od -A x -t x1c -v redis-6379.rdb 
[root@192 conf]# od -A x -t x1c -v redis-6379.rdb 
000000  52  45  44  49  53  30  30  30  39  fa  09  72  65  64  69  73
         R   E   D   I   S   0   0   0   9 372  \t   r   e   d   i   s
000010  2d  76  65  72  06  35  2e  30  2e  31  34  fa  0a  72  65  64
         -   v   e   r 006   5   .   0   .   1   4 372  \n   r   e   d
000020  69  73  2d  62  69  74  73  c0  40  fa  05  63  74  69  6d  65
         i   s   -   b   i   t   s 300   @ 372 005   c   t   i   m   e
000030  c2  c5  77  28  63  fa  08  75  73  65  64  2d  6d  65  6d  c2
       302 305   w   (   c 372  \b   u   s   e   d   -   m   e   m 302
000040  78  06  0d  00  fa  0c  61  6f  66  2d  70  72  65  61  6d  62
         x 006  \r  \0 372  \f   a   o   f   -   p   r   e   a   m   b
000050  6c  65  c0  00  fe  00  fb  01  00  00  07  6d  79  72  65  64
         l   e 300  \0 376  \0 373 001  \0  \0  \a   m   y   r   e   d
000060  69  73  05  68  65  6c  6c  6f  ff  74  f2  37  e6  d7  1f  8c
         i   s 005   h   e   l   l   o 377   t 362   7 346 327 037 214
000070  35
         5
000071

3. AOF持久化

3.1 AOF是什么

AOF主要是记录每一个对数据有更改(删除,新增,update)的命令,通过不同的策略将他们一一持久化到文件。

后续如果有其他redis server根据这个备份启动的时候,会读取aof文件,读取里面的命令就像收到用户命令请求一样执行命令,重构整个数据集。

3.2 启用AOF
  • AOF持久化配置
  1. appendonly no
    更改为yes则为开启AOF持久化
  2. appendfilename "appendonly.aof"
    这里指定了持久化文件的名称
  3. aof fsync模式
    a. appendtsync always
    总是每次写入都强制刷盘,同步刷盘会影响整个系统的运行,影响性能,但是可靠性最好
    b. appendfsync everysec
    每秒强制刷盘默认是这个,影响适中,并且即使发生故障,也是秒级丢失
    c. appendtsync no
    让操作系统自己控制刷盘,影响由系统控制,需要结合系统配置,丢失不可控
  4. no-appendfsync-on-rewrite no
    在aof 整理重写的时候不进行刷盘。重写是避免aof文件不断增大,在符合一定条件情况下,根据某个时刻的redis数据集进行类似快照,但是快照格式是以aof的格式,而不是rdb格式
  5. 哪种条件下进行重写:
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
  • 根据上一次的rewrite后的aof大小,判断当前的aof大小是否是增长了1倍
  • 最小rewrite的aof文件大小
  • 同时满足才会进行rewrite
  1. aof-load-truncated yes
    在进行aof加载重放的时候有问题是否不退出(尽可能多的load数据,截取aof文件最后一个正常的位置并给出log提示)
  2. aof-use-rdb-preamble yes
    是否使用在rewrite全量数据的时候使用rdb格式
# 启用aof持久化
appendonly yes

# 持久化的文件名
appendfilename "appendonly-6379.aof"

# 持久化机制
appendfsync everysec
3.3 tips 关于spop如何持久化的问题

因为AOF是存的指令,那么对于一些随机的存储的指令,是如何记录的呢? 比如 spop指令。其实在存储起来的时候,是使用 srem 指令来替代的,那么这样就能在恢复数据的时候保持一致性。

3.4 如何查看aof 文件?

可以直接打开文件进行查看,但是看到的内容可能会比较难阅读,大致的内容如下

[root@192 conf]# cat appendonly-6379.aof 
*2
$6
SELECT
$1
0
*3
$4
sadd
$5
hello
$8
necodeng
*3
$4
sadd
$5
hello
$4
neco
*3
$4
SREM
$5
hello
$8
necodeng

更方便的方式 aof-selector
aof-selector

  • 下载并且解压和重命名
# 下载
wget https://github.com/hongliuliao/aof-selector/archive/refs/heads/master.zip
# 解压
unzip master.zip
# 重命名
mv aof-selector-master aof-seletcor
  • 编译
# 进入指定目录
cd aof-selector
# 编译,这里如果有报错找不到g++,那么请按照下方的内容进行安装g++相关的内容
make
  • 安装g++
yum install gcc-c++
  • 查看指定的指令的内容,如下方为查看set指令相关的内容
cat ./appendonly-6379.aof | /etc/softwares/aof-selector/output/bin/aof-selector -w 0 -i SET

运行结果如下

...
SET key:000000008690 xxx 
SET key:000000007726 xxx 
SET key:000000001304 xxx 
SET key:000000006182 xxx 
...
3.5 AOF持久化过程

4. 混合持久化

4.1 为什么需要混合持久化?
4.2 什么是混合持久化

如果觉得有收获就点个赞吧,更多知识,请点击关注查看我的主页信息哦~

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

推荐阅读更多精彩内容