Redis持久化-aof

1.RDB现存问题

  耗时耗性能

    O(n)数据:耗时

    fork():消耗内存,copy-on-write策略

    Disk I/O: I/O性能

  不可控丢失数据

时间 save
T1

执行多个写命令

T2 满足RDB自动创建的条件
T3 再次执行多个写命令
T4 宕机

 

 

 

 

 

 

 

T3和T4之间的数据丢失

 

2.AOF原理

  Redis将所有写入命令及其参数记录到AOF文件,当服务器宕机过后启用,重新执行AOF文件中的命令

  Redis将写命令记录到AOF的过程

    Redis-server ————Redis命令及参数——————》AOF程序————将命令转换为网络通讯协议的格式追加到AOF缓存——————》AOF缓存—————将命令写入AOF文件的末尾—————》AOF————满足设定的AOF保存条件————》调用fsync或fdatasync函数将文件真正保存到磁盘

 

3.文件的写入和保存

  WIRTE:根据条件,将aof_buf中的缓存写入到AOF文件末尾

  SAVE:根据条件,调用fsync或fdatasync函数将AOF文件保存到磁盘中

 

4.AOF保存策略

  AOF_FSYNC_NO 跟随系统

    该策略下,Redis被关闭、AOF功能被关闭、系统的写缓存被刷新三种情况执行SAVE

  AOF_FSYNC_EVERYSEC 每一秒保存一次

    该策略下,原则上每隔一秒钟就会执行一次,但实际情况中并非如此

    执行SAVE的四种情况

    子线程正在执行

      这个SAVE执行时间未超过2秒,程序执行WRITE,程序直接返回,不执行WRITE或新的SAVE,发生故障,用户损失小于2秒内的数据

      SAVE执行超过2秒,程序执行WRITE,不执行新SAVE,WRITE必须等待执行旧SAVE执行完才能执行,这里有阻塞,发生故障,会损失超过2秒的数据

      上次成功执行SAVE距现在不超过1秒,程序执行WRITE,但不执行SAVE

      上次成功执行SAVE距离现在超过1秒,程序执行WRITE和SAVE

      

  AOF_FSYNC_ALWAS 每执行一个命令保存一次

   这种策略下,没执行一条命令都有主进程执行WRITE和SAVE操作,SAVE执行期间,主进程会被阻塞,不能处理请求。

 

5.三种保存策略的对比

模式 WITE是否阻塞? SAVE是否阻塞? 停机时丢失的数据
AOF_FSYNC_NO  操作系统最后一次对AOF文件触发SAVE操作之后的数据
AOF_FSYNC_EVERYSEC  一般情况下不超过2秒的数据
AOF_FSYNC_ALWAS  最多只丢失一条命令

 

posted @ 2020-08-23 20:26  coder_xds  阅读(132)  评论(0编辑  收藏  举报