大流量:上千万台客户端同时请求服务器

高并发:并发是因为单台服务器已经完全不能满足大流量的需求,所以需要多台服务器共同处理请求,来缓解单台服务器的压力。异地部署服务器也可以用来进行容灾

高并发概念(QPS, 吞吐量,并发)

并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任何一个时间点上只有一个程序在处理机上运行。
    在某个时间点,同时的访问数量

高并发:一个系统的日PV在千万以上,有可能是一个高并发的系统

QPS:每秒钟请求或者查询的数量,在互联网领域,指每秒响应请求数(指HTTP请求) 不等于并发连接数

并发连接数是系统同时处理的请求数量

吞吐量:单位时间内处理的请求数量(通常由QPS与并发数决定)

响应时间:从请求发出到收到响应花费的时间。
    
    PV:综合浏览量(Page View),即页面浏览量或者点击量,一个访客在24小时内访问的页面数量,同一个用户浏览网站的同一个页面,只记作一次PV
    UV:独立访客(UniQue Visitor),即一定时间内相同访客多次访问网站,只计算为1个独立访客
    带宽:计算带宽大小需关注两个指标,峰值流量和页面的平均大小
    日网站带宽 = PV / 统计时间(单位秒) * 平均页面大小(单位KB) * 8
    峰值一般是平均值的倍数,根据实际情况来定
    峰值每秒请求数(QPS) = (总PV数 * 80%) / (6小时秒数 * 20%)
    80%的访问量集中在20%的时间
    压力测试:测试能承受的最大并发,测试最大承受的QPS值
    常用性能测试工具:wrk、http_load、Web Bench、Siege、Apache JMeter
    ab(Apache benchmark,是Apache官方推出的工具):创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的,因此,它既可以用来测试Apache的负载压力,也可以测试nginx、lighthttp、tomcat、IIS等其他Web服务器的压力
    注意事项:
        测试机器与被测试机器分开
        不要对线上服务做压力测试
        观察测试工具ab所在机器,以及被测试的前端机的CPU,内存,网络等都不超过最高限度的75%

五种优化:

(1)流量优化: 防盗链处理
   (2)前端优化: 减少HTTP请求,添加异步请求,启用浏览器缓存和文件压缩,CDN加速,建立独立的图片服务器
   (3) 服务端优化:页面静态化,并发处理,队列处理
   (4) 数据库优化:数据库缓存(redis缓存),分库分表,分区操作,读写分离,负载均衡
   (5)Web服务器优化:使用nginx的反向代理实现负载均衡

11个优化措施

(1)流量优化之防盗链处理

 Web资源防盗链
    概念:盗链是指在自己的页面上展示一些并不在自己服务器上的内容,获得他人服务器上的资源地址,绕过别人的资源展示页面,直接在自己的页面上向用户提供此内容
      常见的是小站盗用大站的图片、音乐、视频、软件等资源
      通过盗链的方法可以减轻自己服务器的负担,因为真实的空间和流量均是来自别人的服务器
    防盗链:防止别人通过一些技术手段绕过本站的资源展示页面,盗用本站的资源,让绕开本站资源展示页面的资源链接失效
    可以大大减轻服务器及带宽的压力

    工作原理:通过Referer或者签名,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以跟踪到显示它的网页地址。一旦检测到来源不是本站即进行组织或者返回指定的页面。
    通过计算签名的方式,判断请求是否合法,如果合法则显示,否则返回错误信息
    Nginx模块 ngx_http_referer_module用于阻挡来源非法的域名请求
    Nginx指令 valid_referers,全局变量$invalid_referer

    Nginx第三方模块HTTP_AccessKeyModule实现Nginx防盗链    

           模块开关[accesskey  on|off ], 签名加密方式[accesskey_hashmethod  md5|sha-1] ,  参数名称[accesskey_arg GET]

加密规则[accesskey_signature]

(2)前端优化之减少HTTP请求
        为什么减少HTTP请求?:
            性能黄金法则:只有10%-20%的最终用户响应时间花在接受请求的HTML文档上,剩下的80%-90%时间花在HTML文档所引用的所有组件(图片,script,css,flash等等)进行的HTTP请求上。
            HTTP连接产生的开销:域名解析-TCP连接-发送请求-等待-下载资源-解析时间
            HTTP1.1协议规定请求只能串行发送,也就是100个请求必须依次逐个发送,前面的一个请求完成才能开始下个请求
            HTTP连接产生的开销:域名解析-TCP连接-发送请求-等待-下载资源-解析时间
        方式:
            1)改善响应时间的最简单途径就是减少组件的数量,并由此减少HTTP请求的数量
            2)图片地图:图片地图允许你在一个图片上关联多个URL。目标URL的选择取决于用户点击了图片上的哪个位置,将多个图片合并为一张图片,然后以位置信息定位超链接,把HTTP请求减少为一个,可以保证设计的完整性和功能的齐全性
            3)css Sprites 通过css进行图片进行定位,backgorund-position
            4)合并脚本和样式表,使用外部的js和css文件引用的方式,因为这要比直接写在页面中性能要更好,把多个脚本合并成一个脚本,把多个样式表合并成一个样式表
            5)图片使用Base64编码减少页面请求数:采用Base64的编码方式将图片嵌入到网页中,而不是从外部载入

