《架构师训练营》第四周总结
1、互联网系统架构面临的挑战
与传统的企业应用系统相比,大型互联网系统常常面临以下挑战:
高并发、大流量:需要面对高并发的用户大流量的访问。
高可用:系统需要 7 * 24 小时不间断的提供服务。
海量数据:需要存储、管理海量数据,需要使用大量服务器。
用户分布广泛,网络情况复杂:许多大型互联网应用为全球用户提供服务,用户分布范围广,网络环境千差万别。
安全环境恶劣:互联网具有开放性,使用互联网应用容易收到攻击。
需求快速变更,发布频繁:互联网应用为了快速适应市场,满足用户需求,发布频率极高。
渐进式发展:大型互联网网站往往都是从小网站开始,逐渐发展起来的。
2、应对高并发的挑战 - 垂直伸缩
垂直伸缩的方案总结
通过升级硬件和网络吞吐能力可以实现垂直伸缩。由于垂直伸缩不需要改变应用架构,所以通常被认为是最简单的短期伸缩性方案。
通过使用 RAID(独立冗余磁盘阵列)增加 I/O 的吞吐能力。
通过切换到 SSD 改善 I/O 的访问速度。
通过增加内存减少 I/O 操作。
通过升级网络接口或者增加网络接口提高网络吞吐能力。
更新服务器使用更多处理器或者更高超线程。
垂直伸缩的缺点
达到某个程度后,增加计算能力需要更多的花费。
垂直伸缩有物理极限。
操作系统设计或者应用系统自身制约着垂直伸缩只能达到某个点。
3、应对高并发的挑战 - 水平伸缩
水平伸缩是一类通过增加服务器提升计算能力的架构方法。
水平伸缩可以克服垂直伸缩带来的单位计算成本随计算能力增加二迅速飙升的问题。
水平伸缩不会向垂直伸缩那样遭遇到单台服务器的极限。
4、架构优化方案
应用数据分离
挑战:当单台服务器逐渐不能满足需求,越来越多的用户访问导致性能越来越查 ,越来越多的数据导致数据存储空间不足。
解决方案:将应用和数据分离,分别部署到不同的服务器上面。不同特性的服务器承担不同的服务器角色。
使用缓存改善系统性能
挑战:数据库压力太大导致访问延迟,进而影响整个网站性能。
解决方案:使用缓存。根据二八定律,80%的业务访问集中在 20% 的数据上,因此可以将一部分数据缓存在内存中,以减少数据库的访问压力,从而提高整个网站的数据访问速度,改善数据库的写入性能。
网站可以使用的缓存可以氛围两种:缓存在应用服务器上的本地缓存和缓存在专门的分布式缓存服务器上的远程缓存。
本地缓存访问速度更快,但是收到应用服务器内存的限制,其缓存数据量有限。
远程分布式缓存可以使用集群的方式,部署大内存的服务器作为专门的缓存服务器,理论上可以做到不馊内存容量限制的缓存服务。
使用应用服务器集群改善系统的并发能力
挑战:单一应用服务器能够处理的请求链接有限,在网站访问高峰期,应用服务器称为整个网站的瓶颈。
解决方案:通过增加服务器的方式改善负载压力,同样的方式持续增加服务器不断改善性能,从而实现系统的伸缩性。通过负载均衡调度服务器,可以将来自用户浏览器的请求分发到应用服务器集群中的任何一台服务器上。
数据库读写分离
挑战:使用缓存后,仍会有部分读操作(缓存访问不命中,缓存过期)和全部的写操作需要访问数据库,网站达到一定规模后,数据库因为负载压力过高而成为网站的瓶颈。
解决方案:通过配置两台数据库的主从关系,可以将一台数据库服务器的数据更新同步到另一台服务器上。网站利用此功能实现数据库读写分离,从而改善数据库负载压力。
使用反向代理和 CDN 加速网站相应
挑战:不同的网络环境,不同地区的用户访问网站时,速度差别特别大。
解决方案:使用 CDN 和反响代理。CDN 和反向代理的基本原理都是缓存,区别在于 :
CDN 部署在网络提供商的机房,使用户在请求网站服务时,可以从距离自己最近的网络提供商机房获取数据;
反响代理则部署在网站的中心机房,当用户请求到达中心机房后,首先访问的服务器是方向代理服务器,如果反向代理服务器中缓存着用户请求的资源,则直接返回给用户。
使用 CDN 和反向代理的目的都是尽早的返回数据给用户。
使用分布式文件系统和分布式数据库系统
使用 NoSQL 和搜索引擎
挑战:随着网站业务越来越复杂,对数据存储和检索的需求也越来越复杂。
解决方案:采用非关系数据库技术(如NoSQL 和非数据库查询技术(如搜索引擎)。应用服务器通过一个统一的数据访问模块访问各种数据,减轻应用程序管理诸多数据源的麻烦。
业务拆分
挑战:大型网站的业务场景日益复杂。
解决方案:通过分而治之的手段将整个网站业务分成不同的产品线。在技术上,也会根据产品线划分,将一个网站拆分成许多不同的应用,每个应用独立部署维护。应用之间可以通过一个超链接建立关系,也可以通过消息队列进行数据分发,或者访问同一个数据库存储系统来构成一个管理的完整系统。
微服务和中台化
大数据和智能化
5、架构模式
分层
将系统在横向维度上切分成几个部分,每个部分负责一部分相对比较单一的职责,然后通过上层对下层的依赖和调用组成一个完整的系统。
分割
如果说分层是将软件在横向方面进行切分,那么分割就是在钟祥方面对软件进行切分。
系统越大,功能越复杂,服务器和数据树立的种类也越多,将这些不同的功能和芙蕖分割开来,包装成高内局低耦合的模块但愿,一方面有助于软件的开发和维护;另一方面,便于不同模块的分布式部署,提高网站的并发处理能力和功能扩展能力。
分布式
对于大型网站,分层和分割的一个主要目的是为了切分后的模块便于分布式部署,即将不同木块部署在不同的服务器上,通过远程调用协同工作。
分布式意味着解决同样的问题可以使用更多的计算机,计算机越多,CPU、内存、存储资源也就越多,能够处理的并发访问和数据量就越大。
分布式应用和服务。
分步睡静态资源。
分部署数据和存储。
分布式计算。
集群
使用分布式虽然已经将分层和分割后的模块独立部署,但是对于用户访问集中的模块,还需要将独立部署的服务器集群化,即多台服务器部署相同应用构成一个集群,通过负载均衡设备共同对外提供服务。
缓存
缓存就是将数据存放在距离计算最近的位置以加快处理速度。缓存是改善软件性能的第一手段,现代 CPU 越来越快的一个重要因素就是使用了更多的缓存,在复杂的软件设计中,缓存几乎无处不在。
CDN
反向代理
本地缓存
远程缓存
异步
计算机软件发展的一个重要目标和驱动力是降低软件的耦合性。事物之间越少直接关系,那么就越少被彼此影响,越可以独立发展。
大型网站架构中,系统解耦合的手段中处理分层、分割、分布式之外,另一个重要的手段是异步,将一个业务操作分成多个阶段,每个阶段之间通过共享数据而不是直接调用的方法进行协作。
提高系统可用性。
加快网站相应速度。
消除并发访问高峰。
冗余
服务器宕机是必然时间,要向保证在服务器宕机的情况下依然可以继续服务,数据不会丢失,就需要一定程度的服务器冗余运行,数据冗余备份。
自动化
安全
进行身份认证。
对网络通讯进行加密,对服务器上存储的敏感数据进行加密。
使用验证码识别机器人程序。
进行编码转换等相应处理,防止 XSS 攻击 SQL 注入。
对垃圾信息、敏感信息进行过滤。
对转账等重要操作根据交易模式和交易信息进行风险控制。
版权声明: 本文为 InfoQ 作者【黑】的原创文章。
原文链接:【http://xie.infoq.cn/article/5ffc2861c93b10d57fcacb950】。文章转载请联系作者。
评论