传统IT容量估算思路
参考: https://www.cnblogs.com/zhangweizhong/p/5844961.html
https://www.cnblogs.com/zhangweizhong/p/5772330.html
对于上面这个中小型Web架构来说如何对网站做容量预测:
当你的BooS问你,我们的网站在目前的战略下,要做到30w以上的PV,你看我们需要买多少带宽合适?
对于这个问题,相信若从来没有想过这个问题,你很可能一下子一脸懵逼,怎么测算?
其实冷静下来,就会发现,不过就是一道小学数学题罢了。
不就是将30万PV的访问量,换算成带宽嘛,将问题拆分如下:
1. 一天30万的页面访问(PV),转换为每秒访问量(QPS): 30万/(24 × 60 × 60)秒 = 3.47个请求每秒
2. 知道了一秒大概是3.47个请求,将请求化整,就是4个请求每秒.
3. 再来看看我们整个网站平均一个页面有多大,怎么看?Chrome等浏览器打开调试窗口(如:按F12) ,访问自己的网站,看一下最右下角的访问统计,你就知道自己当前访问的这个页面有多少资源,这一次访问发起了多少个衍生连接,以及这一次压缩传输的数据大小,已经资源到客户端后,解压到大小,我们这里主要关心压缩传输大小,通过对整个网站的网页做访问,记录这些值,并求出平均页面大小,接着就可以继续下面的计算了。
4. 知道了一秒大概有4个并发请求,而平均一个页面假如是0.4M,那么4个并发请求需要占用的带宽不就是 4×0.4M=1.6MB,在换算成比特,就是1.6MByte × 8bit= 12.8Mbps 这就是你的网站大概需要多少带宽。
5. 引用道友的公式如下:
网站带宽= PV / 统计时间(换算到S)*平均页面大小(单位KB)* 8
假如现在你们公司的网站上线了,如下图这样的架构,有一天,你们的营销,产品什么的部门过来找你说,这两天要进行一个促销活动,我们的网站需要加多少服务器?
听到这样的问题,你是否又会一脸懵逼。
好接下来就来分析这样的网站架构,如何进行容量预测,还有老规矩抽象问题,拆分化
1. 要测试容量,首先要对目前整个网站架构的实际峰值有较为准确的压测数据。
如何获取较为准确的压测数据?
1.1. 将上面结构简单化为单一web服务器
下面以动静分离的结构来说明:
单一静态Web服务器的压测:
压测集群端------------httpd或Nginx-----css,js,html等静态资源服务器
\________图片服务器
上面整个后端称为一个静态Web服务器
当然,若网站规模没有这么大,我的css,js,html,图片都和Web服务器在一台主机上,那它也是静态Web服务器,上面只是将这些资源拆分开了,和一台没啥区别。
要测试这个静态Web服务器的压力,你需要将自己的业务数据放到对应的位置,就像真实用户访问它一样。
看看多大并发下,一台物理静态Web站点会挂掉,若是虚拟机也一样。
然后,就需要分析多次压缩的结果,并计算出静态Web服务器的并发响应能力,接着计算出图片和css,js,html的服务器分别承受了多少压力,计算出它俩的比值,这样就知道瓶颈点所在了。
1.2 计算动态Web服务器的压测值:
压测集群端-------------------PHP-FPM/Tomcat---------关系型数据库
\____________session缓存数据库
|—————列式缓存数据库
。。。。。。
这个结果的压测和静态区别不大,也是要单台测试,但这里需要注意,通常对于动态Web服务器来说,关系型数据库往往是其最脆弱的部分,而其它缓存数据库,如: memcached, redis, mogondb等相对能承受的压力会更大,因为它们的数据都在内存中,而关系型数据库的数据通常在磁盘,因为太海量了。
所以基于上面的理解,压测的关键点是在前端动态Web服务器自身和它与后端关系型数据库上。
当前端动态Web服务器达到峰值后,大概有多少与关系型数据库的连接,计算出比值,在对关系型数据库中的业务数据做压测,看看其最大峰值是多少,就可以知道当前端动态Web服务器增加到多少时,就需要增加关系型数据库了,这里也要注意与这些缓存数据库的压力测试,和比值计算。
2. 通过以上测试,可以知道当前网站中单台静态或动态Web服务器的峰值是多少。
3. 接着就需要将动静合并为正常的网站服务器来压测
压测集群端--------------负载均衡器--------------单台静态Web服务器
\_________单台动态Web服务器
然后在做网站峰值测试,看看整个Web站点达到峰值时,有多少流量被分到静态了,有多少流量被分到动态了,依然是计算出比值,注意这里说的峰值,是指静态或动态服务器宕机了。这样一来就知道整个网站的峰值是多少了,瓶颈点通常都是动态服务器。
4. 接着回答上面的问题,现在我们知道了网站的峰值,知道了动静分离的比值,若你只有一台Web服务器,不分什么动态静态,也一样,这更简单,不需要前面的负载均衡器,直接测试就是了,当你的Web服务器挂了,就是它的最大峰值了。
4.1. 要增加多少台服务器?
你首先需要从营销或产品哪里知道,本次活动范围有多大,让它给你一个预估值,即他们感觉这次可能有多少人会打开网站的活动页面,假如是50万,即50万的PV。
4.2. 查询之前是否有过类似的活动统计数据,若有那是最好的,这样你就可以参考以前活动时,网站的最大峰值与平时网站访问量做个对比,并计算出平均比例,这样你就大概心中有数了,你就知道类似活动可能带来比平时访问量多几倍的流量了。
4.3. 现在你知道了以前活动的峰值流量是平时访问流量的几倍后,你也知道了这次可能有大概50万的PV,你还知道我单台Web服务器最大能承受的并发流量,在结合当前网站的实际情况,主要是服务器台数,做计算,看看目前全部的服务器能承受多大的并发压力有多大。
4.4. 计算一下50万PV能给单台Web服务器带来多大的并发压力:
4.4.1. 计算方式就是 此次活动大概要持续多长时间,假如是1天,那么就需要知道黄金时间大概能持续多久,假如是6个小时。
先计算
(50万PV × 页面衍生访问数) / (6 × 60 × 60)秒 × 希望让用户打开页面的等待时间 × 因数 = 单台Web服务器要承担的并发压力。
注: 因数: 就是前面计算出了的,以前活动时峰值并发流量和平时并发流量的倍数。
当你计算出一台Web服务器需要承担的并发压力后,就可以根据当前网站的实际压测数据做评估,考虑下这些服务器运行了多久了等等因素后,在做以下计算:
若没有做静态分离,就是单台Web直接上的,就可以这样计算:
单台Web服务器需要承受的并发压力 / 网站已有服务器数量 = 实际每台服务器必须应该承受多少并发压力。
若做了动静分离,或前端加了负载均衡,就需要这样算:
根据负载均衡分担压力到后端的不同Web服务器的压力比值,算出每个后端服务器需要承担的负载压力:
假如是动静分离,并且比例是8:2,即静态8,动态2
单台Web服务器需要承担的总并发压力 × 80% = 静态Web服务器需要承担的压力
单台Web服务器需要承担的总并发压力 × 20% = 动态Web服务器需要承担的压力
接着根据动态Web服务器访问后端关系型数据库的压力比值计算出后端数据库是否能承受这样的压力。
知道了动静Web服务器需要承担的压力值后,需要根据之前对动静Web服务器的压测值,做对比,并计算出差距,然后在根据这个差距来计算超过这个差距,需要增加多少台服务器。并且也知道需要增加那些服务器了。
最后:还有需要根据服务器的折旧率来评估一个比率,使用这个比率 乘以 单台动静服务器的压力,在来评估需要增加的服务器数量。
由于本人能力有限,本文所有思路仅做参考,可结合实际来自行求证!