(3)前端优化之建立独立的图片服务器 (阿里云oss)

独立的必要性:
            ①分担Web服务器的I/O负载,将耗费资源的图片服务分离出来,提高服务器的性能和稳定性
            ②能够专门对图片服务器进行优化-为图片服务设置有针对性的缓存方案,减少带宽成本,提高访问速度。
            ③提高网站的可扩展性-通过增加图片服务器,提高图片吞吐能力

            采用独立域名:
                原因:①同一域名下浏览器的并发连接数有限制,突破浏览器连接数的限制
                ②由于cookie的原因,对缓存不利,大部分Web cache都只缓存不带cookie的请求,导致每次的图片请求都不能命中   cache
       独立后的问题:
                如何进行图片上传和图片同步:NFS共享方式,利用FTP同步

(4)前端优化之浏览器缓存和压缩优化技术
        缓存分类
        HTTP模型中,如果请求成功会有三种情况
        (1)200 from cache:直接从本地缓存中获取响应,最快速,最省流量,因为根本没有向服务器发送请求
        (2)304 Not Modified:协商缓存,浏览器在本地没有命中的情况下,请求头中发送一定的校验数据到服务端,如果服务端数据没有改变浏览器从本地缓存响应,返回304。快速,发送的数据很少,只返回一些基本的响应头信息,数据量很小,不发送实际响应体
        (3) 200 OK:以上两种缓存全都失败,服务器返回完整响应,没有用到缓存,相对较慢
     本地缓存:浏览器认为本地缓存可以使用,不会去请求服务端
        设置本地缓存的相应Header:
            ①Pragma:HTTP1.0时代的遗留产物该字段被设置为no-cache时,会告知浏览器禁用本地缓存,即每次都想服务器发送请求
            ②Cache-Control:HTTP1.1,告知浏览器缓存过期的时间间隔而不是时刻,不影响缓存管理,no-store:禁止浏览器缓存响应, no-cache:不允许直接使用本地缓存,先发起请求和服务器协商, max-age=delta-seconds:告知浏览器该响应本地缓存有效的最长期限,以秒为单位
            ③Expires:HTTP1.0时代用来启用本地缓存的字段,是一个时间,告诉浏览器缓存实现的时刻,如果还没有到,表明缓存有效,无需发送请求。浏览器与服务器的时间无法保持一致,如果时间差距大,就会影响缓存结果
        适合本地缓存的内容:不变的图像,如logo,图标等。 js,css静态文件。 可下载的内容,媒体文件
     协商缓存:当浏览器没有命中本地缓存,如本地缓存过期或者响应中声明不允许直接使用本地缓存,那么浏览器很定挥发期服务端请求,服务端会验证数据是否修改,如果没有通知浏览器使用本地缓存。
        相关Header:
            Last-Modified:通知浏览器资源的最后修改时间
            If-Modified-Since:得到资源的最后修改时间后,会将这个信息通过If-Modified-Since提交到服务器做检查,如果没有修改,返回304状态码
            ETag:HTTP1.1推出,文件的指纹标识符,如果文件内容修改,指纹会改变
            If-None-Match:本地缓存失效,会携带此值去请求服务端,服务端判断该资源是否改变,如果没有改变,直接使用本地缓存,返回304
        适合协商缓存的文件:HTML文件,经常替换的图片,经常修改的js,css文件
        不适合做缓存的内容:用户隐私等敏感数据,经常改变的api数据接口

        Nginx配置缓存策略:
        本地缓存配置:
            add_header指令:添加状态码为2xx和3xx的响应头信息
            expires : 设置过期时间
        设置协商缓存:
            ETag:指定签名
        前端代码和资源的压缩
            优势:让资源文件更小,加快文件在网络中的传输,让网页更快的展现,降低带宽和流量开销
            压缩方式:
            JavaScript压缩的原理一般是去掉多余的空格和回车、替换长变量名、简化一些代码写法等,压缩工具:UglifyJS, YUICompressor,Closure Compiler
            CSS压缩:与JavaScript类似,工具:YUI Compressor , CSS Compressor
            HTML 压缩:不建议使用,会破坏代码结构
            图片压缩:工具:tinyPng,JepgMini
            GZip压缩: gzip on|off是否开启,gzip_buffers 32 4k|16 8k缓冲,gzip_comp_level压缩等级(级别越高,压的越小,越浪费CPU计算资源)

