问:Redis如何做持久化
AOF (Append-Only-File) 持久化:保持写状态
- 记录下除了查询以外的所有变更数据库状态的指令
- 以append的形式追加保存到aof文件中
默认redis.conf 是关闭的
always 总是写
everysec 每秒写一次(最常用)
no 将写入操作交给操作系统决定,操作系统一般等到缓冲区满了才写入磁盘
ps:保存配置 重启生效
问:日志重写解决AOF文件大小不断增大的问题?
原理如下:
- 调用fork(),创建一个子进程
- 子进程把新的AOF写到一个临时文件里,不依赖原来的AOF文件
- 主进程持续将新的变动同时写到内存和原来的AOF里
- 主进程获取子进程重写AOF的完成信号,往新AOF同步增量变动
- 使用新的AOF文件替换掉旧的AOF文件
重写也可以手动触发(和bgsave一样)使用bgrewrite 指令
RDB和AOF文件共存情况下的恢复流程:
RDB和AOF的优缺点:
- RDB优点:全量数据快照(二进制文件),文件小,恢复快
- RDB缺点:无法保存最近一次快照之后的增量数据
- AOF优点:可读性高,适合保存增量数据,数据不易丢失(刷盘是由appendfsync控制)
- AOF缺点:文件体积大,恢复时间长(人类可读的文本体积大,重启时指令回放,使用rewirte防止磁盘空间被撑满)
RDB-AOF混合持久化模式(redis 4.0之后支持,默认配置)
- bgsave做镜像全量持久化,AOF做增量持久化(bgsave的时候耗时较长,不够实时,在停机的时候会导致大量丢失数据,所以需要aof来配合使用。在redis实例重启时,优先使用aof来恢复内存的状态,如果没有aof日志,就会使用rdb文件来恢复)
来源:oschina
链接:https://my.oschina.net/u/170156/blog/3048851