故障现象:
我们公司近日接了一个投票的项目,商务转达的需求为活动时间内大致为5万PV;结果在上线的第一天,用户IP超过25万,PV达到125万。由于系统没有对高并发进行优化,高峰时系统产生大量异常访问。主要故障现象如下:
- 用户前段体验访问缓慢,出现大量的502错误。
- 应用服务器链接数超过5000,带宽出现瓶颈;CPU,内存,硬盘I/O尚在合理范围之内。
- 数据库服务器CPU使用率达100%,其余尚在合理范围之内。因数据库采用ECS单机自建模式,在查问题过程中出现两次宕机。
根据故障现象,很容易就定位为数据库性能不足导致的访问异常。在SSMS中查看最近耗费大量资源的查询后发现以下两句SQL在表超过1000万行时查询缓慢。
select Count(*) from WY_VoteItem,WY_VoteFlow where WY_VoteItem.ID=WY_VoteFlow.ItemId and CONVERT(varchar(100), WY_VoteFlow.INTIME, 23)= '2016-01-25' and WY_VoteFlow.UserId='oM-gxtwPjh2qk7ahGUQw26Hcz3co' and voteId='120'
select Count(*) from WY_VoteItem,WY_VoteFlow where WY_VoteItem.ID=WY_VoteFlow.ItemId and WY_VoteItem.ID='3209' and WY_VoteFlow.UserId='og48jt-MqhycFsk_mw5ynI25wBG4' and CONVERT(varchar(100), WY_VoteFlow.INTIME, 23)= '2016-04-11'
因公司没有专业的DBA,所以我们采用了比较笨但有效的方法—-采用SQL作业,每天定时将流水表中的数据迁移到备份表上,然后清空流水表数据。
后记:在后期项目时,我们采用了SLB+ECS+OCS+RDS的数据型构架;通过SLB+ECS组成的负载均衡模式解决应用服务器性能不足导致的并发数限制缺陷;通过OCS缓存大量的数据,减轻数据库的压力;采用阿里云的RDS数据库,实现数据的高可用性,减轻我们维护的压力。