• 技术文章 >头条

    深入探讨“高并发大流量”访问的解决思路和方案

    青灯夜游青灯夜游2022-05-11 16:28:35转载1044
    怎么解决高并发大流量问题?下面本篇文章就来给大家分享下高并发大流量web解决思路及方案,希望对大家有所帮助!

    相关视频课程推荐:《千万级数据并发解决方案(理论+实战)

    分享一些高并发面试题:15个PHP关于高并发的面试题(总结)

    高并发web架构相关概念


    高并发大流量web整体解决思路


    web服务器负载均衡


    负债均衡

    七层负载均衡实现:

    基于URL等应用层信息的负债均衡 ningx的proxy是它一个很强大的功能,实现了7层负载均衡,功能强大,性能卓越,运行稳定,配置简单灵活,能够自动剔除工作不正常的后端服务器,上传文件可以使用异步模式上传,支持多种分配策略,可以分配权重,分配方式灵活。

    nginx负载均衡策略

    1、IP Hash策略

    nginx内置的另一个负载均衡的策略,流程和轮询很相似,只是其中的算法和具体的策略有些变化,IP hash算法是一种变相的轮询算法

    2、加权轮训策略

    首先将请求都分给高权重的机器,直到该机器的权值降到了比其他机器低,才开始将请求分给下一个高权重的机器,当所有后端机器都down掉时,nginx会立即将所有机器的标志位清成初始状态,以避免造成所有的机器都处在timeout的状态

    3、fair策略

    根据后端服务器的响应时间判断负载情况,从中选出负载最轻的机器进行分流

    通用hash、一致性hash策略,通用hash比较简单,可以以nginx内置的变量为key进行hash,一致性hash采用了内置的一致性hash环,支持memcache

    四层负载均衡实现

    通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器

    lvs相关术语:

    lvs负载均衡三种方式:

    NAT:修改目标IP地址为后端的RealServer的IP地址

    DR:修改目标mac地址为后端的RealServer的mac地址

    TUNNEL:较少使用,常用于异地容灾

    四七层负载均衡优缺点

    四层比七层可以承载更大的并发量,使用大型站点小

    七层可以实现更为复杂的负载均衡控制,比如URL、基于session、动静分离等

    七层能够占用大量的CPU时间,承载的并发量

    cdn加速


    什么是cdn?

    节点:可以理解为真实服务器的镜像。

    全称是Content Delivery Network,即内容分发网络尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。

    在网络各处放置节点服务器所构成的现有的互联网基础之上的一层智能虚拟网络。

    cdn系统能够实时地根据网络流量和各节点的连接,负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。

    cdn的优势是什么?

    cdn的工作原理是什么?

    传统的访问:用户在浏览器输入域名发起请求,解析域名获取服务器ip地址,根据ip地址找到对应的服务器,服务器响应并返回数据。

    使用cdn访问:用户发起请求,智能dns的解析(根据ip判断地理位置,接入网类型,选择路由最短和负载最轻的服务器),取得缓存服务器ip,把内容返回给用户(如果缓存中有),向源站发起请求,将结果访问给用户,将结果存入缓存服务器。

    cdn的适用场景?

    站点或者应用中大量静态资源的加速分发,例如:css,js,图片和html

    cdn的实现方式?

    建立独立的图片服务器


    独立的必要性?

    为啥采用独立的域名?

    原因:同一域名下浏览器的并发连接数是有限制的,突破浏览器连接的限制,由于cookie的原因,对缓存不利,大部分web cache都只缓存不带cookie的请求,导致每次的图片请求都不能够命中cache

    独立后的问题?

    动态页面静态化


    相关概念:什么是动态语言静态化,为什么要静态化,静态化的实现方式。

    动态语言的并发处理


    什么是进程

    进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础

    进程是一个“执行中的程序”

    进程的状态的三态模型

    多道程序系统中,进程在处理器上交替运行,状态不断发生变化。

    什么是线程

    由于用户的并发请求,为每一个请求都创建一个进程显然是行不通的,从系统资源开销方面或是响应用户请求的效率方面来看。因此操作系统中线程的概念便被引进了。

    线程有时候被称为轻量级进程,是程序执行流的最小单元。

    线程是进程中的一个实体,是被系统独立调度和分配的基本单位,线程自己不拥有系统资源,只拥有一点儿运行中必不可少的资源但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

    一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。

    线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派cpu的基本单位指运行中的程序的调度单位。

    线程三状态

    什么是协程

    协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协称调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切的开销,可以不要加锁的访问全局变量,所以上下文的切换非常快。

    线程和进程的区别?

    线程和协程的区别?

    什么是多进程?

    同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这就是多进程 多开一个进程,多分配一份资源,进程间通讯不方便

    什么是多线程?

    线程就是把一个进程分为很多片,每一片都可以是一个独立的流程,与多进程的区别是只会使用一个进程的资源,线程间可以通讯

    多个概念之间的区别?

    同步阻塞模型

    多进程:最早的服务器端程序都是通过多进程,多线程来解决并发IO的问题一个请求创建一个进程,然后子进程进入循环同步堵塞地与客户端连接进行交互,收发处理数据。

    步骤

    多线程模式下可以创建子线程

    子线程/线程创建成功后进入while循环,阻塞在recv调用上,等待客户端向服务器发送数据

    收到数据以后服务器程序进行处理然后使用send向客户端发送响应

    当客户端连接关闭时,子进程/线程退出并销毁所有资源。主进程/线程会回收掉此子进程/线程。

    这中模型严重的依赖进程的数量解决并发问题。

    启动大量的进程会带来额外的进程调度消耗

    异步非阻塞模型

    现在各种高并发异步IO的服务器程序都是基于epoll实现的

    IO复用异步非阻塞程序使用经典的Reactor模型,Reactor顾名思义就是反应堆的意思,它本身不处理任何数据收发。只是可以监视一个socket句柄的事件变化。

    Reactor模型:

    - add:添加一个socket到reactor
    - set:修改socket对应的事件,如可读可写
    - del:从reactor中移除
    - callback:事件发生后回掉指定的函数

    nginx:多线程Reactor

    swoole:多线程Reactor+多进程worker

    php并发编程实战


    mysql缓存层的优化


    1.什么是数据库缓存

    mysql等一些常见的关系型数据库的数据都存储在磁盘当中,在高并发场景下,业务应用对mysql产生的增删,改,查的操作造成巨大的I/O开销和查询压力,这无疑对数据库和服务器都是一种巨大的压力,为了解决此类问题,缓存数据的概念应运而生。

    常见的缓存形式:内存缓存和文件缓存

    2.为什么要使用数据库缓存

    3.使用mysql查询缓存

    query_cahce_type=1 select SQL_NO_CACHE * from my_table where condition; query_cache_type=2 select SQL_CACHE * from my_table where condition; query_cache_size

    默认情况下query_cache_size为0,表示为查询缓存预留的内存为0,则无法使用查询缓存 SET GLOBAL query_cache_size = 134217728; 查询缓存可以看作是SQL文本和查询结果的映射 第二次查询的SQL和第一次查询的SQL完全相同,则会使用缓 SHOW STATUS LIKE ‘Qcache_hits’查看命中次数 表的结构和数据发生改变时,查询缓存中的数据不再有效

    情理缓存:

    4.使用Memcache缓存

    对于大型站点,如果没有中间缓存层,当流量打入数据库层时,即便有之前的几层为我们挡住一部分流量,但是在大并发的情况下,还是会有大量请求涌入数据库层,这样对于数据库服务器的压力冲击很大,响应速度也会下降,因此添加中间缓存层很有必要。

    memcache是一套分布式的高速缓存系统,由liveJournal的BrandFitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著。 memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像,视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存,然后从内存中读取,从而大大提高读取速度。

    工作流程:先检查客户端的请求数据是否在memcache中,如有,直接把请求数据返回,不再对数据库进行任何操作;如果请求的数据不在memcache中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中。

    通用缓存机制:用查询的方法名+参数作为查询时的key,value对中的key值

    5.使用Redis缓存

    与memcache的区别:

    mysql数据层的优化


    声明:本文转载于:github,如有侵犯,请联系admin@php.cn删除
    专题推荐:web 高并发
    上一篇:10个值得了解的 Chrome 插件,助你提高工作效率! 下一篇:12306抢票,极限并发带来的思考!
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• 20个不可错过的github前端开源项目,赶紧放入收藏夹!• 收藏这些vue项目性能优化方式,总有一天能用上!• 9个杀手级的PHP项目,快来收藏使用!• 10个值得了解的 Chrome 插件,助你提高工作效率!
    1/1

    PHP中文网