redis 持久化方式

redis持久化方式分为:RDB和AOF

RDB持久化是指用数据集快照的方式记录redis数据库的所有键值对。

1.RDB持久化(以快照的方式) 策略(默认):

  save 900 1       (15分钟变更一次)
  save 300 10     (5分钟变更10次)
  save 60 10000  (1分钟变更1万次)
2.RDB默认配置文件名称:

  dbfilename dump.rdb

  两个命令:SAVE命令会阻塞主进程来完成写文件,BGSAVE命令会创建子进程来完成写文件,主进程会继续处理命令。

  优点:

  1.只有一个文件dump.rdb,方便持久化。

  2.容灾性好,一个文件可以保存到安全的磁盘。

  3.性能最大化,fork子进程来完成写操作,让主进程继续处理命令,所以是IO最大化。

  4.相对于数据集大时,比AOF的启动效率更高。

  缺点:

  1.数据安全性低,通过配置save参数来达到定时的写快照,比如 每900 秒有1个键被修改就进行一次快照,每600秒至少有10个键被修改进行快照,每30秒有至少10000个键被修改进行记录。所以如果当服务器还在等待写快照时出现了宕机,那么将会丢失数据。

  2.fork子进程时可能导致服务器停机1秒,数据集太大。

AOF持久化是指所有的命令行记录以redis命令请求协议的格式保存为aof文件。

  优点:

  1.数据安全,aof持久化可以配置appendfsync属性,有always,每进行一次命令操作就记录到aof文件中一次;everySec,就是每秒内进行一次文件的写操作;no就是不进行aof文件的写操作。

  2.通过append模式写文件,即使中途服务器宕机,可以通过redis-check-aof工具解决数据一致性问题。

  3.AOF机制的rewrite模式,用来将过大的aof文件缩小,实现原理是将所有的set 通过一句set 命令总结,所有的SADD命令用总结为一句,这样每种命令都概括为一句来执行,就可以减少aof文件的大小了。(注意,在重写的过程中,是创建子进程来完成重写操作,主进程每个命令都会在AOF缓冲区和AOF重写缓冲区进行保存,这样旧版aof文件可以实现数据最新,当更新完后将重写缓冲区中的数据写入新的aof文件中然后就可以将新的文件替换掉旧版的文件。

  缺点:

  1.文件会比RDB形式的文件大。

  2.数据集大的时候,比rdb启动效率低。

1.表示是否开启AOF持久化:

  appendonly yes(默认no,关闭) 

2.AOF持久化配置文件的名称:

  appendfilename "appendonly.aof"

3.AOF持久化策略(默认每秒):

  appendfsync always (同步持久化,每次发生数据变更会被立即记录到磁盘,性能差但数据完整性比较好)

  appendfsync everysec (异步操作,每秒记录,如果一秒钟内宕机,有数据丢失)

  appendfsync no  (不同步)

4.AOF配置文件损坏修复方法:

  进入redis安装路径 执行 redis-check-aof --fix AOF配置文件名称

5.AOF的Rewrite(重写) :

  定义:AOF采用文件追加的方式持久化数据,所以文件会越来越大,为了避免这种情况发生,增加了重写机制

          当AOF文件的大小超过了配置所设置的阙值时,Redis就会启动AOF文件压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof

  原理:当AOF增长过大时,会fork出一条新的进程将文件重写(也是先写临时文件最后rename),遍历新进程的内存数据,每条记录有一条set语句。

       重写AOF文件并没有操作旧的AOF文件,而是将整个内存中的数据内容用命令的方式重写了一个新的aof文件(有点类似快照)

触发机制:Redis会记录上次重写时的AOF文件大小,默认配置时当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发

     auto-aof-rewrite-percentage 100  (一倍)
       auto-aof-rewrite-min-size 64mb(可以改大一点如1G)

Tip:

  一.RDB与AOF同时开启  默认先加载AOF的配置文件

  二.相同数据集,AOF文件要远大于RDB文件,恢复速度慢于RDB

  三.AOF运行效率慢于RDB,但是同步策略效率好,不同步效率和RDB相同

RDB与AOF的选择:

  做备份:当数据量大,且对恢复速度有要求,并且数据的一致性要求不高的话,可以只使用RDB

  只做缓存:不用开启任何的持久化方式

  两者都开启的建议:RDB数据不实时,同时使用两者时服务器只会找AOF文件,可不可以只使用AOF?作者建议不要,因为RDB更适合备份数据库(AOF在不断变化,不好备份)快速重启。

  如果是集群:Master上RDB和AOF都不做,来保证Master的读写性能,而Slave上则同时开启RDB和AOF来进行持久化,保证数据的安全性。RDB间隔时间可以调整大一点如save 900 1       (15分钟变更一次)

 

posted @ 2016-12-05 13:10  梦の华丽  阅读(184)  评论(0编辑  收藏  举报