Redis 持久化(RDB与AOF)详解

当服务器发生意外导致服务器宕机的时候,redis保存在内存中的数据将会丢失,此时需要将数据持久化到硬盘中,防止丢失数据。redis持久化有两种基本的方案:RDB与AOF。

一、RDB:数据快照

RDB是一种数据快照的持久化方式,将当前所有数据进行保存。Redis 重启会通过加载dump.rdb文件恢复数据。

1 使用save指令执行存储(手动执行):

        save指令的执行会阻塞当前redis服务,直到RDB过程执行完成,数据量大可能会阻塞很长时间,生产环境不建议使用。

       save命令相关配置(redis.conf中):

dir /usr/local/redis/redis-5.0.8/data #文件存储路径,包括持久化文件、日志文件等
dbfilename dump_6379.rdb  #RDB持久化文件的文件名
rdbcompression yes   #是否开启LZF压缩;需要消耗cpu,但节省了空间;默认开启
rdbchecksum yes  #是否进行RDB文件格式检验(读写都会校验),设为no可以节省10%时间,但是有一定的数据损坏风险;默认开启

 2 使用bgsave(后台保存)指令执行存储(手动执行):

      bgsave指令的执行不会阻塞当前redis服务。会调用fork函数生成子进程来进行RDB存储。可以在日志文件中看到。建议使用

             bgsave相比于save,多出一个配置:

             stop-writes-on-bgsave-error yes #后台存储过程中出现错误,是否停止保存操作;默认yes

3 自动执行保存操作(用的是bgsave的方式):

       此方法用于在满足特定条件的情况下,由redis服务器来发起指令(bgsave),保存数据。

       redis.conf指令:save seconds changes # 在指定时间内(seconds),发生了N次改变(changes ),则自动持久化数据

#一般以前面大,后面小的方式依次配置,需要根据生产环境业务来衡量配置方式
save 900 1           #900秒之内发生1次改变
save 300 10          #300秒之内发生10次改变
save 60 10000        #60秒之内发生10000次改变

4 其它触发保存的方式

   4.1 主从全量复制的时候

   4.2  服务运行过程中重启(redis-cli中):debug reload

   4.3  关闭服务器的时候指定(redis-cli中):shutdown save

5  使用dump.rdb文件恢复redis数据:

                只需要将dump.rdb文件复制到对应的redis安装包下,然后在redis.conf中指定这个文件后启动redis服务。

6  RDB优点:

    6.1 RDB是一个紧凑的二进制文件,存储效率高。

    6.2 RDB存储的是redis在某个时间点的数据快照,非常适合用于数据备份和全量复制等场景

    6.3 RDB恢复数据的速度比AOP快很多

    6.4 服务器可以每隔N小时执行bgsave备份,将备份文件拷贝到其它服务器中,用于灾备。

7  RDB缺点

    7.1 每次读写RDB都是全量数据,占用内存和IO,数据量大的时候效率低。

    7.2 无法做到实时持久化,可能丢失数据。

    7.3 basave指令每次都要执行fork函数创建子进程,会牺牲掉一些性能。

    7.4 Redis的众多版本中未进行RDB文件格式的统一,有可能出现版本服务之间数据格式无法兼容。

二、AOP:过程日志

       AOP是以独立日志的方式记录每次写命令,重启redis时再重新执行AOF文件中的命令来恢复数据。

AOF解决了数据持久化的实时性,目前已经是redis持久化的主流方式。

AOF三种写数据策略:

        always(每次):每次写入操作都同步到AOF文件,数据零丢失,性能较差。不建议使用,除非对性能要求不高

        everysec(每秒):每秒将缓冲区的指令同步到AOF文件。最多丢失一秒内的数据,性能较高。建议使用,默认配置

        no(系统控制):由操作系统控制每次同步到AOF文件的周期,整体过程不可控。

1  配置redis.conf

appendonly yes   #是否开启AOP,默认不开启。yes | no
appendfilename "6379.aof"  #AOF存储文件名
appendfsync  everysec  #每秒存储一次,always | everysec | no
dir /usr/local/redis/redis-5.0.8/data #文件存储路径,包括持久化文件、日志文件等

2  AOF重写

    随着时间的推移,AOF文件会越来越大,使用AOF重写可以“去除很多不必要的或者过时的指令”和”合并一些指令“;可以降低磁盘占有量,提高磁盘利用率,提高持久化效率,降低持久化写的时间,提高IO性能。降低数据恢复用时,提高数据恢复效率。

   AOF重写的两种方式:

         a、手动重写:redis-cli执行指令:bgrewriteaof

         b、自动重写:

auto-aof-rewrite-percentage 100 #自动重写百分比。设为0则关闭重写功能
auto-aof-rewrite-min-size 64mb #达到64mb自动重写。设为0k,则不限制重写最小值

#单位设置:1k => 1000字节、1kb => 1024字节、1m => 1000000字节、1mb => 1024 * 1024字节、1g => 1000000000字节、1gb => 1024 * 1024 * 1024字节
#"info Persistence"指令查看当前大小:aof_current_size、aof_base_size
#触发条件:1、aof_current_size >  auto-aof-rewrite-min-size
#         2、(aof_current_size - aof_base_size) / aof_base_size >= auto-aof-rewrite-percentage

三、RDB对比AOF

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章