高并发解决方案
1. 高并发和大流量解决方案
高并发架构相关概念
并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行;在互联网时代,所讲的并发,高并发通常是指并发访问,也就是在某个时间点,有多少个访问同时到来。通常一个系统的日PV在千万以上,有可能是一个高并发的系统。有的公司完全不走技术路线,全靠机器堆,这不在讨论范围内。
QPS:每秒钟请求或者查询的数量,在互联网领域,指每秒响应请求数(指HTTP请求);并发连接数是系统同时处理的请求数量
吞吐量:单位时间内处理的请求数量(通常由QPS与并发数决定)
响应时间:从请求发出到收到响应花费的时间。例如系统处理一个HTTP请求需要100ms。
PV:综合浏览量(page view),即页面浏览量或者点击量,一个访客在24小时内访问的页面数量;同一个人浏览网站同一页面,只记作一次PV
UV:独立访客(unique visitor),即一定时间范围内相同访客多次访问网站,只计算为一个独立访客
带宽:计算带宽大小需关注两个指标,峰值流量和页面的平均大小
日网站带宽=PV/统计时间(换算到s)*平均页面大小(单位KB)*8;峰值一般是平均值的倍数,根据实际情况来定
峰值每秒请求数(QPS)=(总PV数*80%)/(6小时秒数*20%);80%的访问量集中在20%的时间
压力测试:测试能承受的最大并发,测试最大承受的QPS值
常用性能测试工具:ab,wrk,http_load,web_bench,siege,apache jmeter;ab全称是apache benchmark,apache官方推出的工具,创建多个并发访问线程,模拟多个访问者同时对某一trl地址进行访问,它的测试目标是基于url的,因此既可以用来测试apache的负载能力,也可以测试nginx,lighthttp,tomcat,IIS等其它web服务器的压力;ab的使用:模拟并发请求100次,总共请求5000次,ab -c 100 -n 5000 待测试网站;测试机器与被测试机器分开,不要对线上服务做压力测试,观察测试工具ab所在机器,以及被测试的前端机的CPU,内存,网络等都不超过最高限度的75%
QPS达到极限:随着QPS的增长,每个阶段需要根据实际情况来进行优化,优化的方案也与硬件条件、网络带宽息息相关;QPS达到50,可以称之为小型网站,一般的服务器就可以应付;QPS达到100,假设关系型数据库的每次请求在0.01s完成,假设单页面只有一个SQL查询,那么100QPS意味着1s完成100次请求,但是此时并不能保证数据库查询能完成100次,数据库缓存层,数据库的负载均衡;QPS达到800,假设使用百兆带宽,意味着网站出口的实际带宽是8M左右,假设每个页面只有10k,在这个并发条件下,百兆带宽已经吃完,CDN加速,负载均衡;QPS达到1000,假设使用memcache缓存数据库查询数据,每个页面对memcache的请求远大于直接对db的请求,memcache的悲观并发数在2w左右,但有可能在之前内网带宽已经吃光,表现出不稳定,静态HTML缓存;QPS达到2000,这个级别下,文件系统访问锁都成为了灾难,做业务分离,分布式存储
高并发解决方案案例
流量优化:防盗链处理
前端优化:减少HTTP请求,合并css或js,添加异步请求,启用浏览器缓存和文件压缩,CDN加速,建立独立图片服务器,
服务端优化:页面静态化,并发处理,队列处理
数据库优化:数据库缓存,分库分表,分区操作,读写分离,负载均衡
web服务器优化:负载均衡,nginx反向代理,7,4层LVS软件
2. web资源防盗链
盗链:在自己的页面上展示一些并不在自己服务器上的内容,获得他人服务器上的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容,常见的是小站盗用大站的图片,音乐,视频,软件等资源,通过盗链的方法可以减轻自己服务器的负担,因为真实的空间和流量均是来自别人的服务器
防盗链:防止别人通过一些技术手段绕过本站的资源展示页面,盗用本站的资源,让绕开本站资源展示页面的资源链接失效,可以大大减轻服务器及带宽的压力
工作原理:通过请求头中的referer或者签名,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以跟踪到显示它的网页地址,一旦检测到来源不是本站即进行阻止或者返回制定的页面,通过计算签名的方式,判断请求是否合法,如果合法则显示,否则返回错误信息
实现方法:referer:nginx模块ngx_http_referer_module用于阻挡来源非法的域名请求,nginx指令valid_referers none | blocked | server_names | string...,none表示referer来源头部为空的情况,blocked表示referer来源头部不为空,但是里面的值被代理或者防火墙删除了,这些值都不以http://或者https://开头,server_names表示referer来源头部包含当前的server_names,全局变量$invalid_referer。不能彻底防范,只能提高门槛。也可以针对目录进行防盗链。
//在nginx的conf中配置 location ~.*\.(gif|jpg|png|flv|swf|rar|.com *.zi.( rewrite ^/ http:
传统防盗链遇到的问题:伪造referer:可以使用加密签名解决
加密签名:使用第三方模块HttpAccessKeyModule实现Nginx防盗链。accesskey on|off 模块开关,accesskey_hashmethod md5|sha-1 签名加密方式,accesskey_arg GET参数名称,accesskey_signature 加密规则,在nginx的conf中设置
location ~.*\.(gif|jpg|png|flv|swf|rar|zip)$
{
accesskey on;
accesskey_hashmethod md5;
accesskey_arg sign;
accesskey_signature "jason$remote_addr";
}<?php$sign = md5('jason'.$SERVER['REMOTE_ADDR']);echo '<img src=".logo.png?sign='.$sign.'">';3. 减少HTTP请求次数
性能黄金法则:只有10%-20%的最终用户响应时间花在接收请求的HTML文档上,剩下的80%-90%时间花在HTML文档所引用的所有组件(img,script,css,flash等)进行的HTTP请求上。
如何改善:改善响应时间的最简单途径就是减少组件的数量,并由此减少HTTP请求的数量
HTTP连接产生的开销:域名解析--TCP连接--发送请求--等待--下载资源--解析时间
疑问:DNS缓存,查找DNS缓存也需要时间,多个缓存就要查找多次有可能缓存会被清除;Keep-Alive,HTTP1.1协议规定请求只能串行发送,前面的一个请求完成才能开始下个请求
减少HTTP请求的方式:图片地图:允许在一个图片上关联多个URL,目标URL的选择取决于用户单击了图片上的哪个位置,以位置信息定位超链接,把HTTP请求减少为一个,可以保证设计的完整性和功能的齐全性,使用map和area标签;
<img usemap="#map" src="/map.gif?t=111"><map name="map"> <area shape="rect" coords="0,0,30,30" href=... title=""> ... </map>
CSS Sprites:CSS精灵,通过使用合并图片,通过指定css的background-image和background-position来显示元素。图片地图与css精灵的响应时间基本上相同,但比使用各自独立图片的方式要快50%以上
合并脚本和样式表:使用外部的js和css文件引用的方式,因为这要比直接写在页面中性能要更好一点;独立的一个js比用多个js文件组成的页面载入要快38%;把多个脚本合并为一个脚本,把多个样式表合并为一个样式表
图片使用base64编码减少页面请求数:采用base64的编码方式将图片直接嵌入到网页中,而不是从外部载入
4. 浏览器缓存和数据压缩优化
HTTP缓存机制:如果请求成功会有三种情况:200 from cache:直接从本地缓存中获取相应,最快速,最省流量,因为根本没有向服务器进行请求;304 not modified:协商缓存,浏览器在本地没有命中的情况下请求头中发送一定的校验数据到服务端,如果服务端数据没有改变浏览器从本地缓存响应,返回304,快速,发送的数据很少,只返回一些基本的响应头信息,数据量很小,不发送实际响应体;200 OK:以上两种缓存全部失败,服务器返回完整响应,没有用到缓存,相对最慢。
浏览器认为本地缓存可以使用,不会去请求服务端。相关header:pragma:HTTP1.0时代的遗留产物,该字段被设置为no-cache时,会告知浏览器禁用本地缓存,即每次都向服务器发送请求;expires:HTTP1.0时代用来启用本地缓存的字段,浏览器与服务器的时间无法保持一致,如果时间差距大,就会影响缓存结果;cache-control:HTTP1.1针对expires时间不一致的解决方案,告知浏览器缓存过期的时间间隔而不是时刻,即使具体时间不一致,也不影响缓存的管理;可以设置的值:no-store:禁止浏览器缓存响应;no-cache:不允许直接使用本地缓存,先发起请求和服务器协商;max-age=delta-seconds:告知浏览器该响应本地缓存有效的最长期限,以秒为单位;优先级:pragma >cache-control > expires。当浏
原创不易,完成人机校验,阅读全文