赞
踩
学习源为B站的学习视频:https://www.bilibili.com/video/BV147411x7p1?p=268
本文为学习总结。如果错误请指正。仅供参考。拓宽思维。后续扩展深度学习后续会学到了再分享。
首先由浅入深。高并发的由来都是现有从单机系统演变而来。单机系统无法承载高并发而导致的。
例如一个最简单的单机系统,当他的承载能力不足以应付的时候才需要扩展集群等一系列提升方案。
单机的承载能力由什么决定的? (BS为例)
程序都是靠 多线程 来处理请求的 -- 每个请求消耗的时间
吞吐量: QPS = 线程数/请求秒数 以此为基础可以算出服务器的最大承载用户数
(当超出最大承载数时。请求会等待/阻塞等问题,甚至服务瘫痪)
解决方案(主体思路 1.增加线程数 2.缩短请求数时间 提高吞吐量达到提高承载量的效果):
1. 升级硬件 (简单粗暴,但是有上限)
2. 分布式 (多台服务器一起处理。不过多服务器协同会牺牲一定的通信效率。且分布越多牺牲越多)
分布式 : 多台服务器完成一台服务器做的事,就是分布式。
功能的拆分。部署在不同的服务器上,用网络协议进行请求(有一定的性能损耗,服务器越多损耗越大)。
3. 系统性能的优化 (缓存的使用)
服务端缓存 : 我们可以使用自带的缓存或者redis。进行结果的缓存。(降低数据库压力)
当再有相同的请求。进来时直接在缓存中取。减少数据库压力,提升吞吐量。
(缓存是在内存中的。内存读取速度 > 硬盘,快很多。但是硬件是有上限的。如果本地的缓存不足以支撑。可以配置分布式缓存服务器。用多个服务器的内存来处理。或者使用集群来优化)
当然在程序中还有很多地方可以增加缓存的。例如客户端缓存。等。都可以大大提升效率
但是缓存也有弊端: 1.持久化的问题。 2.缓存的时效性。当数据库数据改变时。缓存数据的实时同步。
4. 集群 (集群的负载均衡)
一般来说在一个项目中。
文件服务器 一般不会是瓶颈。可以通过阿里oss 这种方式托管。
数据库服务器 可能会有瓶颈。不过可以通过读写分离。配置升级等方式优化。
缓存服务器 一般也不会是瓶颈。 可以通过分布或者扩容内存。或者第三方缓存等方式
一般来说 应用服务器 会出现瓶颈。高并发下大数量的请求。会需要应用服务器来处理。
集群就是一种解决思路:
非集群: 应用服务器直接接受请求处理。返回。
集群: 负载均衡服务器接受请求。均衡分发给下面的应用服务器再处理返回。
(我之前总会把集群和分布式弄混淆这里总结下两者的区别:
集群:个人理解相当于一种扩容。用多个服务器。处理单一功能。增加的是体量。多个服务器之间不通信
分布式: 将一个完整的业务流程 例如:应用程序,数据库,文件 拆分为模块。每个模块单独处理单一功能。分布式更像一种解题思路,分步骤的做每一个功能的任务。增加的是步骤,多个服务器之间存在通信
学习视频中说 广义上集群属于分布式,这个就看你怎么理解了。。我感觉不太一样。我认为服务器间是否存在通信是界定的标准)
当集群配置完后。会有多个服务。这时候对于用户来说不知道该访问哪个。这时候就需要一个分发任务的负载服务器(nginx)
: 集群+ nginx 负载 Demo => https://blog.csdn.net/weixin_43925876/article/details/108201172
(nginx的好处: 可以自定义策略。 坏处: 没有就近原则)
除了Nginx 可以进行负载之外还有 DNS负载均衡:
1)配置多个独立ip 对外提供服务 2) DNS服务器配置多个IP 3) DNS解析时转发
(当用户访问任意网址的时候。需要拿着域名例如www.baidu.com 去DNS 服务请求。dns服务器会返回百度的真实ip地址,再去请求服务)
优势:高效(就近原则,会默认解析地理位置最靠近的ip)
劣势:
1)只能轮询(不能配置自定的一些策略。不够灵活)
2)独立IP价格高昂
3) 错误发现缺失,如果某ip的服务挂了任务还是会发配到指定ip
还有硬件的负载均衡:
例如F5、Array、Netscale 等 硬件+打包 不过
优势:性能高,稳定好,厂商支持
劣势:价格高昂,扩展性差。
软件负载均衡(更能提现程序员核心竞争力):
1) LVS - Linux Vitual Server (基于4层协议)
轮询转发(不能根据报文信息转发),更底层更高效(好的可以达到硬件负载的60%),配置很难
2) HAProxy -- 既可以4层 也可以 7层 (http协议获取http信息 => 所谓协议只是一种格式。可以传递信息,掌握了协议的格式可以获取到想要传递的header,body等) 7层可以更灵活。配置也相对较难。
3) Nginx 上面demo有简单的应用配置
目前主要支持 : HTTP,HTTPS,EMAIL 这些协议。其余协议会比较麻烦
主要支持策略:
轮询(默认) , weight (权重) 可配置的分发的比例。当集群的服务器配置不一时。高性能的服务器可以配置高权重例如 weight =8
ip-hash 会将某ip的存储。后续由最初响应的服务器。一直响应这个ip的请求(劣势:当以公司为单位的同一ip会造成服务器压力大)
fair 会跟和服务器的响应速度。来分配请求。自适应。保证服务器压力差不多
url-hash 和ip-hash类似。不过前者存的ip。后者是url地址。当请求的同一url时。由同一服务器进行处理。使用场景较少。
在我们的2台电脑/服务器 进行数据传输时。可以划分为这7个层。越往上越靠近应用。越往下越底层
4层协议 传输层指的就是tcp/ip 协议通信主要通过获取(ip + port)。
应用层包含 http 协议 SMAP协议等。 7层协议会更灵活。应为可以解析http协议中的内容。拥有更多的可操作性。
5) 数据库性能的提升 (读写分离)
数据库二八理论:80%的请求聚集在20%的数据上,80%的请求都是查询 20%是增删改
读写分离的本质就是 单一数据服务器。只做一种操作。单一执行查询,单一执行修改。数据服务间会有数据同步。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。