(5)前端优化之CDN加速

(1)什么是CDN?
            Content Delivery Network,内容分发网络,尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,是内容传输的更快、更稳定。在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络。
            CDN系统能够实时的根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上
        (2)使用CDN的优势
            1。本地Cache加速,提高了企业站点的访问速度
            2.跨运营商的网络加速,保证不同网络的用户都得到良好的访问质量
            3.远程访问用户根据DNS负载均衡及数只能自动选择Cache服务器
            4.自动生成服务器的远程Mirror(镜像)cache服务器,远程用户访问时从cache服务器上读取数据,减少远程访问的带宽、分担网络流量,减轻原站点web服务器负载等功能
            5.广泛分布的CDN节点加上节点之间的冗长机制,可以有效地预防黑客入侵
        (3)CDN的工作原理
            传统访问:用户在浏览器输入域名发起请求->解析域名获取服务器IP地址->根据IP地址找到对应的服务器->服务器响应并返回数据
            CDN访问:用户发起请求-->智能DNS的解析(根据IP判断地理位置、接入网类型、选择路由最短和负载最轻的服务器)-->取得缓存服务器IP-->把内容返回给用户(如果缓存中有)-->向源站发起请求-->将结果返回给用户-->将结果存入缓存服务器
        (4)CDN的适用场景
            1.站点或者应用中大量静态资源的加速分发,例如:CSS、JS、图片和HTML
            2.大文件下载
            3.直播网站
      (5)  CDN的实现
            1.BAT都有提供CDN服务
            2.可用LVS做4层负载均衡
            3.可用Nginx、Varnish、Squid、Apache TrafficServer做7层负载均衡和cache

(6)动态语言静态化
        将现有PHP等动态语言的逻辑代码生成为静态HTML文件,用户访问动态脚本重定向到静态HTML文件的过程
        对实时性要求不高的页面
        原因:
            1.动态脚本通常会做逻辑计算和数据查询,访问量越大,服务器压力越大
            2.访问量大时可能会造成CPU负载过高,数据库服务器压力过大
            3.静态化可以减低逻辑处理压力,降低数据库服务器查询压力
        实现方式:
            1.使用模板引擎,可以使用Smarty的缓存机制生成静态HTML缓存文件
            2.利用ob系列的函数

(7)服务端优化之消息队列处理
            1.消息队列方式
                场景说明:用户注册后,需要发注册邮件和注册短信
                解决:将注册信息写入数据库成功后,将成功信息写入队列,此时直接返回成功给用户,写入队列的时间非常短,可以忽略不计,然后异步发送邮件和短信
            2.应用解耦
                场景说明:用户下单后,订单系统需要通知库存系统。假如库存系统无法访问,则订单减库存将失败,从而导致订单失败,订单系统与库存系统耦合
                解决:引用队列,用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功,订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作
            3.流量消锋
                场景说明:秒杀活动,流量瞬时激增,服务器压力大
                解决:用户发起请求,服务器接收后,先写入消息队列。假如消息队列长度超过最大值,则直接报错或提示用户。后续程序读取消息队列再做处理。控制请求量,缓解高流量
            4.日志处理
                场景说明:解决大量日志的传输
                解决:日志采集程序将程序写入消息队列,然后通过日志处理程序的订阅消费日志
            5.消息通讯:
                场景说明:聊天室
                解决:多个客户端订阅统一主题,进行消息发布和接收
            6.常见消息队列产品:Kafka、ActiveMQ、ZeroMQ、RabbitMQ、Redis等

(8)服务端优化之并发处理

1.接口的并发请求
            curl_multi_init

2.PHP的Swoole扩展
            PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询

