Redis一个危险命令,直接导致生产Redis灾难性故障

656 阅读2分钟

生产出现故障了!!

告警信息显示

报警级别:严重故障 
报警内容:Redis: springboot-digest- consumer
类型: master_slave 
节点: 10.1.11.194:6391 主从连接异常
影响范围: ****

结果导致生产很多服务在redis set和get值时,无法正常操作,从而导致程序抛错非常多。

但是什么原因导致呢?

刚开始以为是网络问题,但经排查却发现是这个命令:

keys *

但是我们并没有用到这个命令。

那么,是什么原因导致的呢?

经过查找,发现是某个ip的机器操作的,而操作人竟就是我身边的大佬,他在操作时我就在身边看。

当时是因为程序中有抛错的情况,于是就在生产的跳板机上用到了redis客户端rdm,查找redis某个key的值是否有存入。

举例来讲,redis这个实例下有db0~db15总16个db数据库。而他一不小心点开了db0,结果就相当于实现了

keys *

redis.png

而这db0里面有几十万甚至几百万的数据,直接获取这个库里面的内容所有key值了,那是相当恐怖的,直接会使redis的CPU飙升,导致redis卡死锁死,影响后续的操作。

而如果所有请求在redis获取不到数据,就会到数据库查,从而给数据库产生极大的压力,从而导致redis雪崩效应,使得数据库宕机事件,假如是支付公司,那损失就惨重了。

不过幸好这次对我们的影响没有产生非常大的影响。

复盘

  • 不要用keys,否认会出现灾难性的后果。公司最好禁用此命令;
  • 生产跳板机不要用rdm连接,如果需要查找,最好连接redis实例查找;