在一次正常的活动促销之后,客服开始陆续反馈有用户反应在抢标的时候打不开网页或者APP,在打开的时候标的就已经被抢光了,刚开始没有特别的上心,觉得抢标不就是这样吗,抢小米手机的时候也不就这样吗?随着活动继续推进,有更多的用户强烈抗议,用户领了加息卷或者抵现卷之后抢不上标的,认为是平台作假故意不让使用以达到节省资源。

分析过程

其实以前也会有陆续的用户反馈不减少,给客户以小米抢手机为例子忽悠了过去,这次用户反馈太过强烈,才让我们重视了起来。我们前端一共三款产品,app、官网、H5,其中app使用量最大,官网其次,H5平时使用量极少但是做活动期间流量会暴增(活动一般都是H5游戏居多,H5也便于推广营销),前端的三款产品都是分别使用lvs负载到后端的两台web服务器中(如下图),这次用户反馈基本在web和app端,所以重点观察这四台服务器。

首先怀疑网络带宽是否被涌满,找到网络工程师通过工具来监控,在抢标的时候带宽最高使用率只有70%左右,随排除之;再次怀疑web服务器是否抗不住了,使用top命令查看官网负载的两台服务器,在抢标的瞬间会飙到6-8左右,抢标后也慢慢的恢复了正常,app两台服务器高峰到10-12,随后也恢复正常。

跟踪web服务器业务日志,发现在数据库更新层报请求不到新的数据库连接或者数据库连接已经用完,认为是数据库的最大连接数太小,于是调整MySQL数据库最大连接数为以往的3倍;下次抢标的时候继续观察业务日志,发现已经不报数据库链接的相关错误了,但还是很多用户反馈抢标时候打不开页面。

继续跟踪web服务器,在抢标时使用命令(ps -ef|grep httpd|wc -l)查看httpd得连接数有1千左右,随机查看apache配置文件中设置的最大连接数为1024(apache默认的最大连接数为256),原来抢标期间连接数已经到达最大连接数,很多用户在抢标的过程中已经获取不到http连接导致页面无响应或者app一直在等待中。于是调整apache配置文件中的最大连接数为1024*3。

在抢标过程中继续观察,apache的连接数在抢标的时候仍然可以飙到2600-2800之间,根据客服反馈,仍然有很多用户反馈抢标的问题,但比之前稍微好一点,但是有零星的用户反馈已经抢到标的,最后又给回退了。然后继续观察数据库服务器,使用top命令和MySQLWorkbench查看mysql主库和从库的各项负载吓一跳(如下图),mysql服务器主库的各项指标均已经达到峰值,而从库几乎没有太大压力。

跟踪代码发现,三端的业务代码全部连接主库,从库只有后台的查询业务在使用,于是立刻启动改造;将除过抢标过程中的查询外,其它页面或者业务的所有查询改造为查询从库,改造之后观察,发现主库的压力明显减少,从库的压力开始上来了。如下图:

根据客服的反馈,改造之后抢到标回退的问题几乎没有了,抢标过程中页面打不开或者打开慢的问题有一定的缓解但仍有部分用户反馈此问题,根据上面各项目分析结果得出:

  • 1 负载的两台服务器均已经达到处理的极限,需要配置更多的服务器来负载。
  • 2 mysql主库的压力明显减少,但是从库的压力却上去了,需要将现在的一主一从已从改为一主多从的模式。
  • 3 彻底解决这些问题,需要综合考虑平台的整体优化,如:业务优化(去掉业务中热点)、增加缓存、部分页面静态化(可以使用雅虎和谷歌的前端优化规则,网上也有很多的测试网站可以评测)等等。

当时根据这些情况写了一份优化的报告,见下文:

优化报告

1 背景

随着公司业务不断发展,业务量和用户量的激增,官网pv也从最初的xxx-xxx到现在的xxx-xxxx,APP活跃用户更是大幅增加;因此也对平台目前的技术架构有了更大的挑战。特别是近期平台标源紧张的情况下,满标的时间更是越来越短。服务器的压力也越来越大;因此需要升级目前的系统架构,以支持更大的用户量和业务量。

2 用户访问示意图

目前平台有三款产品面对用户,平台官网、平台APP、平台小网页;其中平台官网和平台APP的压力比较大。

3 存在的问题