(9)数据库优化之数据库缓存层优化
    1.什么是数据库缓存?
    答:MySQL等一些常见的关系型数据库的数据都存储在磁盘当中,在高并发场景下,业务应用对MySQL产生的增、删、改、查的操作造成巨大的I/O开销和查询压力,这无疑对数据库和服务器都是一种巨大的压力,为了解决此类问题,缓存数据应运而生
    1)极大地解决数据库服务器的压力
    2)提高应用数据的响应速度
    常见的缓存形式:内存缓存,文件缓存
    2.为什么要使用缓存?
    答:缓存数据是为了让客户端很少甚至不访问数据库服务器进行数据的查询,高并发下,能最大程度地降低对数据库服务器的访问压力
    用户请求-->数据查询-->连接数据库服务器并查询数据-->将数据缓存起来-->显示给客户端
    用户再次请求或者新用户访问-->数据查询-->直接从缓存中获取数据-->显示给客户端
    缓存需要考虑的内容:
        缓存方式的选择
        缓存场景的选择
        缓存数据的实时性
        缓存数据的稳定性
    3.使用MySQL数据库查询缓存
        query_cache_type为1时,可关闭查询缓存
        query_cache_type为2时,可按需使用查询缓存
        query_cache_size默认为0,表示为查询缓存预留的内存为0
        FLUSH QUERY CACHE//清理查询缓存内存碎片
        RESET QUERY CACHE// 从查询缓存中移除所有查询
        FLUSH TABLES // 关闭所有打开的表,同时将会清空查询缓存中的内容
    4.使用Memcache缓存
        对于大型站点,如果没有中间缓存层,当流量打入数据库层时,即便有之前的几层为我们挡住一部分流量,但是在大并发的情况下,还是会有大量请求涌入数据库层,这样对于数据库服务器的压力冲击很大,响应速度也会下降,因此添加中间缓存层很有必要
        Memcache是一套分布式的高速缓存系统,提升网站访问速度,对于一些大型的、需要频繁访问数据库的网站访问速度提升效果显著    
        工作原理:Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,他能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。是将数据调用到内存,然后从内存中读取,从而大大提高读取速度
        工作流程:先检查客户端的请求数据是否在memcache中,如果有,请求数据返回,不对数据库进行操作;如果没有,就先去查询数据库,把数据库中读取的数据返回给客户端,同时把数据缓存一份到memcache中
        方法: 获取:get(key)  设置:set(key,val,expire)  删除:delete(key)
    5.使用Redis缓存
         与Memcache的区别:
            1)性能相差不大,Redis在2.0版本增加了VM特性,突破物理内存的限制。Memcache可以修改最大可用内存,采用LRU算法
            2)Redis,依赖客户端来实现分布式读写。Memcache本身没有数据冗余机制
            3)Redis支持快照、AOF,依赖快照进行持久化,AOF增强了可靠性的同时,对性能有所影响
            4)Memcache不支持持久化,通常做缓存,提升性能;Memcache在并发场景下,用cas保证一致性,Redis事物支持比较弱,只能保证事物中的每个操作连续执行
            5)Redis支持多种类的数据类型
            6)Redis用于数据量较小的高性能操作和运算上
            7)Memcache用于在动态系统中减少数据库负载,提升性能;适合做缓存

(10)数据库优化之MySQL数据库层优化
        优化方向:
            1.数据表数据类型优化
            2.索引优化
            3.SQL语句的优化
            4.存储引擎的优化
            5.数据表结构设计的优化
            6.数据库服务器架构的优化:①主从复制②读写分离③双主热备④负载均衡

(11)Web服务器优化

七层负载均衡的实现
    基于URL等应用层信息的负载均衡
    Nginx的proxy是它的很强大的功能,实现了七层负载均衡
        功能强大,性能卓越,运行稳定
        配置简单灵活
        能够自动剔除工作不正常的后端服务器
        上传文件使用异步模式
        支持多种分配策略,可以分配权重,分配方式灵活
    内置策略:IP Hash、加权轮询
        加权轮询策略:首先将请求都分给高权重的机器,知道该机器的权值降到了比其他机器低,才开始将请求分给下一个高权重的机器,当所有后端机器都down掉时,Nginx会立即将所有机器的标志位清成初始状态,以避免造成所有的机器都处在timeout的状态
        IP Hash策略:Nginx内置的另一个负载均衡的策略,流程和轮询很类似,只是其中的算法和具体的策略有些变化
        IP Hash算法是一种变相的轮询算法

扩展策略:fair策略、通用hash、一致性hash
        fair策略:根据后端服务器的响应时间判断负载情况,从中选出负载最轻的机器进行分流
        通用hash,一致性hash策略:通用hash比较简单,,可以以Nginx内置的变量为可以进行hash,一致性hash采用了Nginx内置的一致性hash环,支持memcache

四层负载均衡的实现
    通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器
    LVS实现服务器集群负载均衡有三种方式,NAT,DR和TUN

