怎么解决高并发大流量问题?下面本篇文章就来给大家分享下高并发大流量 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?
节点:可以理解为真实服务器的镜像。
全称是 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 模型:
1234 | - add:添加一个socket到reactor- set:修改socket对应的事件,如可读可写- del:从reactor中移除- callback:事件发生后回掉指定的函数 |
---|
nginx:多线程 Reactor
swoole:多线程 Reactor + 多进程 worker
1. 什么是数据库缓存
mysql 等一些常见的关系型数据库的数据都存储在磁盘当中,在高并发场景下,业务应用对 mysql 产生的增删,改,查的操作造成巨大的 I/O 开销和查询压力,这无疑对数据库和服务器都是一种巨大的压力,为了解决此类问题,缓存数据的概念应运而生。
常见的缓存形式:内存缓存和文件缓存
2. 为什么要使用数据库缓存
3. 使用 mysql 查询缓存
1 | 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 的区别:
源码附件已经打包好上传到百度云了,大家自行下载即可~
链接: https://pan.baidu.com/s/14G-bpVthImHD4eosZUNSFA?pwd=yu27
提取码: yu27
百度云链接不稳定,随时可能会失效,大家抓紧保存哈。
如果百度云链接失效了的话,请留言告诉我,我看到后会及时更新~
码云地址: http://github.crmeb.net/u/defu
Github 地址: http://github.crmeb.net/u/defu
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。