评论

收藏

[NoSQL] 一文啃下来redis持久化的方式

数据库 数据库 发布于:2021-07-06 11:42 | 阅读数:218 | 评论:0

  今天的内容是redis持久化方式
Redis的持久化  Redis有两种持久化方式,分别为快照(RDB文件)以及追加式文件(AOF文件) 对于这两种持久化相关的知识点如下

  •   RDB持久化方式会在一个特定的间隔保存那个时间点的一个数据快照。
  •   AOF持久化方式会记录一个服务器收到的写操作,在服务启动时,这些记录的操作会逐条执行从而重建出原来的数据,写操作命令的格式和Redis协议一致,以追加方式进行保存。
  •   Redis持久化可以禁用。
  •   两种方式的持久化同时存在的,当Redis重启时,AOF优先于RDB,即追加式文件会优先于快照式文件。
RDB 快照式文件
工作原理

  •   Redis调用fork()产生一个子进程。
  •   子进程把数据写到一个临时的文件。
  •   当子进程写完新的RDB文件后,会把旧的RDB文件替换掉。

优点

  •   RDB文件是一个简单的文件,其保存了某个时间点的Redis数据,相当适用于备份,可以设定一个时间点,对RDB文件进行归档,这样可以任意恢复不同时间点的文件。
  •   RDB适用于灾备,单文件可以很方便的传输到服务器上。
  •   RDB性能很好,需要持久化的时候,会fork一个子进程用于持久化,然后把持久化的工作交给子进程,自己不会又相关的I/O操作。
  •   相比较AOF,在数据量大的情况下,RDB启动数据会更快。

缺点

  •   RDB会造成数据丢失,每五分钟一次的保存快照,若在这五分钟内因为某些原因不能工作,此时会造成数据的丢失。
  •   RDB使用fork子进程进行数据持久化,在数据量大的情况下,会花费一点时间,如果Redis进行停止服务,那么在CPU性能不好的情况下,会造成服务停止时间超过一秒。

文件路径和名称
  默认文件路径会保存文件为 dump.rdb 文件,在redis目录下。修改路径,修改配置文件redis.conf实现

  •   # RDB文件名,默认为dump.rdb。
  •   dbfilename dump.rdb

  •   # 文件存放的目录,AOF文件同样存放在此目录下。默认为当前工作目录。
  •   dir ./

保存点
  可以修改配置的保存点 格式如下

  •   save 60 1000
  上面的含义是,如果redis每60秒,更改了1000次,那么就更新配置文件。
  禁用格式如下

  •   save ""

关于错误处理
  如果redis,生成快照失败,那么就会接受数据,此时会返回给用户,持久化失败,此时可以进行如下的配置,禁用掉这个功能。

  •   stop-writes-on-bgsave-error yes

关于数据压缩
  默认情况下Redis会采用LZF进行数据压缩,如果需要关闭,配置如下

  •   rdbcompression yes

数据校验
  在RDB的末尾,会有一个CRC64的校验码在文件末尾,这样会保证文件的完整性,在保存的时候会失去性能,如果需要追求更高的性能,此时使用yes禁用掉,此时会把校验码改为e,加载文件的时候,看到e会直接跳过。

  •   rdbcompression yes

手动生成快照
  使用save命令会在当前线程生成RDB快照文件。使用BGSAVE命令会在后台生成快照文件。使用LASTSAVE命令可以查到操作是否成功

  •   127.0.0.1:6379> BGSAVE
  •   Background saving started
  •   127.0.0.1:6379> LASTSAVE
  •   (integer) 1433936394
AOF  快照并不可靠,使用追加的命令,进行添加AOF。

优点

  •   比RDB可靠,可以制定不同的同步方式。
  •   其日志是一个纯粹的追加的文件,遇到突发情况,可以使用redis-check-aof进行修复。
  •   AOF过大的时候,会进行重写操作。
  •   AOF会把命令一条条的导入,如果误操作,可以删除最后一行,然后进行数据恢复

缺点

  •   文件过大
  •   同步导致性能过慢。
  •   数据不一致

启用AOF

  •   appendonly yes

文件路径

  •   # 文件存放目录,与RDB共用。默认为当前工作目录。
  •   dir ./

  •   # 默认文件名为appendonly.aof
  •   appendfilename "appendonly.aof"

可靠性
  默认是每秒进行同步

  •   # appendfsync always
  •   appendfsync everysec
  •   # appendfsync no

日志重写
  当AOF文件过大的时候,例如,当计数器超过1000的时候,会进行自动的新建文件进行重写。工作原理如下

  •   Redis调用fork 产生子进程
  •   子进程把AOF写到一个临时的文件。
  •   主进程持续把新的变动写入到buffer,同时旧的也写入,保证安全。
  •   子进程完成文件重写,主进程会获得一个信号,内存的buffer自动追加到子进程生成的AOF 设置条件如下

  •   # Redis会记住自从上一次重写后AOF文件的大小(如果自Redis启动后还没重写过,则记住启动时使用的AOF文件的大小)。
  •   # 如果当前的文件大小比起记住的那个大小超过指定的百分比,则会触发重写。
  •   # 同时需要设置一个文件大小最小值,只有大于这个值文件才会重写,以防文件很小,但是已经达到百分比的情况。

  •   auto-aof-rewrite-percentage 100
  •   auto-aof-rewrite-min-size 64mb
  禁用命令如下

  •   auto-aof-rewrite-percentage 0

数据修复
  如果AOF文件因为某些原因坏掉,通过如下的方式进行修复

  •   备份AOF文件
  •   使用redis-check-aof命令修复文件

  •   auto-aof-rewrite-percentage 0
  此时文件依旧修复完成。

快照的切换

  •   备份一个最新的dump.rdb的文件
  •   运行下列命令

  •   $ redis-cli config set appendonly yes
  •   $ redis-cli config set save ""
  第一条命令,是启动AOF,即追加。第二条命令是禁用BOF即快照。
关于备份  建议备份如下

  •   创建定时任务,进行定时的备份快照。
  •   定时任务运行的时候,把过旧的文件删除,只保留48个小时内的文件。
  •   备份文件,需要换数据中心,异地保存。
DSC0000.jpeg


  
关注下面的标签,发现更多相似文章