[Redis开发和运维]之持久化

243 阅读3分钟

* 介绍

* 提供了AOF和RDB两种持久化机制,持久化功能有效避免了进程退出造成的数据丢失问题,当下次重启时利用之前的持久化文件即可实现数据的恢复。

* RDB

* 是把当前进程数据生成快照保存到磁盘的过程
* 触发机制
    * 手工触发
        * save命令:阻塞当前redis服务器,直到rdb过程完成为止。
        * bgsave命令
            * redis进程执行fork操作创建子进程,rbd持久化过程由子进程负责,完成后自动回复,阻塞只发生在fork阶段。
            * bgsave借助写复制技术,在生成快照的同时,依然正常处理命令。
            * bgsave子进程是由主进程fork的,可以共享主线程的所有内存数据
    * 自动触发
        * m秒内数据集至少n个改动
* 文件处理
    * 保存
        * rdb文件保存在dir配置文件的目录下,文件名通过dbfilename配置,可以通过执行config set dir {newdir}在运行期动态执行。
    * 压缩:默认采用lzf算法对rdb文件做压缩处理
        * 通过config set rdbcompression yes|no配置
* 优缺点
    * 优点
        * 紧凑压缩的二进制文件
        * 仅代表redis在某个时间点上的数据快照
        * 非常适合备份、全量复制场景
            * 比如说每天某个时间点执行bgsave,并把rdb文件拷贝到远程机器或者文件系统,用于灾难恢复
    * 缺点
        * 无法做到秒级/实时的持久化
        * 每次执行bgsave执行fork创建子进程,都属于重量级
        * rdb文件使用了二进制格式保存,redis版本演进过程中有多个格式的rdb版本,存在老版本redis服务器无法兼容新版本格式的问题

* AOF

* 每次写命令都会记录独自的日志,重启时候再重新执行AOF文件中的命令达到恢复数据的目的。
* AOF主要作用是解决了数据持久化的实时性
* 流程
    * 所有的写入命令追到aof_buf缓存区中
    * aof缓存区根据对应的策略向磁盘做同步操作
    * 随着AOF文件越来越大、需要定期对AOF进行文件重写,达到压缩目的
    * 当redis服务器重启时、可以加载AOF文件进行恢复
* 如何使用
    * 开启AOF功能需要配置 appendonly:yes
    * 默认是不开启
    * 工作流程
        * 命令写入
        * 文件同步
            * redis提供了多种AOF缓存区同步文件策略,由参数appendfsync控制:
                * always
                    * 命令写入aof_buf后调用系统fsync操作同步到AOF,fsync完成后线程返回
                * everysec
                    * fsync同步文件操作由专门线程每秒调用一次
                * no
                    * 由操作系统完成,通常同步周期是30s
        * 重写机制
            * 随着命令不断写入AOF,文件会越来越大,为了解决这个问题,redis引入了AOF重写机制压缩文件体积。
            * AOF重写过程可以手动触发和自动触发
                * 手动触发
                    * 直接调用bgrewriteaof命令
                    * 自动触发
                        * 根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定自动触发时机
        * 重启加载
        * 文件校验