CACHE RELOAD机制设计和实现(防止CACHE失效引发雪崩)
故障分析:
当前逛正在做推广,流量突然暴增,QPS达到5000+,当首页部分缓存失效时,需要查询DB,但由于这部分业务逻辑很复杂导致这SQL包含多表join,groupby,orderby等,执行需要1S,产生的大量临时表,内存中都装不下,变成在磁盘上的临时表,但当时放临时表的磁盘分区容量只有20G,很快磁盘也爆了,结果显然网站打不开了。
总结为几点:
- SQL语句优化不足
- MYSQL
tmp_table_size
配置太小 - 磁盘分区不合理/ TMPDIR路径配置不合理
- 部门间沟通不足,大型推广前没事先打招呼。
临时解决措施:
由于当时持续大量用户访问,查询数据库一直挂住,导致缓存一直无法一套回去,首页那缓存一直处于未命中状态,恶性循环,雪崩了。
当时我们立马采取以下措施:
- 调整MYSQL
tmp_table_size
,关于tmp_table_size
请看下面详细描述。 - 修改MYSQL临时表保存路径(TMPDIR)到较大分区
- 简化业务逻辑,修改SQL,重新部署。
临时表使用内存(tmp_table_size):当我们进行一些特殊操作如需要使用临时表才能完成的join,Order By,Group By 等等
,MySQL 可能需要使用到临时表。当我们的临时表较小(小于 tmp_t