Redis持久化配置与操作

持久化

写在前面

linux系统中:

  1. 父子进程数据是隔离的
  2. 父进程可以让子进程看到父进程的数据,采用export修饰
  3. export的环境变量,父子进程的修改互补影响,影响范围仅为自身进程

redis如何在非阻塞的情况下对某一时刻数据进行持久化

  1. redis父进程使用fork()系统调用,创建一个子进程,其为redis中创建那一刻中虚拟地址的拷贝,其虚拟地址同样指向相同的内存地址,则有两个虚拟地址引用了该物理地址
  2. fork()实现了copy on write内存机制,在父进程修改数据时,首先会在内存中写入修改的值,并将指针从原来的地址指向新的地址,所以子进程的数据不会改变,还是那一刻的数据,从而达到非阻塞保存时点快照

fork()特点:速度快,占用空间小

RDB

  • 主动(同步阻塞):比如关机维护时使用

  • 被动(异步非阻塞):fork()系统调用,可在配置文件中配置触发规则

    #在多少秒后至少有多少个key发生变化触发写入磁盘操作(可配置多条)
    save <seconds> <changes> #默认开启,可增加 save "" 表示禁用
    
    • 如果想要修改写入磁盘文件名称,找到dbfilename dump.rdbdump.rdb改为需要的文件名
    • 如果想要修改写入磁盘文件位置,找到The working directory注释,重写其dir路径即可

    只要触发了RDB操作,等待该操作完成后,下一次的RDB触发才可执行

弊端

  1. 不支持拉链,永远只有一个dump.rdb文件,需要人为干预进行备份
  2. 时点与时点之间窗口数据容易丢失,如:8点得到一个RDB数据文件,9点刚要触发RDB,宕机了,那么8点到9点的数据就丢失了

优点:类似java中的序列化,恢复的速度相对较快(rdb文件为二进制文件,可以对数据进行快速恢复)

适当的配置redis最大存储空间maxmemory可以提升RDB的效率,最大空间过大会导致RBD时间过长

AOF

RDB与AOF可以同时开启,如果开启了AOF只会使用AOF进行数据恢复

优点:数据丢失少

弊端:操作日志文件的体量会越来越大,从而导致恢复慢

针对弊端redis根据让日志只记录增量且合并重复命令的原理对AOF进行了优化:

  • 4.0前:重写日志文件,删除抵消的命令合并重复的命令,得到一个缩小版的纯指令的日志文件

  • 4.0后:重写日志文件,将某一刻老的数据RDB到AOF文件中,将增量的指令以追加的方式追加到AOF文件中

    AOF是一个混合体,既利用了RDB的快速恢复也利用了日志的全量特点

相关配置
  1. AOF默认关闭:appendonly no -> yes开启AOF
  2. 默认AOF文件名:appendfilename "appendonly.aof" 可自定义
  3. redis往aof文件中刷写的策略
    1. appendfsync always:每来一条指令调用一次内核将数据直接刷写到磁盘,最多丢失一条数据(一条指令正在写宕机了);数据最可靠
    2. appendfsync everysec:每秒触发一次I/O对buffer进行flushaof文件中,可能会导致接近一个buffer缓存内容的丢失;数据较为可靠
    3. appendfsync no:每当内核buffer缓冲区内容填满时触发一次I/O,对缓冲区的数据flush写入磁盘aof文件;最多丢失一块buffer缓冲区内容数据,换来I/O成本最少
  4. no-appendfsync-on-rewriteyes/no(默认)当redis抛出一个子进程进行AOF重写或者RDB重写,允不允许序号3的策略进行aof文件的写入,yes可能会导致一部分性能阻塞,no可能导致一些数据的丢失
  5. aof-use-rdb-preamble yes:开启重写日志文件,见上4.0后;如果aof文件以REDIS开头的则是重写过的混合体文件(默认开启)
  6. 自动触发BGREWRITEAOF(重写)规则
    1. auto-aof-rewrite-percentage [百分比(省略%)]:记录6.2.命令达到的百分比触发重写
    2. auto-aof-rewrite-min-size [文件大小(mb)]:首次aof文件达到该大小且满足6.1.自动触发重写,并且redis会记录重写后此时文件大小lastSize,当文件超过lastSize的设置百分比6.1.时再次出发重写,依次类推自动重写操作(此变量仅初始化启动redis有效,如果是redis恢复时,则lastSize等于初始aof文件大小)

实操

