Redis被 bgrewriteaof阻塞的解决方法

来源:互联网 发布:c语言乘法口诀表 编辑:程序博客网 时间:2024/06/10 05:23

前段时间在现网上面部署了 多个redis节点。

因为这些redis数据不能丢失。

选择的持久化策略是 AOF.

 

大家用aof都有这这样的一个问题 就是aof文件要是不定期进行rewrite的话 , 就会不断的增大。

所以,对这些redis节点 进行了定期的rewrite.

 和 aof相关的主要参数配置如下:

redis 127.0.0.1:6380> config get *append*
1) "appendonly"
2) "yes"
3) "no-appendfsync-on-rewrite"
4) "no"
5) "appendfsync"
6) "everysec"

redis 127.0.0.1:6380> config get *aof*
1) "auto-aof-rewrite-percentage"
2) "100"
3) "auto-aof-rewrite-min-size"
4) "67108864"

 

在这种配置的情况下 bgrewriteaof 时,系统会有大量的错误信息。

 

解决的办法:

1.修改配置文件  redis.conf

中的参数

no-appendfsync-on-rewrite 为 yes

默认值是 no

#yes : 在日志重写时,不进行命令追加操作,而只是将其放在缓冲区里,避免与命令的追加造成DISK IO上的冲突。

#no : 在日志重写时,命令追加操作照常进行

2. 动态参数的修改:

config set no-appendfsync-on-rewrite yes

 

no-appendfsync-on-rewrite 的解释:

在默认情况下 当aof进行重写的时候,aof的同步信息不是关闭的。

在这种情况下 。子进程rewrite在写硬盘 主进程 aof也在写硬盘。在rewrite的过程中 子进程对主进程造成了磁盘阻塞(disk io冲突),导致了报警信息的产生。

 

但是这个参数修改成 yes之后 ,又会有安全上的问题。

当rewrite的过程中 要是redis down掉的话 丢失的数据 就不是之前appendfsync 定下的策略。

而是整个 rewrite 过程中的所有数据。

 

原创粉丝点击