Redis持久化

1.描述

redis的持久化是为了避免进程突然退出导致数据永久丢失,需要将redis中的数据以某种形式从内存保存到硬盘中。当redis再次重启时,通过这些redis持久化文件对进程结束之前的数据进行数据恢复。
redis持久化的方式有RDB持久化和AOF持久化两种。RDB持久化是通过将数据保存到硬盘,AOF持久化则是通过将命令保存到硬盘。由于AOF持久化的实时性更好,即当进程意外退出时丢失的数据更少,因此AOF是目前主流的持久化方式。

2.RDB持久化

RDB持久化是将redis中的数据以快照的方式保存到硬盘中,保存的为rdb文件,在redis重启时会通过读取这个文件进行恢复数据。

2.1 触发方式

RDB持久化分为手动触发和自动触发两种。
手动触发
手动触发可以通过save和bgsave命令进行触发

  • save命令:当执行save命令后,redis会对数据进行持久化操作,但是该命令会阻塞当前redis服务器,因此一般生产环境进行持久化的时候不会通过该命令进行。
  • bgsave命令:当执行bgsave命令,redis进行持久化是通过主进程fork一个子进程进行持久化操作,因此其只有在fork的过程中才会阻塞redis服务器,而在数据持久化的过程中并不会阻塞。

自动触发
自动触发是通过redis的配置文件redis.conf中的save <seconds> <changes>命令进行自动执行的,该命令的含义是当seconds秒内发生了chasnges次改变时,会调用bgsave命令进行RDB持久化,redis的默认配置为:

save 900 1
save 300 10
save 60 10000

2.2 执行流程

从上面的执行流程可以看出其执行步骤为:
(1):redis父进程首先判断当前是否在执行save,bgsave或bgrewriteaof的子进程,如果有则直接返回。因为如果有两个并发的子进程同时执行大量的磁盘写操作,可能会引起严重的性能问题。
(2):redis通过步骤一之后会fork一个子进程,父进程在fork子进程的时候是会阻塞的
(3):redis父进程fork子进程结束后能够响应其它的命令。
(4):redis的子进程会生成rdb文件,rdb文件生成之后会将新的rdb文件替换旧的rdb文件
(5):通知父进程持久化完成

2.3 RDB常用配置

save <seconds> <changes>:bgsave自动触发条件,如果设置为save "",则表示RDB持久化自动触发没有开启
stop-writes-on-bgsave-error yes:当bgsave出现错误时,redis是否停止执行写命令,如果设置为yes,则当硬盘出现问题时可以即使发现,避免数据的大量丢失,如果设置为no,则redis会无视bgsave的错误继续执行写命令。
rdbcompression yes:是否开启RDB文件压缩
rdbchecksum yes:是否开启RDB文件的校验,在写入文件和读取文件的时候都起作用。
dbfilename dump.rdb:RDB文件名
dir ./:RDB文件和AOF文件所在的目录

2.4 RDB持久化的优缺点

优点

  • 适合大规模的数据备份、恢复;
  • 可以定时备份
  • 加载比AOF快

缺点

  • 如果redis宕机的话会丢失一部分数据
  • 如果数据量过大,同步的时候会产生大量IO,严重影响服务器性能

3.AOF持久化

AOF持久化是将redis执行的命令单独放到日志文件中,当redis重启时再次按顺序执行aof文件中的命令,来恢复之前的数据。与RDB相比,AOF持久化的实时性更好,因此aof使用的更加多。另外aof持久化默认在redis中是关闭的,想要将其开启,需要修改配置文件的appendonly yes命令。

3.1 AOF的执行流程

AOF的执行流程可以分为三步,为:

  • 命令追加:将redis的命令写道aof_buf缓冲区;
  • 命令写入和文件同步:根据同步策略将aof_buf中的内容同步到硬盘;其同步策略是由redis配置文件中的appendfsync控制,有三个值:
    • always:这个是指每次有写命令都将其同步到AOF文件。
    • no:这个命令是不主动写入到AOF文件,由操作系统进行写入,通常同步周期30秒。
    • everysec:这个是每秒将aof_buf缓冲区中的写命令写入到AOF文件中,是redis默认的配置
  • 文件重写:定期重写AOF文件,达到压缩的目的;其重写是fork一个子进程将redis中的数据转化为写命令,同步到新的AOF文件,会将完成之后再用新的AOF文件来替换老的文件。在重写的过程中如果有新的数据写入到redis,那么会将命令写到aof_rewrite_buf(重写缓冲区)中,防止在重写的过程中把这部分数据丢失。

3.2 AOF常用配置

appendonly no:是否开启AOF持久化,yes开启,no关闭
appendfilename "appendonly.aof":AOF持久化文件
appendfsync everysec:fsync持久化策略
no-appendfsync-on-rewrite no:AOF重写期间是否禁止fsync,如果开启的话则能够降低文件重写时CPU和硬盘的负载,但是可能会丢失AOF重写期间的数据
auto-aof-rewrite-percentage 100:AOF重写时,当前AOF大小与上一次重写时AOF大小的比值
auto-aof-rewrite-min-size 64mb:AOF重写时,文件的最小大小
aof-load-truncated yes:如果AOF文件结尾损坏,redis启动时是否仍载入AOF文件

3.3 AOF持久化的优缺点

优点

  • 能够更好的保护数据不丢失

缺点

  • 数据恢复的速度比RDB慢
  • AOF持久化文件比RDB持久化文件大

4.AOF-RDB混合持久化

在redis4.0版本之前同时开启AOF持久化和RDB持久化时,redis在重启时会优先加载AOF文件,只有当AOF文件不存在时才会加载RDB文件。而在redis4.0版本之后存在AOF-RDB混合持久化,开启方式通过aof-use-rdb-preamble yes配置文件进行开启,但是必须先开启AOF持久化。AOF-RDB混合持久化的过程是在redis数据本次对RDB快照文件和下次对RDB快照文件之间进行AOF持久化,对数据进行RDB快照之后会将AOF持久化文件进行清空。而在redis重启恢复数据时,是先读取RDB持久化文件,然后再读取AOF持久化文件进行数据恢复。

posted @ 2023-09-04 19:19  _mcj  阅读(50)  评论(1编辑  收藏  举报