关闭混合模式

  • vi /etc/redis/6379.conf

    #关闭redis后台运行
    daemonize no 
    #logfile "" 默认控制台打印,并无日志输出,需要日志输出指定输出路径即可(注释也是前台控制台打印)
    #配置RDB save策略
    save 3600 1
    save 300 100
    save 60 10000
    #开启AOF
    appendonly yes
    #关闭混合模式
    aof-use-rdb-preamble no
    

    异常备注

    #在redis进程kill又自动启动的情况下,关闭进程,无密码省略 -a [password]
    redis-cli -a [password] shutdow
    
  • redis-server /etc/redis/6379.conf

    使用指定的配置文件启动redis,会在配置的文件目录下生成持久化的文件

  • set k1 helloaof文件中生成如下内容:

    #根据该文件,可对命令进行解析执行
    *2							#*代表下面指令由几个元素组成
    $6							#描述下一行元素由几个字节组成
    SELECT					#元素1
    $1
    0								#元素2
    *3
    $3
    set
    $2
    k1
    $5
    hello
    
  • bgsave:触发fork(),在持久化目录中会将当前数据序序列化到磁盘rdb文件,其文本开头位REDIS

    REDIS0009ú      redis-ver^E6.2.1ú
    redis-bitsÀ@ú^EctimeÂ<91>Ü/cú^Hused-mem -^Q^@ú^Laof-preambleÀ^@þ^@û^B^@^@^Bk1^Ehello^@^Bk2^Dooxxÿ8^[<97>XË^H@O
    
  • redis-check-rdb dump.rdb:检查rdb文件是否正常

    armin@xiaobawangxuexiji-2 db % redis-check-rdb dump.rdb
    [offset 0] Checking RDB file dump.rdb
    [offset 26] AUX FIELD redis-ver = '6.2.1'
    [offset 40] AUX FIELD redis-bits = '64'
    [offset 52] AUX FIELD ctime = '1664081041'
    [offset 67] AUX FIELD used-mem = '1125792'
    [offset 83] AUX FIELD aof-preamble = '0'
    [offset 85] Selecting DB ID 0
    [offset 116] Checksum OK
    [offset 116] \o/ RDB looks OK! \o/
    [info] 2 keys read
    [info] 0 expires
    [info] 0 already expired
    
  • BGREWRITEAOF:后台重写aof文件,去除无效重复指令*(如果在一个key值中多次重写key值,aof文件中仅会存储最后一条指令)*

开启混合模式

  • vi /etc/redis/6379.conf

    aof-use-rdb-preamble yes
    
  • redis-server /etc/redis/6379.conf:持久化目录下出现一个空的aof文件

  • set k1 a; set k1 b; set k1 c; set k1 d:目前aof文件内容:

    *2
    $6
    SELECT
    $1
    0
    *3
    $3
    set
    $2
    k1
    $1
    a
    *3
    $3
    set
    $2
    k1
    $1
    b
    
  • BGREWRITEAOF:手动执行重写后,打开aof文件*(变为序列化内容)*

    REDIS0009ú      redis-ver^E6.2.1ú
    redis-bitsÀ@ú^EctimeÂXæ/cú^Hused-memÂP-^Q^@ú^Laof-preambleÀ^Aþ^@û^A^@^@^Bk1^Adÿ^Yuâ¶<86>ç«>
    
  • set k1 e; set k1 f:继续对key重新赋值,再查看aof文件*(后面的内容以追加指令的形式追加到aof文件中,此时的文件为混合文件)*

    REDIS0009ú      redis-ver^E6.2.1ú
    redis-bitsÀ@ú^EctimeÂXæ/cú^Hused-memÂP-^Q^@ú^Laof-preambleÀ^Aþ^@û^A^@^@^Bk1^Adÿ^Yuâ¶<86>ç«>*2^M
    $6^M
    SELECT^M
    $1^M
    0^M
    *3^M
    $3^M
    set^M
    $2^M
    k1^M
    $1^M
    e^M
    *3^M
    $3^M
    set^M
    $2^M
    k1^M
    $1^M
    f^M
    
  • bgsave:将以上时点数据持久化到rdb文件

  • BGREWRITEAOF:重写aof文件,目前内容与bgsave得到的rdb文件解析内容一致,均为以上时点序列化的数据

注意:无论在是否混合模式下的aof持久化,在最后有执行flushall或相关清库指令,如果想要恢复清库前的数据,不可执行BGREWRITEAOF重写操作,否则数据无法找回*(重写后的aof文件仅有清库指令)*;此种情况恢复数据需要将aof文件中最后一条清库指令移除再进行数据导入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值