Redis4 - 持久化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/njys1/article/details/82795883
  • rdb
  • aof

rdb

    eg. save 900 1 若900s内有一个键发生改变、则进行持久化存储
    1. save 会使用主线程进行同步转储、
       bgsave是创建一个子进程进行存储

    2. save会阻塞服务器
       bgsave、redis主进程会创建一个子进程将转储数据保存到一个temp-%s.rdb 的临时文件中、
       转储完成之后、它会被重命名为 dbfilename 指定的文件名、并覆盖dir指定的本地目录中的
       旧的转储文件、同时redis主进程继续提供服务
       info persistence 可以查看数据持久化状态

       rdb_bgsave_in_process 的值为1 、表示当前正在进行持久化存储
       若转储过程中、并没有数据写入、写时复制占用的内存并不会很大、
       通常会在复制完成后、根据子进程使用的私有数据量输出一条日志、
       eg. 777:C 21 Sept 21:22:04.245 * RDB: 12MB of memory used by copy-on-write
       这个指标还会记录在 rdb_last_cow_size 中

    3. stop-writes-on-bgsave-error 设置为yes的话、作为保护机制、bgsave失败时、Redis服务器会停止接收写入操作

    4. rdbcompression 设置为yes、可以明显减小转储文件的大小、但是会在LZF压缩时、会消耗更多CPU

    5. rdbchecksum 设为yes会在快照文件末尾创建一个CRC64校验和、使用该选项在保存和加载
    快照文件时、会额外消耗约10%的性能、设为no会获得最大性能、但也会降低对数据损坏的抵抗力

    6. redis的rdb文件前几个字符是redis、接下来是rdb格式的版本、然后是rdb文件的魔术字符串
       保存了redis的8种元数据
       redis-ser: redis的版本号
       redis-bits: 运行redis的主机架构、64 / 32
       ctime: rdb文件创建时的时间戳
       repl_stream_db: 复制链中数据库的索引
       used-mem: 转储时使用的内存大小
       aof-preamble:是否在aof文件的开头防止rdb快照(即是否开启混合持久化)
       repl-id: 主实例的id
       repl-offset: 主实例的偏移

aof

    1. aof: redis其实是维护了一个缓冲区、redis的命令会首先被写入到这个缓存区、
       只有缓冲区的内容真正被刷新到磁盘中才能永久保存
       在linux中、是调用fsync来完成的、是阻塞调用、
       可以通过配置调整fsync的频率
       1) always:对每个写入的命令调用fsync
       2) everysec:每秒钟调用一次
       3) no:不主动调用、由操作系统自己来决定何时操作
       redis服务关闭时、fsync会被显式调用、确保缓冲区的数据不丢失

    2. 随aof文件内容的增大、文件大小会逐渐增大、拖慢redis重启时数据的重建过程
       redis提供了aof重写来压缩aof文件、它会删除过期key、合并key的计数操作、只保留key的最新修改、
       重写的过程会在一个子进程进行、子进程创建后、会创建一个 aof_rewrite_buf_blocks 的缓冲区、完成重写后、向父进程发送信号、父进程把 aof_rewrite_buf_blocks 缓冲区的命令写入到新的aof文件、替换原来的文件

    3. redis-check-aof可以在系统崩溃后修复受损的aof文件
       eg. redis-check-aof --fix appendonly.aof

    4. auto-aof-rewrite-min-size 设置文件大小为多大时触发aof重写

    5. 可以使用 bgrewrite 手动触发aof文件重写

猜你喜欢

转载自blog.csdn.net/njys1/article/details/82795883