大型网站系统特点
高并发、大流量;
高可用;
海量数据;
用户分布广泛,网络情况复杂;
安全环境恶劣;
需求快速变更,发布频繁;
渐进式发展;
大型网站架构演化发展历程
网站架构模式
分层(横向切分)
①将大型的软件系统切分成不同的部分,便于分工合作,各层之间具有一定的独立性,如MVC就是一种典型的分层思想的应用。
②开发中应严格遵循分层架构的约束,禁止跨层调用以及逆向调用。
③大的分层结构还可以继续分层,如服务层可以细分为数据结构层(适配各种输入和输出的数据格式)和逻辑处理层。分割(纵向切分)
是指不同业务的分割:将不同的功能和服务分割,包装成高内聚低耦合的模块单元。分布式
概念:即将分层和分割后的不同模块部署在不同的服务器上,通过远程调用协同工作。分布式意味着可以使用更多的计算机完成同样的功能。
问题:由于服务调用通过网络,因此网络通信可能会影响系统性能;服务器宕机的概率提高,使系统可用性降低;在分布式环境中保持数据一致性非常困难,分布式事物也难以保证;导致网站依赖更加复杂,开发维护困难。
分类:分布式应用和服务,分布式静态资源,分布式数据和存储,分布式计算等集群
概念:是指多台服务器部署相同的应用构成一个集群,通过负载均衡设备共同对外提供服务,提供更好的并发特性。
在网站应用中,即使访问量很小的分布式应用和服务,也至少要部署两台服务器构成一个小的集群,目的就是提高系统的可用性。缓存
缓存除了可以加快数据访问速度,还可以减轻后端应用和数据存储的负载压力。主要的缓存技术有:
CDN:英文全称为content delivery network,即内容分发网络,部署在距离终端用户最近的网络服务商,用户的请求总是最先达到他的网络服务商那里,将网站的一些静态资源缓存在这里,可以就近以最快的速度返回给用户。
反向代理:属于网站前端架构的一部分,部署在网站的前端,当用户请求到达网站的数据中心时,最先访问到的就是反向代理服务器,这里缓存网站的静态资源,无需将请求继续转发给应用服务器就能返回给用户。
本地缓存:在应用服务器本地缓存热点数据,应用可以直接在本机内存中访问数据,无需访问数据库。
分布式缓存:将数据缓存在分布式缓存集群中,应用程序通过网络通信访问缓存数据。异步
异步也是一种系统间解耦合的一种手段。在单一服务器内部:使用多线程共享内存队列实现异步;在分布式系统中:使用分布式消息队列实现异步------异步架构。
好处:①提高系统可用性:消费者服务器故障,生产者服务器可以继续处理业务请求,系统整体表现无故障,消费者服务器修复后,继续处理消息队列中的数据。②加快网站响速度:生产者服务器在处理完业务请求后,不需要等待消费者服务器处理就可以直接返回,响应延迟减少。③消除并发访问高峰:将突增的访问请求数据放入消息队列,等待消费者服务器依次处理,就不会对整个网站负载造成太大压力。
问题:使用异步方式处理业务可能会对用户体验、业务流程造成影响。冗余
为保证在服务器宕机的情况下网站依然可用,就需要一定程度的服务器冗余运行,数据冗余备份。
对数据库而言,除了进行冷备份(定期备份,存档保存),还要热备份(对数据库进行主从分离,实时同步)自动化
人为干预越少,出现问题的可能就越小。
开发中的自动化:自动化发布过程、自动化代码管理、自动化测试、自动化安全监测、自动化部署;
运维中的自动化:自动化监控、自动化报警、自动化失效转移、自动化失效恢复、自动化降低、自动化分配资源安全
核心架构要素
性能
主要指标:响应时间、TPS、系统性能计数器等
主要手段:
①前端:通过浏览器缓存、使用页面压缩、合理布局页面、减少Cookie传输;使用CDN和反向代理服务器
②应用服务器端:使用服务器本地缓存和分布式缓存;使用异步操作,如消息队列等;应用服务器集群部署;
③代码层面:使用多线程、改善内存管理等
④数据库服务器端:索引、缓存、SQL优化等;引入NoSQL;可用性
理解可用性:假设系统中任何一台或者多台服务器宕机时,以及出现各种不可预期的问题时,系统整体是否依然可用。高可用设计的目标就是当服务器宕机时,服务或者应用依然可用。
实现高可用的主要手段是冗余:应用部署在多台服务器上同时提供访问,数据存储在多台服务器上互相备份。伸缩性
所谓伸缩性是指通过不断向集群中加入服务器的手段来缓解不断上升的用户并发访问压力和不断增长的数据存储需求。
衡量标准:是否可以用多台服务器构建集群,是否容易向集群中添加新的服务器。
①对应用服务器集群:只要服务器上不保存上下文数据,所有服务器都是对等的,通过合适的负载均衡设备就可以像集群中不断加入服务器。
②对缓存服务器集群:加入新的服务器可能会导致缓存路由失败,进而导致大部分缓存数据都无法访问。需要改进缓存路由算法来保证缓存数据的可访问性。
③对关系型数据库集群:通过路由分区等手段。
④NoSQL:一般先天支持集群,伸缩性高。扩展性
扩展性理解:功能和需求扩展时,是否可以实现对现有系统透明无影响,不需要任何改动或者很少改动。不同功能与产品之间是否很少耦合。
实现高扩展性的主要手段:事件驱动架构和分布式服务。
事件驱动架构:主要通过消息队列来实现;
分布式服务:将业务和可复用服务分离开来,通过分布式服务框架调用。安全性