如何解决网站大流量和高并发问题?相关推荐

  1. PHP解决网站大流量与高并发

    1:硬件方面 普通的一个p4的服务器每天最多能支持大约10万左右的IP,如果访问量超过10W那么需要专用的服务器才能解决,如果硬件不给力 软件怎么优化都是于事无补的.主要影响服务器的速度 有:网络-硬 ...

  2. PHP如何解决网站大流量与高并发

    首先,确认服务器硬件是否足够支持当前的流量. 普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大, 那么必须首先配置一台更高性能的专用服务器才能解决问题 ,否则怎么优化都不可能彻 ...

  3. 大流量和高并发应对手段总结

    大流量和高并发的常规应对手段 扩容.动静分离.缓存.服务降级和限流. 限流的常用算法和实践思路 目前主流的算法主要有三种:令牌桶算法.漏桶算法和计数器算法. 令牌桶算法:主要限制流量的流入速率,允许出 ...

  4. java 大流量高并发_【BAT面试题】如何应对大流量、高并发??

    这是一道BAT大厂的面试题 所谓高并发指的是:在同时或极短时间内,有大量的请求到达服务端,每个请求都需要服务端耗费资源进行处理,并做出相应的反馈. 常用的高并发处理的思路与手段 从服务端视角看高并发 ...

  5. python php web 大流量_PHP解决网站大数据大流量与高并发

    1:硬件方面 普通的一个p4的服务器每天最多能支持大约10万左右的IP,如果访问量超过10W那么需要专用的服务器才能解决,如果硬件不给力 软件怎么优化都是于事无补的.主要影响服务器的速度 有:网络-硬 ...

  6. mysql高并发和大流量_高并发-高并发和大流量解决方案

    高并发架构相关概念 并发 并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,并且这几个程序都是在同一个处理机上运行,担任一个时刻点上只有一个程序在处理机上运行. 我们所说的 ...

  7. PHP网站如何解决大流量与高并发的问题

    第一,配置高性能服务器 普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大, 那么必须首先配置一台更高性能的专用服务器才能解决问题 ,否则怎么优化都不可能彻底解决性能问题. 第二 ...

  8. 实战!如何从零搭建10万级 QPS 大流量、高并发优惠券系统

    动手点关注 干货不迷路 

  9. 大型技术网站的技术( 高并发、大数据、高可用、分布式....)(一)

    面对高并发.大流量.高可用.海量数据.用户分布广泛.网络情况复杂这类网站系统我们如何应对??? 第一阶段   一台服务器不行就上多台服务器    1.应用程序与数据服务分离        将应用程序. ...

最新文章

  1. 字符串对象转数组对象_js对象转数组的方法 js怎么将数组对象转变成字符串
  2. PyQt5 技术篇-设置QComboBox下拉框默认值,获取下拉框当前选择的内容
  3. AR Software
  4. ubuntu-18.04 修改用户名密码
  5. Ant Design Vue 表格数据按树型展示
  6. 省选专练 【BZOJ4773】负环
  7. 设定谷歌为默认浏览器
  8. bboss v5.5.3 发布,Elasticsearch Rest Client
  9. 个人php源码,php个人发卡平台源码 v1.4 免费版
  10. 起点中文网字体反爬注意事项
  11. 合工大计算机系汪教授,合肥工业大学计算机与信息学院导师介绍:洪日昌
  12. 成为指弹更好的吉他手必做的10件事
  13. 什么因素影响无刷马达绕线机的精度
  14. idea 控制台搜索快捷键
  15. 树莓派控制3631AS数码管 驱动 python程序 共阴数码管|徐奥雯编写|XUAOWEN
  16. 经纬恒润受邀出席2021世界智能网联汽车大会
  17. 专业的在线考试系统,快考题,全面聚集多场景考试业务
  18. gridview纯图片九宫图展示
  19. 2018中国十大品牌在线英语培训机构排行榜暴风来袭
  20. windows phone:WP8中的地图和导航

热门文章

  1. CVPR 2022 | 惊呆了!只用一张图+相机走位,AI就能脑补周围环境!
  2. Unity实现轻量化答题软件,随机题库,非SQL数据库加载形式
  3. hal库串口dma卡死_STM32 HAL库 串口DMA发送完成中断
  4. Win10安装masmplus的摸爬滚打
  5. java折木棍_蓝桥杯算法训练 Sticks(木棍)问题(JAVA)
  6. Xshell的舒服配色方案,否则蓝色看不清
  7. iOS 内购的最新讲解
  8. go-micro 安装
  9. Tomcat 2022-7-27
  10. 【Linux】循序渐进学运维-服务篇-与tomcat相关的概念