这段时间我们有个网站不断更新内容,流量在不断增长的同时,也引来了大量采集者,现在的采集者已经非常专业了,IP池不断更换,User Agent也随机变化,甚至Referer也做了不同的伪装,让我们花了很多时间来分析Apache日志,不断修改屏蔽条件,斗智斗勇。先以为是百度爬虫太快,把百度爬虫进行了专门的临时503处理,360爬虫干脆全部屏蔽了,但发现还是不行,非正规搜索引擎的采集者带来的麻烦依然不断。🤔
为了不影响用户访问,下血本把阿里云服务器从8核16G升级为16核32G,基本可以解决ECS负载飙升的问题,但RDS数据库服务器还是会遇到查询语句堆积的情况,我们查看是某种索引条件下的查询语句,进一步查看Drupal网站中对应的Views设置,把输出结果进行了一些简化不过还是没解决,MySQL语句已经很简单了,就是根据city索引,然后对date进行排序:
SELECT name AS name, date AS date FROM {table} table WHERE (( (city = 'XXX') )) ORDER BY date DESC LIMIT 16 OFFSET 0
在RDS不忙的情况下也需要50ms,检查date、city都有索引,后来想到可能需要联合索引(忘记用explain查看了,本来可以更快定位问题所在) ,然后添加了联合索引,删除了原来单独的两个索引,再看查询速度就非常快,只要1-2ms左右了。👍
我们很多个子网站批量生成了联合索引,花了几个小时时间,然后昨晚到今天再也没有发现ecs/rds被卡住的情况了,从根本上解决了MySQL查询遇到的瓶颈。👌
我们其它Drupal网站肯定也有类似问题,因为流量不大、采集不多、数据量不大,没有呈现出来,以后还要再专门检查、必要时添加联合索引。✌
对于有相当流量的网站来说,保证网站的可访问性、提高浏览速度就可以带来更多流量和收入!😀
评论