用户抢标的时候问题集中在以下几个方面 
1、网页或者APP打不开 
2、网站或者APP打开慢 
3、抢标过程中转账成功后,因为服务器负责压力大更新失败,再次退款 
4、数据库连接数用完,导致满标后添加投资记录失败,回退标的进度

4 分析

通过对近期的服务器参数,并发量,以及系统日志等进行深入的分析,得出: 
1、平台官网、平台APP抢标过程中服务器压力巨大,其中平台APP问题更加突出,抢标高峰期间单台APP服务器apache最大连接数已经接近2600,接近apache最大的处理能力

2、数据库服务器压力巨大。数据库压力主要在两个时期比较突出 
1)当平台做活动的时候,官网、小网页、APP访问量巨增,导致数据查询量跟着巨增,当到达数据库处理极限时,就会表现出网站打开慢等问题; 
2)当用户抢标的时候,用户抢标的压力又分为两个阶段:抢标前和抢标中。抢标前,因为满标速度很快,用户提前打开抢标页面不断刷新,这样数据库的查询压力会不断增大,如果抢标的用户量非常大,会导致在抢标之前将数据库连接数用完;抢标中,单次购买大概会涉及15张左右表进行更改查询,每个标的份额1000万大概每次会有100-200人左右购买完成满标,以中间值150人计算,在几秒的时间内需要对数据更新2000-3000次(仅仅是更新,不包括查询 ),产生大量并发,可能会导致更新失败或者连接超时,从而影响到用户投标和系统正常满标。

5 解决方案

1、web服务器解决方案 
单个用户访问web服务的示意图

目前网站和平台APP均是采用了两台服务来做均衡负责,每台服务器中安装了apache来做服务端接受处理,每台apache最大可以处理大约2000条连接。因此理论上目前网站或者APP可以处理大于4000个用户请求。如果要支持同时1万的请求,则需要5台apache服务器来支持,因此目前缺少6台web服务器。 
升级服务器后的访问示意图 

2、数据库解决方案 
当前数据库的部署方案 

1)主从分离解决主库80%的查询压力。目前平台官网、APP均连接mysql主库导致主库压力倍增,把服务中的查询全部迁移到从数据库可以大量减轻主库的压力。

2)增加缓存服务器。当从库查询到达峰值的时候,也会影响主从的同步,从而影响交易,因此对用户经常使用的查询进行缓存以达到减少数据库的请求压力。需要新增三台缓存服务器搭建Redis集群。 

3、其它优化 
1)官网首页静态化,从cnzz统计来分析,首页占比网站的整体访问量的15%左右,对于首页不经常变动的数据通过静态化来处理,提升官网打开的流畅度。

2)apache服务器的优化,开启gzip压缩,配置合理的链接数等

3) 去掉投资过程中的更新热点:标的进度表。每次投标成功或者失败都需要对标的进度表进行更新,多线程更新的时候就会出现乐观锁等问题。去掉过程中的更新,只在满标后将标的进度信息保存在标的进度表,优化投资过程中对数据库的压力。

6 服务器升级方案

1、平台最大的压力来自于数据库,需要将现在的一主一从,改为一主四从。官网/app/小网页产生的大量查询,由虚IP分发到三台从库,后台管理查询走另外的一个从库。数据库需要新增三台服务器 
数据库升级后的示意图 

2、增加缓存减少数据的压力,需要新增两台大内存的缓存服务器 

3、需要新增三台web服务器分解用户访问请求

app需要新增两台服务器 
在抢标过程中app服务器压力最大,需要新增两台服务器,配置完成后的示意图 

官网需要新增一台服务器 
官网在抢标过程也有一定的压力,需要新增一条服务器,完成后示意图如下: 

总合计之后需要购置8台服务器,其中有两台要求有大内存(64G以上)

点击下载优化报告word版本

备注:所有优化方案投产后,问题解决,抢标无忧!


作者:纯洁的微笑 
出处:http://www.ityouknow.com/

from: http://blog.csdn.net/ityouknow/article/details/58034815

