最近新安装了一台redis,版本为redis-3.2.5redis
数据盘用的是固态硬盘。sql
以前用的是普通硬盘,redis日志每天报bash
Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.服务器
换了固态硬盘,就没报了。app
用了3天,发现aof文件愈来愈大。ide
-rw-r--r-- 1 root root 136672283898 Dec 9 08:50 appendonly_6379.aof优化
-rw-r--r-- 1 root root 5200941168 Dec 7 18:09 temp-rewriteaof-26452.aofthis
自己redis用了19G内存,可是aof文件达到了128Gspa
天天早上起床都要把磁盘扩容一次才行,否则磁盘就满了,烦死了。日志
但是这样下去,不能解决问题,毕竟是云服务器,天天加钱扩容也很差。
后来在网上,发现有一个命令BGREWRITEAOF,能够优化aof文件
步骤以下:
先进入redis
redis-cli -p 6379 -h 127.0.0.1
127.0.0.1:6379>BGREWRITEAOF
再去查看aof文件的目录,发现多了一个文件
-rw-r--r-- 1 root root 136672283898 Dec 9 08:51 appendonly_6379.aof
-rw-r--r-- 1 root root 5851018456 Dec 9 08:51 temp-rewriteaof-1927.aof
-rw-r--r-- 1 root root 5200941168 Dec 7 18:09 temp-rewriteaof-26452.aof
等待几分钟
再次查看aof文件
-rw-r--r-- 1 root root 22477825463 Dec 9 09:11 appendonly_6380.aof
-rw-r--r-- 1 root root 5200941168 Dec 7 18:09 temp-rewriteaof-26452.aof
已经明显减小了
再把temp-rewriteaof-26452.aof文件删除,它已经没有用了
我忽然发现一个问题
执行了BGREWRITEAOF以后,temp-rewriteaof之类的文件,就再也没有产生了,好神奇。
引用相关解释:
BGREWRITEAOF
执行一个 AOF文件 重写操做。重写会建立一个当前 AOF 文件的体积优化版本。
即便 BGREWRITEAOF 执行失败,也不会有任何数据丢失,由于旧的 AOF 文件在 BGREWRITEAOF 成功以前不会被修改。
重写操做只会在没有其余持久化工做在后台执行时被触发,也就是说:
若是 Redis 的子进程正在执行快照的保存工做,那么 AOF 重写的操做会被预约(scheduled),等到保存工做完成以后再执行 AOF 重写。在这种状况下, BGREWRITEAOF 的返回值仍然是 OK ,但还会加上一条额外的信息,说明 BGREWRITEAOF 要等到保存操做完成以后才能执行。在 Redis 2.6 或以上的版本,可使用 INFO 命令查看 BGREWRITEAOF 是否被预约。
若是已经有别的 AOF 文件重写在执行,那么 BGREWRITEAOF 返回一个错误,而且这个新的 BGREWRITEAOF 请求也不会被预约到下次执行。
从 Redis 2.4 开始, AOF 重写由 Redis 自行触发, BGREWRITEAOF 仅仅用于手动触发重写操做。
我都已经3.2.5,貌似redis没有自动触发BGREWRITEAOF
算了,仍是天天按期的去执行一次
写了一个脚本
brgewriteaof.sh
内容以下:
#!/bin/bash
/usr/local/redis/redis-cli -p 6379 -h 127.0.0.1 BGREWRITEAOF
添加权限
chmod 755 brgewriteaof.sh
设定任务计划,天天凌晨2点跑一次
0 2 * * * /opt/brgewriteaof.sh
通过几个月以后,发现仍是存在aof文件过大的问题。因此,用定时任务来跑,不能解决根本问题。
由于aof是记录了不少操做日志,就像Mysql的bin_log日志同样,体积比rdb方式持久化文件要大的多。
理想状况下,aof的大小和当前内存使用的大小是同样的。
更改配置文件
/kuaibao/server/redis/conf/redis.conf
auto-aof-rewrite-percentage 50
而后重启redis
这段配置,是指当aof文件增值率达到50%时,优化一次aof,也就是执行BGREWRITEAOF命令
默认是100,由于线上写入比较频率,因此增加率要调低一点。
以前100多个G的aof,重写一次以后,降至30G。
最后发现,由于磁盘I/O,致使aof重写失败
产生多个临时文件,把磁盘占满了。
没办法,仍是改回rdb方式了。确实比aof空间要小一点。