事件:
接到同事保障,redis挂了,使用 ping 时报 (error) MISCONF … 错误。
处理过程:
登录系统确认问题
[root@redis01 ~]# redis-cli
127.0.0.1:6379> ping
(error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
127.0.0.1:6379> exit
查看日志,按照网上办法
请在/etc/sysctl.conf 添加一项 ‘vm.overcommit_memory = 1’ ,然后重启(或者运行命令’sysctl vm.overcommit_memory=1’ )使其生效。
查看 vm.overcommit_memory 设置,发现原配置已。重启redis后,redis正常启动并加载数据到内存。
[root@redis01 ~]# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> info
但几分钟后,redis 再次重现同样错误。
查看进程、内存和磁盘使用情况
[root@redis01 ~]# free -m
total used free shared buffers cached
Mem: 64422 61394 3028 0 4 2327
-/+ buffers/cache: 59062 5360
Swap: 10239 10223 16
[root@redis01 ~]# ps -ef|grep redis
root 1168 1 0 Jun16 ? 00:17:40 /usr/local/bin/redis-server *:6379
root 24873 1168 6 15:55 ? 00:01:18 redis-rdb-bgsave *:6379 .
root 24946 24929 0 16:15 pts/0 00:00:00 grep redis
[root@redis01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg0-lv1 286G 41G 230G 16% /
tmpfs 32G 0 32G 0% /dev/shm
/dev/sda1 190M 32M 149M 18% /boot
发现在数据加载完到内存,发生错误前后,内存有跳动,有增加现象。
发生错误时进程 redis-rdb-bgsave 一直在运行
查看资料发现这个是 redis 的后台快照进程,进行快照时会将完整的内存镜像持久化到磁盘上。
估计问题就发生在这里。使用info和config get * 检查 redis 配置信息
127.0.0.1:6379> info
# Server
redis_version:2.8.19
... 略
[root@redis01 ~]# redis-cli
127.0.0.1:6379> config get *
1) "dbfilename"
2) "dump.rdb"
3) "requirepass"
... 略
找到配置文件,redis 确实只启用快照,基本5分钟做一次快照
101) "appendonly"
102) "no"
109) "save"
110) "900 1 300 10 60 10000"
决定改成AOF模式
修改从上面查到的redis配置文件,appendonly 改成 yes
重启redis
这时发现,快照和AOF 同时有在做,但错误已不再发生。
---动态设置重写频率
[root@redis01 var]# redis-cli
127.0.0.1:6379> config get auto-aof-rewrite-min-size
1) "auto-aof-rewrite-min-size"
2) "67108864"
127.0.0.1:6379> config set auto-aof-rewrite-min-size 64424509440
OK
127.0.0.1:6379> config get auto-aof-rewrite-min-size
1) "auto-aof-rewrite-min-size"
2) "64424509440"
---将rewrite百分比设成50%
127.0.0.1:6379> config get auto-aof-rewrite-percentage
1) "auto-aof-rewrite-percentage"
2) "100"
127.0.0.1:6379> config set auto-aof-rewrite-percentage 50
OK
127.0.0.1:6379> config get auto-aof-rewrite-percentage
1) "auto-aof-rewrite-percentage"
2) "50"
--设置过后,当appendonly.aof 达到原大小的1.5倍后就会重新改写
--如原48G ,到达 72G 后,就会重新刷回48G
停止快照
[root@redis01 ~]# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> config get save
1) "save"
2) "900 100 300 100000 60 1000000"
127.0.0.1:6379> config set save ""
OK
127.0.0.1:6379> config get save
1) "save"
2) ""
127.0.0.1:6379> exit
观察几天后,错误已不再发生。
在cli上也可以手工执行BGREWRITEAOF
2018-01-31
前两天AOF日志突然不能正常rotate,经变换一次dir且增加rdb模式后恢复正常。
127.0.0.1:6379> config get appendonly
1) "appendonly"
2) "yes"
127.0.0.1:6379> config get save
1) "save"
2) "60 10000"
127.0.0.1:6379> config get dir
1) "dir"
2) "/usr/local/redis/var"