有人说过,大型网站是根据业务需求逐步演化而来的,而不是设计出来的,下面就是一个大型网站的进化过程。
1 初始阶段的网站架构数据库
在初始阶段,访问量并不大,因此应用程序、数据库、文件等全部的资源都在一台服务器上。后端
2 应用服务和数据服务分离缓存
随着业务的发展,就会发现一台服务器抗不过来了,因此将应用服务器与数据(文件、数据库)服务器分离。三台服务器对硬件资源的要求各不相同:应用服务器须要更快的CPU,文件服务器须要更大的磁盘和带宽,数据库服务器须要更快速的磁盘和更大的内存。分离以后,三个服务器各司其职,也方便针对性的优化。服务器
3 使用缓存改善网站性能网络
缓存的使用无处不在,缓存的根本目的是加快访问速度。当数据库的访问压力过大的时候,就能够考虑使用缓存了。网站使用的缓存能够分为两种: 缓存在应用服务器上的本地缓存和缓存在专门的分布式缓存服务器上的远程缓存。架构
4使用应用服务器集群改善网站的并发处理能力并发
随着业务的发展,单个应用服务器必定会成为瓶颈,应用服务器实现集群是网站可伸缩集群架构设计中较为简单成熟的一种。后面也会提到,将应用服务器设计为无状态的(没有须要保存的上下文信息),就能够经过增长机器,使用负载均衡来scale out。负载均衡
5.数据库读写分离异步
即便使用了缓存,但在缓存未命中、或者缓存服务时效的状况下,仍是须要访问数据库,这个时候就须要数据库的读写分离:主库提供写操做,从库提供读服务。注意,在上图中增长了一个数据访问模块,能够对应用层透明数据库的主从分离信息。分布式
6.使用反向代理和CDN 加速网站晌应
CDN和反向代理其实都是缓存,区别在于CDN 部署在网络提供商的机房;而反向代理则部署在网站的中心机房。使用CDN 和反向代理的目的都是尽旱返回数据给用户, 一方面加快用户访问速度,另外一方面也减轻后端服务器的负载压力。
7.使用分布式文件系统和分布式数据库系统
单个物理机的磁盘是有限的,单个关系数据库的处理能力也是有上限的,因此须要分布式文件存储与分布式数据库。固然,也须要”统一数据访问模块“,使得应用层不用关心文件、数据的具体位置。值得一提的事,关系型数据库自身并无很好的水平扩展方案,所以通常都须要一个数据库代理层,如cobar、mycat。
8.业务拆分
将一个网站拆分红许多不一样的应用, 每一个应用独立部署维护。应用之间能够经过一个超连接创建关系(在首页上的导航连接每一个都指向不一样的应用地址) ,也能够经过消息队列进行数据分发, 固然最多的仍是经过访问同一个数据存储系统来构成一个关联的完整系统
9.分布式服务
既然每个应用系统都须要执行许多相同的业务操做, 好比用户管理、商品管理等,那么能够将这些共用的业务提取出来,独立部署。
经过服务的分布式,各个应用能更好的独立发展,实现了从依赖模块到依赖服务的过渡。将通用的公共服务独立出来,也方便作服务管控,好比对各个应用的服务请求进行监控,在高峰时期限制、关闭某些应用的访问等。
10网站架构模式
① 分层
分层是企业应用系统中最多见的一种架构模式,将系统在横向维度上切分红几个部分,每一个部分负责一部分相对比较单一的职责, 而后经过上层对下层的依赖和调用组成一个完整的系统。
在大型网站架构中也采用分层结构,将网主占软件系统分为应用层、服务层、数据层。
分层的好处在于:解耦合,独立发展,伸缩性,可扩展性。上面网站的进化史也凸出了分层的重要性。
可是分层架构也有一些挑战, 就是必须合理规划层次边界和接口,在开发过程当中,严格遵循分层架构的约束, 禁止跨层次的调用( 应用层直接调用数据层)及逆向调用(数据层调用服务层, 或者服务层调用应用层)。
② 分割
分层强调的是横向切分,而分割是纵向切分, 上面网站进化史部分的业务拆分就包含了分割。
分割的目标是高内聚、低耦合的模块单元
③ 分布式
分层和分割的一个主要目的是分布式部署,但分布式也有本身的问题:网络通讯带来的性能问题,可用性,一致性与分布式事务,系统维护管理复杂度。
④ 集群
一个机器解决不了的问题,就用几个机器来解决,当服务无状态的时候,经过往集群增长机器就能解决大部分问题。对应网站进化史中“使用应用服务器集群改善网站的并发处理能力”
⑤ 缓存
缓存就是将数据存放在距离计算最近的位置以加快处理速度,同时大大减轻了数据提供者的压力大型网站架构设计在不少方面都使用了缓存设计:CDN、反向代理、本地缓存、分布式缓存⑥ 异步异步是解耦合的一个重要手段,常见的生产者-消费者模型就是一个异步模式。出了解耦合,异步还能提升系统可用性、加快响应速度、流量削峰。