生产出现故障了!!
告警信息显示
报警级别:严重故障
报警内容: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 *
而这db0里面有几十万甚至几百万的数据,直接获取这个库里面的内容所有key值了,那是相当恐怖的,直接会使redis的CPU飙升,导致redis卡死锁死,影响后续的操作。
而如果所有请求在redis获取不到数据,就会到数据库查,从而给数据库产生极大的压力,从而导致redis雪崩效应,使得数据库宕机事件,假如是支付公司,那损失就惨重了。
不过幸好这次对我们的影响没有产生非常大的影响。
复盘
- 不要用keys,否认会出现灾难性的后果。公司最好禁用此命令;
- 生产跳板机不要用rdm连接,如果需要查找,最好连接redis实例查找;