🔉:   On Septemper. 21, 2022, Mr. Hunter Xu will join the University of New South Wales, as a Software Engineer in the School of Computer and Enigeering! 🎉

Distributed Systems & Cloud Computing with Java

Subject
Cloud Computing
Institution (Click to course page)
Udemy
Course Link
Plan for
2022
Status
To do
Completed at
Lab
Ass
Lec/Slide
Rating
Comment/Note
Level
Textbook
一个高性能,高并发,高可用的系统是如何演变来的
PHP / 44 / 0 / 发布于 3个月前 文章来自:PHP自学中心  大型电商系统或社交网站的系统架构从一开始就没有设计具有完整的高性能,高可用性,高可伸缩性等特性的。它是随着用户的增加和业务功能的扩展,逐步演变和完善起来的。 在此过程中,开发模式,技术体系结构和设计思想都发生了很大的变化。因此,随着业务的扩展,成熟的系统体系结构将逐渐得到改善。 例如淘宝,解决海量商品信息的搜索,订购和支付问题;例如腾讯,解决了亿万用户的实时消息传输。百度处理大量搜索请求。 他们都有各自的业务特性,系统架构也有所不同。不过我们也可以从这些不同的网站背景中,找出其中广泛运用在这些系统里共用的技术手段   下面我们可以通过介绍大型网站系统的演化过程,来认识这些技术。 1 最开始的网站架构 一个网站的最初开始,每个开发者都接触过。每个应用程序,数据库,静态文件等都会部署在一个服务器里。流量基本很小的网站,比如个人网站,博客等就可以这样部署。如图:   2 应用、数据、文件分离 业务的扩展与需要,访问流量多了一点,一台服务器已经不能满足性能需求,这个时候我们就要把应用程序,数据库,文件等各自部署到独立的服务器上各自管理。并且根据用途配置不同的硬件。 这样就达到了满足性能需求的最佳效果了。基本小型企业,业务每天流量不到1w的都可以算是最佳的。如图:   3 缓存改善网站性能 每个开发者在遇到性能瓶颈或者硬件性能有效的时候基本都会想到用缓存改善网站性能,经常用到的Nosql如: Memcached, Redis 。 使用缓存主要源于热点数据的存在,为了减少热点数据的访问路径与提高用户体验,我们可以对热点数据进行缓存,提高网站性能。 缓存实现的方式有:本地缓存,分布式缓存,还有 CDN、反向代理。 1 本地缓存:速度快,根据本地空间缓存数据量。 2 分布式缓存:Memcached、Redis   4 使用集群改善应用服务器性能 集群就是同一个业务,部署在多个服务器上(不同的服务器运行同样的代码,干同一件事),那我们就可以用负载均衡来解决相应的问题,提高性能。 方式:常用的负载均衡技术硬件的有 F5,价格比较贵,软件的有 LVS、Nginx、HAProxy。 LVS 是四层负载均衡,根据目标地址和端口选择内部服务器,Nginx 和 HAProxy 是七层负载均衡,可以根据报文内容选择内部服务器。 因此 LVS 分发路径优于 Nginx 和 HAProxy,性能要高。而 Nginx 和 HAProxy 则更具配置性,如可以用来做动静分离,比如根据请求报文特征,来选择静态资源服务器还是应用服务器。 应用服务器是网站的入口,会承载大量的请求,我们就在应用服务器前面部署负载均衡服务器调度用户请求,根据分发策略将请求分发到多个应用服务器节点。如图:   5 数据库读写分离和分库分表 这个相信大家都听过,但是会不会就不知道了。详细可以查看这篇文章: 【进阶】Mysql分库分表方案,如何分,怎样分? 分库分表分为水平切分和垂直切分两种。 1 水平切分是对一个数据库特大的表进行拆分,例如用户表。 2 垂直切分则是根据业务的不同来切分,比如用户业务、商品业务相关的表放在不同的数据库中。 一个网站的流量的增加,也就是用户访问量的增加,访问量的增加则数据库就会成为最大的瓶颈。 然而改善数据库的性能,我们常用的手段是对数据库进行读写分离和分库分表。实现数据同步从而改善数据库性能。如图   6 使用分布式文件系统 什么是分布式文件系统:分布式文件系统的全部不在同一台计算机,而是分散布置在多台计算机上。所以多个分散的小文件系统组合在一起,形成一个完整的文件系统。 分布式的特点:分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。 这里使用到分布式文件系统,想想就知道了,用户每天都在增加,业务量越来越大,而产生的文件越来越多,单台的文件服务器已经不能满足需求,这时就需要分布式文件系统的支撑。常用的分布式文件系统有 GFS、HDFS、TFS。具体就不介绍了。看图:   7 使用 CDN ...
一个高性能,高并发,高可用的系统是如何演变来的
关于"高性能、高并发、高可用"的问题解决方案
1)高并发高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一。当多个进程或线程同时(或着说在同一段时间内)访问同一资源时会产生并发问题,因此需要通过专门的设计来保证 系统能够同时(并发)正确处理多个请求。2)高性能 简单地说,高性能(High Performance)就是指程序 处理速度快、耗能少 。与性能相关的一些指标如下: 响应时间:系统对请求做出响应的时间。例如系统处理一个 HTTP 请求需要 200ms,这个 200ms 就是系统的响应时间。 吞吐量:单位时间内处理的请求数量。 TPS:每秒响应事务数。 并发用户数:同时承载能正常使用系统功能的用户数量。 高并发和高性能是紧密相关的,提高应用的性能,可以提高系统的并发能力。 应用性能优化时,对于计算密集型和 I/O 密集型还是有很大差别,需要分开来考虑。 水平扩展(Scale Out):只要增加服务器数量,就能线性扩充系统性能。 通常增加服务器资源(CPU、内存、服务器数量),大部分时候是可以提高应用的并发能力和性能 (前提是应用能够支持多任务并行计算和多服务器分布式计算才行)。但水平扩展对系统架构设计是有要求的,难点在于:如何在架构各层进行可水平扩展的设计。 高可用性(High Availability)通常用来描述一个系统经过专门的设计,从而减少停工时间,保证 服务的持续可用 。 如高可用性集群就是保证业务连续性的有效解决方案。 其实从缓存、消息队列到 CAS......很多看起来很牛逼的架构设计其实都来源于操作系统、体系结构。 这些底层的基础知识看似古老的技术是经过时间洗礼留下来的好东西。现在很多的新技术、框架看似非常厉害,实则不少都是新瓶装旧酒,每几年又会被淘汰一批。 什么是缓存? 在计算机中,缓存是存储数据的硬件或软件组件,以便可以更快地满足将来对该数据的请求。存储在缓存中的数据可能是之前计算结果,也可能是存储在其他位置的数据副本。 缓存本质来说是 用空间换时间的思想 ,它在计算机世界中无处不在, 比如 CPU 就自带 L1、L2、L3 Cache,这在一般应用开发中关注较少,但在一些实时系统、大规模计算模拟、图像处理等追求极致性能的领域,就特别注重编写缓存友好的代码。 什么是缓存友好? 简单来说,就是代码在访问数据的时候,尽量使用 缓存命中率高 的方式。 缓存为什么有效? 缓存之所以能够大幅提高系统的性能, 关键在于数据的访问具有局部性,也就是二八定律:"百分之八十的数据访问是集中在 20%
关于"高性能、高并发、高可用"的问题解决方案
服务高并发、高性能、高可用实现方案
高并发方面要求QPS 大于 10万;高性能方面要求请求延迟小于 100 ms;高可用方面要高于 99.99%    高并发是现在互联网分布式框架设计必须要考虑的因素之一,它是可以保证系统能同时并发处理很多请求,对于高并发来说,它的指标有:     1、响应时间:系统对进来的请求反应的时间,比如你打开一个页面需要1秒,那么这1秒就是响应时间     2、吞吐量:吞吐量指每秒能处理多少请求数量     3、每秒查询率(QPS,Queries Per Second):每秒响应请求数,和吞吐量差不多     4、并发用户数:同时承载正常使用系统功能的用户数量。例如一个即时通讯系统,同时在线量一定程度上代表了系统的并发用户数   提高QPS的架构策略      Redis、MQ、多线程     负载均衡:       高并发首选方案就是集群化部署,一台服务器承载的QPS有限,多台服务器叠加效果就会有明显提升。       集群化部署,就需要考虑如何将流量转发到服务器集群,这里就需要用到负载均衡,如LVS(Linux Virtual Server)和nginx。       常用的负载均衡算法有轮询法、随机法、源地址哈希法、加权轮询法、加权随机法、最小连接法等。       业务实战:对于千万级流量的秒杀业务,一台LVS扛不住流量洪峰,通常需要 10 台左右,其上面用DDNS(Dynamic DNS)做域名解析负载均衡。搭配高性能网卡,单台LVS能够提供百万以上并发能力。         注意, LVS 负责网络四层协议转发,无法按 HTTP 协议中的请求路径做负载均衡,所以还需要 Nginx            池化技术:       复用单个连接无法承载高并发,如果每次请求都新建连接、关闭连接,考虑到TCP的三次握手、四次挥手,需要花费大量开销。       池化技术的核心是资源的"预分配"和"循环利用",常用的池化技术有线程池、连接池、进程池、对象池、内存池、协程池。         连接池的几个重要参数:最小连接数、空闲连接数、最大连接数            流量漏斗(风控拦截):       以上的几种方式是正向方式提升系统QPS,我们也可以逆向思维,做减法,拦截非法请求,将核心能力留给正常业务请求。       互联网高并发流量并不都是纯净的,也有很多恶意流量(比如黑客攻击、恶意爬虫、黄牛、秒杀器等),我们需要设计流量拦截器,将哪些非法的、无资格的、低优先级的流量过滤掉(风控掉),减轻系统的并发压力。        拦截器分层:          网关和 WAF(Web Application Firewall,Web 应用防火墙)           采用封禁攻击者来源 IP、拒绝带有非法参数的请求、按来源 IP 限流、按用户 ID 限流等方法         风控分析。借助大数据能力分析订单等历史业务数据,对同ip多个账号下单、或者下单后支付时间过快等行为有效识别,并给账号打标记,提供给业务团队使用         下游的每个tomcat实例应用本地内存缓存化,将一些库存存储在本地一份,做前置校验。当然,为了尽量保持数据的一致性,有定时任务,从 Redis 中定时拉取最新的库存数据,并更新到本地内存缓存中         高性能指程序处理速度非常快,所占内存少,且CPU占用率低。高性能的指标经常和高并发的指标紧密相关,想要提升性能,那么就要提高系统并发能力,两者互相捆绑在一起。      有哪些因素会影响系统的性能?     业务代码的逻辑设计,算法实现是否高效、架构设计     业务系统CPU、内存、磁盘等性能     下游系统的性能     业务链路的长度     请求/响应数据包大小     用户网络环境   怎么样提高性能呢?     1、避免因为IO阻塞让CPU闲置,导致CPU的浪费。       当系统处理大量磁盘IO操作的时候,由于CPU和内存的速度远高于磁盘,可能导致CPU耗费太多时间等待磁盘返回处理的结果。对于这部分在IO上的开销,称为"iowait"。       磁盘有个性能指标:IOPS,即每秒读写次数,性能较好的固态硬盘,IOPS 大概在 3 万左右。对于秒杀系统,如果单节点QPS在10万,每次请求产生3条日志,那么日志的写入QPS在 30W/s,磁盘根本扛不住       Linux ...