首页
点滴
Redis持久化操作之AOP
以日志的形式来记录每个写操作(增量保存),将Redis执行过的所有写指令记录下来(读操作不记录), 只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作 #### AOF持久化流程 1、客户端的请求写命令会被append追加到AOF缓冲区内; 2、AOF缓冲区根据AOF持久化策略[always,everysec,no]将操作sync同步到磁盘的AOF文件中; 3、AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量; 4、Redis服务重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的; #### 优势 1、备份机制更稳健,丢失数据概率更低。 2、可读的日志文本,通过操作AOF稳健,可以处理误操作。 #### 劣势 1、比起RDB占用更多的磁盘空间。 2、恢复备份速度要慢。 3、每次读写都同步的话,有一定的性能压力。 4、存在个别Bug,造成恢复不能。 #### AOF相关配置信息 1、`appendonly` 开启AOF持久化,默认为no不开启,建议设为yes开启 2、`appendfilename` AOF持久化生成的默认文件名,存放路径与RDB配置dir共用 ![](/images/20211112042008261.png) 3、`appendfsync` AOF同步频率设置 appendfsync always 表示始终同步,每次写入都会立刻记入日志;性能较差但数据完整性比较好 appendfsync everysec 表示每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失。 appendfsync no 表示redis不主动进行同步,把同步时机交给操作系统。 ![](/images/20211112043038393.png) 4、`no-appendfsync-on-rewrite` 设为yes时,不写入aof文件只写入缓存,用户请求不会阻塞,但是在这段时间如果宕机会丢失这段时间的缓存数据。(降低数据安全性,提高性能) 设为no时,会把数据往磁盘里刷,但是遇到重写操作,可能会发生阻塞。(数据安全,但是性能降低) `auto-aof-rewrite-percentage` 设置重写的基准值,文件达到100%时开始重写(文件是原来重写后文件的2倍时触发) `auto-aof-rewrite-min-size` 设置重写的基准值,最小文件64MB。达到这个值开始重写。 例如:文件达到70MB开始重写,降到50MB,下次什么时候开始重写?100MB 系统载入时或者上次重写完毕时,Redis会记录此时AOF大小,设为base_size, 如果Redis的AOF当前大小>= base_size +base_size*100% (默认)且当前大小>=64mb(默认)的情况下,Redis会对AOF进行重写。 ![](/images/20211112050252566.png) #### 重写流程 1、bgrewriteaof触发重写,判断是否当前有bgsave或bgrewriteaof在运行,如果有,则等待该命令结束后再继续执行。 2、主进程fork出子进程执行重写操作,保证主进程不会阻塞。 3、子进程遍历redis内存中数据到临时文件,客户端的写请求同时写入aof_buf缓冲区和aof_rewrite_buf重写缓冲区保证原AOF文件完整以及新AOF文件生成期间的新的数据修改动作不会丢失。 4、1)、子进程写完新的AOF文件后,向主进程发信号,父进程更新统计信息。2)、主进程把aof_rewrite_buf中的数据写入到新的AOF文件。 5、使用新的AOF文件覆盖旧的AOF文件,完成AOF重写。 ![](/images/20211112054532270.png)
博客分类
源码解析 (1)
多线程 (5)
Java (10)
Linux (8)
Docker (9)
SpringBoot (14)
微服务 (1)
Redis (15)
MySQL (7)
VMware (3)
Nginx (15)
MyBatis (2)
RabbitMQ (1)
Git (7)
工具类 (12)
前端 (3)
友情链接
layui
© 2020-2025 www.chenhuazhan.com All Rights Reserved 备案号:
桂ICP备17004487号-1
粤公网安备44030002005146