现象
系统平稳运行过程中, 应用服务器流量随时间增大,redis内存平稳,redis服务器CPU占用激增,数据库压力激增。
原因
- redis中出现大面积未命中。
- 出现非正常URL访问。
如csdn某一篇博客的地址如下:https://blog.youkuaiyun.com/qq_33954947/article/details/107796253
如果我们把最后的参数改一下,这个地址变成:https://blog.youkuaiyun.com/qq_33954947/article/details/107796286
这个时候会出现不能正常访问的情况,这就是非正常URL访问。
这种情况下,在redis中查不到对应的数据,就会直接去数据库查,从而加大数据库压力,导致数据库崩溃。
这种情况一般是有黑客攻击服务器。
解决方法
- redis中缓存一个对应key的空数据(null),设置过期时间为30~60s。不过这样对redis的内存有影响。
- 白名单策略。
- 预热各个数据id对应的bitmaps,用于记录存在的数据。在加载数据前,先在bitmaps最校验,对于不存在的数据直接打回。但是这样会影响性能。
- 使用布隆过滤器。布隆过滤器和bitmaps作用类似,可以知道数据是否存在,不过这个会有点误差,但是对于黑客攻击来说,已经可以过滤掉大部分请求了。
- 实时监控。
实时监控redis命中率与null数据的占比。- 非活动时段波动:通常检测3~5倍。超过5倍重点排查。
- 活动时段波动:通常检测10~50倍。超过50倍重点排查。
- key加密。对key进行业务层传输加密,校验key不满足条件直接打回请求。