1. redis做了aof持久化后,aof文件突然增大,导致磁盘无法写入数据

        由于磁盘写满,无法进行aof重写,减少aof文件体积;

         需要对磁盘进行扩容,进行手动aof重写

# redis-cli -p 6379 -h 127.0.0.1
127.0.0.1:6379> BGREWRITEAOF
redis 127.0.0.1:6379> Background append only file rewriting started

aof手动重写后,aof文件大小变小,占用空间也变小

异常原因:

  • redis进行aof重写时,报错fork进程堵塞,导致无法分配内存进行重写,导致aof文件一直增长

        #Starting automatic rewriting of AOF on 100% growth
        # Can't rewrite append only file in background: fork: Cannot allocate memory

  • 由于他人误操作,重启了redis服务器,导致aof_rewrite_base_size值变大58G(aof最后一次重写之后,aof文件大小)
  • aof_rewrite_base_size值太大,未达到重写的规则,磁盘就已经写满。如下报错

        # AOF write error looks solved, Redis can write again.

  • 发现异常后,进行手动重写,就无法成功了,报错提示磁盘已满,无法重写,需要扩容进行重写

        12827:C 22 Feb 18:41:00.963 # Write error writing append only file on disk: No space left on device
         12650:M 22 Feb 18:41:01.078 # Background AOF rewrite terminated with error

总结:磁盘最好做个限额配置

           redis做了aof持久化时,异常时可以检查一下aof文件大小是否正常;aof的重写是否正常;


 

 

一、背景

1. AOF

    Redis的AOF机制有点类似于Mysql binlog,是Redis的提供的一种持久化方式(另一种是RDB),它会将所有的写命令按照一定频率(no, always, every seconds)写入到日志文件中,当Redis停机重启后恢复数据库。

在这里插入图片描述

2. AOF重写

Redis Bgrewriteaof 命令用于异步执行一个 AOF(AppendOnly File) 文件重写操作。重写会创建一个当前 AOF 文件的体积优化版本。

(1) 随着AOF文件越来越大,里面会有大部分是重复命令或者可以合并的命令(100次incr = set key 100)

(2) 重写的好处:减少AOF日志尺寸,减少内存占用,加快数据库恢复时间。
在这里插入图片描述

  • A:用命令手动重写
# redis-cli -p 6379 -h 127.0.0.1
127.0.0.1:6379> BGREWRITEAOF
redis 127.0.0.1:6379> Background append only file rewriting started

重写后,aof文件变小,则成功;如若不成功,可以看日志报错,即使 Bgrewriteaof 执行失败,也不会有任何数据丢失,因为旧的 AOF 文件在 Bgrewriteaof 成功之前不会被修改。

注意:从 Redis 2.4 开始, AOF 重写由 Redis 自行触发, BGREWRITEAOF 仅仅用于手动触发重写操作。

 

  • B:修改redis配置文件redis.conf,进行自动重写

auto-aof-rewrite-percentage 100 增长百分比为100时开启重写(默认是100)

auto-aof-rewrite-min-size 64mb 当前aof文件大小大于这个值开启重写(默认是1M)

 

         服务器在AOF功能开启的情况下,会维持以下三个变量:

  •              记录当前AOF文件大小的变量  aof_current_size 
  •              记录最后一次AOF重写之后,AOF文件大小的变量  aof_rewrite_base_size
  •              增长百分比变量    aof_rewrite_perc

        每次当serverCron(服务器周期性操作函数)函数执行时,它会检查以下条件是否全部满足,如果全部满足的话,就触发自动的AOF重写操作:

  •                  没有BGSAVE命令(RDB持久化)/AOF持久化在执行;
  •                  没有BGREWRITEAOF在进行;
  •                  当前AOF文件大小要大于server.aof_rewrite_min_size                                                    (默认为1MB)(或者在redis.conf配置了auto-aof-rewrite-min-size大小)

        当前AOF文件大小和最后一次重写后的大小之间的比率等于或者等于指定的增长百分比         (在配置文件设置了auto-aof-rewrite-percentage参数,不设置默认为100%)

        如果前面三个条件都满足,并且当前AOF文件大小比最后一次AOF重写时的大小要大于指定的百分比,那么触发自动AOF重写。

 

报错显示,由于fork进程堵塞,无法分配内存进行aof重写,导致aof文件一直再增加

由于错误的处理,将服务器重启,并未发现此异常,导致aof最后一次重写的值

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