春节前忙着把一些网站从自己独立托管的服务器搬迁到阿里云的平台中去,以前自己的服务器都是购买的顶配硬件(几年前就是16核、64G内存、8块硬盘),安装Linux+Apache+MySQL+PHP在同一台机器上,现在用了云服务器ECS做Web服务器,用云数据库RDS做MySQL服务,应该来说更合理,不过实际运行中也遇到问题。
先搬迁了几个小的网站,数据量不大、访问量不大,所以搬迁过去没有什么大的负载,ECS/RDS以及带宽什么都很富裕。但在搬迁一个数据量偏大、访问量也较大的网站时遇到问题,RDS的CPU总是100%,不运行自动检测超时MySQL进程并自动杀死该进程的脚本就完全不行,运行后算是可以维持,但一部分页面超时报错。
我查看了一下,主要是MediaWiki的包含动态页面列表DPL扩展的页面报错,怀疑是RDS配置选的过低,数次升级硬件配置、费用也在不断升高,从260M到600M、1200M、2400M都还是不行,后来不知道怎么碰巧就好了,此后负载一直非常低、用高配置RDS明显有很大浪费,于是我又申请了一个新的RDS,准备迁移数据后退掉老的高配RDS,但在新的RDS上遇到同样的问题,从260M升级到600M、1200M后问题依然存在,我知道再升级也没用,还是有其它问题。
在通过阿里云售后服务工单很多次沟通后,发现是有一类比较复杂的SQL查询语句在新老RDS上运行有明显差异,再用explain仔细查看,同一条查询语句在两台RDS上运行的“执行计划”居然不一样,都是分为4个步骤,但权重一样的步骤中执行的先后顺序不一样,老RDS上正确的执行计划可以顺利运行完,新RDS上糟糕的执行计划导致运行时间非常长最终进程堆积。
这个就太奇怪了而且太专业了,我查了很多资料也没有找到答案,还是阿里云的DBA支持团队厉害,查出是数据迁移后有一个表的统计数据不正确,修正后解决。他们的建议是:在表有大数据量改变后,重新手动收集下统计数据。 analyze table tab_name;
此后1200M的RDS运行就基本上没有过大负载的问题了,观察到春节过后可以把老RDS退掉。
先还怀疑过MySQL版本的问题、MediaWiki及DPL版本升级的问题、RDS硬件性能的问题等等,最后还是迁移后统计数据这样的问题。在这里对阿里云的工单系统赞一下,客服回复很及时、通知很方便、技术也很专业!👍
评论