一次生产事故的优化经历相关推荐

  1. Spring Transactional还能导致生产事故?

    在Spring中进行事务管理非常简单,只需要在方法上加上注解@Transactional,Spring就可以自动帮我们进行事务的开启.提交.回滚操作.甚至很多人心里已经将Spring事务与@Trans ...

  2. 一次非常有意思的sql优化经历

    一次非常有意思的sql优化经历 原文:一次非常有意思的sql优化经历 场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表 create table Course(c_id int PR ...

  3. 生产事故 java_记一次生产事故:30万单就这样没了!

    背景 你好,我是彤哥. 昨天晚上下班回家,在地铁上,老大突然打来电话,B系统生产环境响应缓慢,影响了A系统的使用,几万小哥收不了单,大概有30万单卡住了,你去帮忙定位一下. 我8点半左右到家,立马上线 ...

  4. 记一次小型生产事故 | BeyondComper跨编码方式复制文件内容

    前言 今天组长在做站内巡检的时候,发现header内有一条meta标签的content显示为乱码. <meta name="description" content=&quo ...

  5. 一个情怀引发的生产事故

    在一个项目中,需要轻量级用到脚本语言,来提高应用服务的灵活性.因为知道Roslyn可以动态编辑C#,本着情怀,就自然用Roslyn来处理这块业务了.开在windows上执行,一次调用风平浪静,因为这个 ...

  6. Spring官方推荐的@Transactional还能导致生产事故?

    在Spring中进行事务管理非常简单,只需要在方法上加上注解@Transactional,Spring就可以自动帮我们进行事务的开启.提交.回滚操作.甚至很多人心里已经将Spring事务与@Trans ...

  7. mysql grant produce_ERROR 1045 (28000) Mysql中grant 使用不当导致的生产事故

    背景: 新项目上线,Data Warehouse 的同事要从Mysql 的SLAVE 库上抽取数据.其中一项任务是授予读取数据库的权限. 没想到这个简单的操作也引发了一些意外. 在只读用户增加权限后, ...

  8. mysql reorg_生产数据库性能优化之reorg和表重建

    生产数据库的性能调优是一个系统的工程,它不仅要求DBA熟悉db2的工作原理和各种性能指标,还要求DBA也要熟悉操作系统.存储等其他知识,甚至要求DBA熟悉应用的设计原理以及它使用数据库的方式等.这里, ...

  9. SEO浴火重生-记拯救被百度严重降权的网站优化经历

    SEO浴火重生-记拯救被百度严重降权的网站优化经历 前言 最好的SEO(==搜索引擎优化==)就是没有SEO.这是我08年系统学习了SEO之后装逼说的话.事实上,就最近几年而言,我已经不太在乎SEO了 ...

最新文章

  1. Elasticsearch环境搭建
  2. [Android]_[初级]_[sdk docs reference api 文档打开慢的解决办法]
  3. 总结|机器视觉中三大坐标系及其相互关系
  4. cocos2dx 3.3 异步加载纹理
  5. js rsa验签_js rsa sign使用笔记(加密,解密,签名,验签)
  6. 虚拟局域网vlan实验报告_自动化已非原来的自动化:看虚拟局域网技术应用到罗克韦尔的DCS...
  7. Java中的三目运算符可能出现的问题
  8. 初一七年级计算机信息全册教案,新川教版七年级信息技术全册教案(全册)
  9. spring 计划任务_与Spring的计划任务一起按时运行
  10. 玩转oracle 11g(50):rman备份脚本
  11. 华为悦盒ec6108v9修改mac、sn、stbid修改实现移植到性能好的设备
  12. 2019,一年一度的高考季来临,作文又成热门话题
  13. html九宫格拼图怎么做,朋友圈九宫格拼图照片制作方法
  14. 常用数字电路模块:计数器与分频电路(一)
  15. 取消管理员取得所有权_win10如何获得管理员所有权?
  16. php global 要点
  17. 一个域名下面能搭建多个网站吗?
  18. Google Earth Engine(GEE)计算NDFI和AWEI
  19. linux运维要经常加班吗,请好好善待你身边的Linux运维工程师,因为他们…
  20. 计算机视频格式有哪些,在线视频网站支持的视频格式有哪些?

热门文章

  1. DDNS 的工作原理及其在 Linux 上的实现--转
  2. 转载--How to Install VMware Tools on CentOS 6.3
  3. Lesson 16.4 卷积遇见深度学习
  4. MySQL——MySQL的数据查询功能
  5. 【自然语言处理】自然语言处理(NLP)知识结构总结
  6. 官方乌镇定调互联网金融,P2P、众筹专项对待
  7. 可视化自编码器训练结果
  8. aws iot 连接时间_AWS IoT Core 定价
  9. jvm性能调优实战 -60 线上系统的JVM参数优化、GC问题定位排查、OOM分析解决
  10. Spring Cloud【Finchley】实战-04将订单微服务与商品微服务分别拆分为多模块