Redis持久化

1、redis 持久化

https://redis.io/topics/persi...

2、RDB 方式

RDB:Redis DataBase.
The RDB persistence performs point-in-time snapshots of your dataset at specified intervals.
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里.

  • 备份思路
    Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
  • Fork 说明
    fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程

配置说明:

  • save 时间 频率
    save 900 1
    save 300 10
    save 60 10000
    比如900 秒内有一次写操作就进行一次备份。
    备注:redis 使用shutdown关机时,会进行一次持久化。如果使用,(save "")发生写就会备份
  • stop-writes-on-bgsave-error yes
    当后台RDB进程导出快照(一部分的key-value)到rdb文件这个过程出错时(即最后一次的后台保存失败时),redis主进程是否还接受向数据库写数据该种方式会让用户知道在数据持久化到硬盘时出错了(相当于一种监控);如果安装了很好的redis持久化监控,可设置为"no"
  • rdbcompression yes
    使用LZF压缩字符串,然后写到rdb文件中去如果希望RDB进程节省一点CPU时间,设置为no,但是可能最后的rdb文件会很大
  • rdbchecksum yes
    在redis重启后,从rdb文件向内存写数据之前,是否先检测该rdb文件是否损坏(根据rdb文件中的校验和check_sum).

    clipboard.png

  • 触发条件

    clipboard.png

优缺点:

  • 优点
    适合大规模的数据恢复(和AOF相比,大量数据时更快)
    对数据完整性和一致性要求不高
  • 缺点
    在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改
    fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑

3、AOF

## 3.1 AOF 是什么 ##

AOF:Append Only File

以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作.
## 3.2 AOF 基本命令 ##

  • 数据备份恢复
    appendonly no 改为yes
    (客户端,config get dir 获取数据文件位置)
  • AOF 文件修复
    appendonly.aof 文件可以用vi 编辑,或因为网络丢包、大文件损坏而格式错误,这时可以使用:redis-check-aof --fix进行修复
    ## 3.3 AOF 的Rewrite机制 ##
  • appendonly no
    是否打开aof日志功能(appendonly yes)
  • appendfilename appendonly.aof
    aof文件的存放路径与文件名称
  • appendXXX 重写
    AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制, 把内存中的数据逆化成命令(这时就不是执行顺序的命令了)即fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令(优化的方式)的方式重写了一个新的aof文件, 这点和快照有点类似。

    重写的目的:假设在我们在内存中对同一个key进行了100次操作,最后该key的value是100,
    那么在aof中就会存在100条命令日志,这样的话,有两个缺点:

    1)AOF文件过大,占据硬盘空间
    2)根据AOF文件恢复数据极慢(需要执行100条命令)

    如果我们将内存中的该key逆化成"set key 100",然后写入aof文件,那么aof文件的大小会大幅度减少,而且根据aof文件恢复数据很快(只需要执行1条命令)
    原理:
    AOF文件持续增长而过大时,会fork出一条新进程来将文件重写,遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似
    可选参数
    appendfsync always
    每一个命令,都立即同步到aof文件中去(很安全,但是速度慢,因为每一个命令都会进行一次磁盘操作)
    appendfsync everysec
    每秒将数据写一次到aof文件,

  • appendfsync no
    将写入工作交给操作系统,由操作系统来判断缓冲区大小,统一写到aof文件(速度快,但是同步频率低,容易丢数据)
  • auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb #AOF重写仅发生在当aof文件大于64m时
    注意:两个约束都要满足的条件下,才会发生aof重写; 假设没有第二个,那么在aof的前期,只要稍微添加一些数据,就发生aof重写当aof的增长的百分比是原来的100%(即是原来大小的2倍,例如原来是100m,下一次重写是当aof文件是200m的时候),AOF重写。
    对于一个高并发的场景,这里的size一般是3个G左右。

clipboard.png

clipboard.png

- 优缺点
优点:
数据丢失少,如:
每修改同步:appendfsync always 同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
每秒同步:appendfsync everysec 异步操作,每秒记录 如果一秒内宕机,有数据丢失
缺点:
aof 是大文件,而且io操作慢
相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb
aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同

4、RDB 和AOF

对比不再赘述,当两个都配置的时候,会使用AOF.
官网建议,同时开启两种方式


dhxx
37 声望19 粉丝

中间件相关