Redis之持久化

1.  RDB持久化

    1.  什么是RDB持久化?

        把当前redis进程数据生成快照并保存到磁盘的过程。

    2.  有什么用?

        可以利用RDB文件恢复redis数据,防止数据丢失

    3.  如何设置?

        1.  手动触发

            save  会阻塞redis服务器,直到RDB过程完成

            bgsave  会有一个fork操作,会产生一个子进程,RDB持久化过程由子进程负责,完成后子进程自动结束。

        2.  自动触发

            执行shutdown命令,如果没有开启AOF持久化会触发bgsave

            执行debug reload命令重新加载Reids时,也会自动触发save操作

            使用save相关配置,会触发bgsave

            从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件发送给从节点

    4.  RDB如何工作的?

        

1) 执行bgsave命令, Redis父进程判断当前是否存在正在执行的子进
程, 如RDB/AOF子进程, 如果存在bgsave命令直接返回。
2) 父进程执行fork操作创建子进程, fork操作过程中父进程会阻塞, 通
过info stats命令查看latest_fork_usec选项, 可以获取最近一个fork操作的耗
时, 单位为微秒。
3) 父进程fork完成后, bgsave命令返回“Background saving started”信息
并不再阻塞父进程, 可以继续响应其他命令。
4) 子进程创建RDB文件, 根据父进程内存生成临时快照文件, 完成后
对原有文件进行原子替换。 执行lastsave命令可以获取最后一次生成RDB的
时间, 对应info统计的rdb_last_save_time选项。
5) 进程发送信号给父进程表示完成, 父进程更新统计信息, 具体见
info Persistence下的rdb_*相关选项。

    5.  如何处理RDB文件?

        1.  存放到哪里?

            使用命令查看config get dir

            设置新的目录config set dir <newFileName>

        2.  什么类型文件?

            默认采用LZF算法对生成的RDB文件做压缩处理,压缩后远远小于内存大小

        3.  RDB能用吗?

            使用工具可以检测RDB文件并获取对应的错误报告

            redis-check-dump dump.rdb

    6.  RDB持久化的优缺点

        1.  优点

            RDB文件小

            Redis加载RDB文件速度快

        2.  缺点

            不是实时持久化的,只是某个时间点的快照

            RDB文件存在版本兼容的问题

    7.  在线修改save参数

        config set save "900 1 300 10 60 10000"  设置save参数

        config set save ""  清空save参数

        config get save  获取save参数

2.  AOF持久化

    1.  什么是AOF持久化?

        以独立日志的方式记录写命令,重启时再执行AOF文件中的命令达到恢复数据的目的。

    2.  AOF有什么用?

        解决redis数据持久化的实时性

    3.  如何配置AOF?

        开启AOF,appendonly yes,默认不开启

        appendfilename  指定文件名

    4.  AOF如何工作?

        

    5.  命令写入

        1.  写入的内容是什么?

            写入的内容是文本协议格式

        2.  为什么用文本协议格式?

            兼容性强

            可读性强

            开启AOF后,所有写入命令都有追加操作,避免二次处理开销

        3.  AOF为什么不直接写入到硬盘中,而是写入到AOF缓冲区?

            如果直接写入到硬盘中,对硬盘性能要求会很高。

            Redis提供很多缓冲区同步硬盘的策略,在性能和安全方面做出平衡。        

    6.  缓冲区如何同步到硬盘?

         

        配置为always时,每次写入都要同步AOF文件,不建议配置。

        配置为no时,由于操作系统每次同步AOF文件的周期不可控。

        配置为everysec,默认配置,可以做到兼顾性能和数据安全性。理论只有在系统突然宕机的情况下丢失1秒的数据。

    7.  AOF文件越来越大,如何优化?

        1.  Redis采用AOF重写机制压缩文件体积。

        2.  AOF文件重写就是把Redis进程内的数据转化为写命令同步到新AOF文件的过程。

        3.  为什么重写后的AOF能变小?

            1.  进程内已经超时的数据不再写入文件

            2.  旧的AOF文件含有无效命令,重写使用进程内数据直接生成,这样新的AOF文件只保留最终数据的写入命令。

            3.  多条写命令可以合并为一个。

    8.  AOF重写的作用是什么?

        1.  降低AOF文件大小

        2.  可以更快的被Redis加载

    9.  AOF重写过程

        1.  手动触发

            直接调用bgrewriteaof命令

        2.  自动触发

            根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定自动触发时机

            auto-aof-rewrite-min-size:  表示运行AOF重写时文件最小体积,默认为64MB

            auto-aof-rewrite-percentage:  代表当前AOF文件空间和上一次重写后AOF文件空的比值

            自动触发时机=aof_current_size>auto-aof-rewrite-minsize&&aof_current_size-aof_base_size/aof_base_size>=auto-aof-rewritepercentage

        3.  AOF重写运作流程

            

 

    10.  重启加载

        

    11.  文件校验

        对于错误格式的AOF文件, 先进行备份, 然后采用redis-check-aof--fix
                             令进行修复, 修复后使用diff-u对比数据的差异, 找出丢失的数据, 有些可
                             以人工修改补全。

 

3.  问题定位与优化

    1.  耗时大的操作

        1.  fork操作

            1.  如何查看fork操作的耗时

                info stats里面的latest_fork_usec 

            2.  优化fork操作的耗时

                1.  优先使用物理机或者高效支持fork操作的虚拟化技术

                2.  控制redis实例最大可用内存,线上建议每个redis实例内存控制在10GB以内

                3.  合理配置Linux内存分配策略

                4.  降低fork操作的频率

        2.  子进程开销与优化          

            1.  CPU

                1.  不要做绑定单核CPU操作

                2.  不要和其它CPU密集型服务部署在一起

                3.  部署多个redis实例,尽量保证同一时刻只有一个子进程执行重写工作

            2.  内存

                1.  部署多个实例,尽量保证同一时刻只有一个子进程在工作

                2.  避免大量写入时进行重写工作

            3.  硬盘

                1.  不要和其它高硬盘负载的服务部署在一起

                2.  AOF重写时会消耗大量硬盘IO,可以开启配置no-appendfsync-on-rewrite,默认关闭。表示在AOF重写期间不做fsync操作

                3.  换固态硬盘

        3.  AOF追加阻塞

            1.  使用everysec做刷盘策略的流程

                

 

            2.  AOF阻塞问题定位

                1.  redis输出日志,如下:

                    Asynchronous AOF fsync is taking too long

                2.  在info Persistence统计中,aof_delayed_fsync指标会累加。

                3.  AOF同步最多允许2秒的延迟                             

posted @ 2022-02-22 14:44  奋斗史  阅读(77)  评论(0)    收藏  举报