前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis的持久化机制,RDB 和 AOF 原理

Redis的持久化机制,RDB 和 AOF 原理

作者头像
HaC
发布2020-12-30 18:00:58
1.3K0
发布2020-12-30 18:00:58
举报
文章被收录于专栏:HaC的技术专栏HaC的技术专栏

Redis是基于内存操作,很快,既然Redis在内存工作,但是数据如何保存呢?

在Redis重启的时候,如何把数据恢复,保持一致性,这就涉及Redis的持久化机制了。

1、Redis的持久化机制

Redis的持久化机制有两种:

  • RDB
  • AOF

可以单独使用其中一种或将二者结合使用。

2、RDB

RDB持久化是将当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化),保存的文件后缀是.rdb

2.1 自动触发

常见配置:

代码语言:javascript
复制
# Redis默认设置, 表示  900秒内产生1条写入命令就触发一次快照,自动触发 bgsave
save 900 1
save 300 10
save 60 10000

# 如果持久化出错,主进程是否停止写入
stop-writes-on-bgsave-error yes

# 是否压缩,如果开启,则消耗更多的CPU,否则消耗更多硬盘
rdbcompression yes

# 使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗
rdbchecksum yes

# 快照文件名称
dbfilename dump.rdb

# 快照文件保存路径
dir ./

①、save m n:表示m秒内数据集存在n次修改时,自动触发bgsave

其他参数解释见上。

2.2 手动触发

手动触发有两种方法:

  • 1)save 同步操作,会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。
  • 2)bgsave 异步操作,Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。
代码语言:javascript
复制
localhost:0>save
"OK"

localhost:0>bgsave
"Background saving started"

localhost:0>lastsave
"1603777804"

很明显bgsave 更适合执行RDB 操作,所以Redis的内部操作,包括自动触发,也是 bgsave

RDB bgsave 具体过程如下:

​ 1、Redis服务器接收bgsave,主线程需要调用系统的 fork() 函数,构建出一个子进程去操作; ​ 2、子线程创建好RDB文件并退出时,向父进程发送一个通知,告知RDB文件创建完毕; ​ 3、父进程接收子进程创建好的RDB文件,bgsave命令执行结束。

3、AOF

AOF是记录Redis的命令,增量备份。

常见配置:

代码语言:javascript
复制
# 是否开启aof,默认是不开启
appendonly no

# 文件名称
appendfilename "appendonly.aof"

# 同步方式,有三种,默认是 everysec
appendfsync everysec

# aof重写期间是否同步
no-appendfsync-on-rewrite no

# 重写触发配置
# (当前AOF文件大小超过上一次重写的AOF文件大小的百分之多少才会重写)
auto-aof-rewrite-percentage 100
# AOF文件重写需要的尺寸,AOF多大时开启重写
auto-aof-rewrite-min-size 64mb

# 文件重写策略
aof-rewrite-incremental-fsync yes

appendfsync everysec的三种模式:

  • always:把每个写命令都立即同步到aof文件,很慢,但是很安全
  • everysec:每秒同步一次,Redis官方推荐。
  • no:redis不刷盘交给OS来处理,非常快,但是也最不安全

aof-rewrite-incremental-fsync

每次批量写入磁盘的数据量由aof-rewrite-incremental-fsync参数控制,默认为32M,避免单次刷盘数据过多造成硬盘阻塞

3.1 AOF的工作流程:
  1. 所有的写入命令追加到aof_buf缓冲区中。
  2. AOF会根据对应的策略向磁盘做同步操作。刷盘策略由appendfsync参数决定。
  3. 定期对AOF文件进行重写。重写策略由auto-aof-rewrite-percentageauto-aof-rewrite-min-size两个参数决定。
3.2 为什么需要重写?

因为重写后文件会变小。

  1. 进程内超时的数据不用再写入到AOF文件中。
  2. 存在删除命令。
  3. 多条写命令可以合并为一个。

比如一个value 自增1w次,那AOF就需要记录1w次的操作,如果重写后,就可以直接记录该key的最终set值了。

3.3 AOF重写过程

​ 重写分为:

AOF重写大致过程:

  1. 父进程执行fork(),创建一个子进程。
  2. 父进程处理客户端请求,父进程把所有修改命令会写入到aof_rewrite_buf中,并根据appendfsync策略持久化到AOF文件中。
  3. 子进程把新AOF文件写入完成后,子进程发送信号给父进程,父进程更新统计信息。
  4. 父进程将aof_rewrite_buf(AOF重写缓冲区)的数据写入到新的AOF文件中。

过期的键不会被记录到 AOF 文件中

 AOF重写流程
AOF重写流程

AOF的持久化也可能会造成阻塞。

fsync 每秒同步一次,假如系统磁盘比较忙,可能就会造成Redis主线程阻塞。

4、数据恢复

当Redis重新启动时,可以读取快照文件恢复数据。

将备份文件 (dump.rdb) 或者 (.aof文件)移动到 redis 安装目录并启动服务即可,redis就会自动加载文件数据至内存了。

RDB恢复又分两种情况:

1)主库master

  • 载入RDB时,过期键会被忽略。

2)从库salve

载入 RDB 时,文件中的所有键都会被载入,当同步进行时,会和Master 保持一致。不过,因为主从服务器在进行数据同步的时候,从服务器的数据库就会被清空,所以一般来说,过期键在载入RDB文件的从服务器也不会造成影响

AOF则不会,过期但并未被删除释放的状态会被正常记录到 AOF 文件中,当过期键发生释放删除时,DEL 也会被同步到 AOF 文件中去。

如果同时开启了RDB和AOF,Redis会优先加载AOF文件,找不到AOF文件才会加载RDB文件。

redis4.0开始 添加了RDB-AOF混合方式,可以通过设置aof-use-rdb-preamble yes开启。.aof文件就由.rdb.aof文件组成了。这样加载速度快,同时结合AOF,增量的数据以AOF方式保存了,数据更少的丢失。

参考:

  • https://www.cnblogs.com/ivictor/p/9749465.html
  • https://blog.csdn.net/qq_28018283/article/details/80764518
  • https://redis.io/topics/persistenc
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-10-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、Redis的持久化机制
  • 2、RDB
    • 2.1 自动触发
      • 2.2 手动触发
      • 3、AOF
        • 3.1 AOF的工作流程:
          • 3.2 为什么需要重写?
            • 3.3 AOF重写过程
            • 4、数据恢复
            相关产品与服务
            云数据库 Redis
            腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档