网站都是从小网站一步一步发展为大型网站的,而这之中的挑战主要来自于庞大的用户、安全环境恶劣、高并发的访问和海量的数据,任何简单的业务处理,一旦须要处理数以 P 计的数据和面对数以亿计的用户时,问题就会变的很棘手前端
下面咱们就来讲说这个演变过程:sql
大型网站都是由小型网站演变而来的,网站架构也同样数据库
小型网站最开始没有太多人访问,只须要一台服务器就绰绰有余,就像这样:segmentfault
应用程序、数据库、文件等全部资源都在一台服务器上,一般使用 Linux
PHP
MySQL
Apache
就能够完成整个项目部署,而后再买个域名,租一个廉价的服务器就能够开始咱们的网站之旅了后端
随着业务的发展,逐渐的一台服务器已经不能知足需求,这时咱们能够将 应用与数据分离
缓存
分离以后咱们使用到三台服务器:应用服务器、文件服务器和数据库服务器,以下所示:安全
对于这三台服务器要求各不相同:性能优化
应用服务器
要处理大量的业务逻辑,因此须要更好更快更强大的 CPU服务器
数据库服务器
须要快速的进行磁盘检索和数据缓存,所以须要更快的硬盘和更大的内存网络
文件服务器
须要存储用户上传的文件资源,所以须要更大的硬盘存储空间
应用与数据分离后,各个的职责变得更加专注,网站的性能获得进一步的提高,但随着用户的继续增长,咱们须要对网站架构进一步优化
网站的访问同样遵循二八定律:80% 的业务访问集中在 20% 的数据上面
所以咱们要对这一小部分的数据进行缓存来减轻数据库的访问压力,以提升整个网站的数据访问速度,改善数据库的读写性能
网站的缓存能够分为两种:缓存在应用服务器上的本地缓存和缓存在专门的分布式缓存服务器上的远程缓存
本地缓存
的访问速度会快一些,可是受应用服务器内存限制,缓存数据量颇有限,并且会出现内存争用的状况
远程分布式缓存
可使用集群的方式,部署大内存的服务器做为专门的缓存服务器,能够在理论上作到不受内存容量限制的缓存服务
以下所示:
使用缓存后,数据访问压力获得了有效的缓解,但单一的应用服务器可以处理的请求链接数有限,在访问的高峰期,应用服务器又会成为网站性能的瓶颈
使用集群是网站解决高并发,海量数据问题的经常使用手段,当你纵向提高到必定程度后,那就该开始横向提高了
当一台服务器的处理能力不足时,与其换一台更强大的服务器,不如增长一台服务器去分担原有的服务器压力。对于大型网站而言,不管多么强大的服务器,都知足不了持续增加的业务需求,更高效的方式就是增长服务器来分担压力
对于网站架构而言,若是增添一台新的服务器能够改善负载压力,那么就可使用一样的方式来应对源源不断的业务需求,从而实现系统的可伸缩性
经过负载均衡调度服务器,能够将用户请求分发到应用服务器集群里的任何一台服务器上,若是有更多的用户,能够增长更多的应用服务器,使应用服务器的负载压力再也不成为网站的性能问题
在使用了缓存后,大多数的操做不通过数据库访问就能完成,但仍有一部分读操做(缓存访问未命中,缓存过时)和全部的写操做须要访问数据库,在网站的用户量达到必定时,数据库的负载问题就来了
目前大多数的数据库都支持主从热备份,经过配置两台服务器的主从关系,能够将一台数据库服务器的数据更新同步到另外一台,网站利用这一功能,实现数据库读写分离,从而进一步改善数据库负载压力
应用服务器在写操做的时候,访问主数据库,主数据库经过主从复制机制把数据同步更新到从数据库,这样当应用服务器进行读操做的时候,就能访问从数据库获取数据
CDN
和 反向代理
的基本原理都是缓存
CDN
部署在网络供应商的机房,用户在进行请求时,会从距离最近的网络供应商机房获取数据
反向代理
则部署在中心机房,当用户请求到达中心机房后,会首先访问反向代理服务器,若是反向代理服务器中缓存这用户请求的资源,就直接返回给用户
使用 CDN
和 反向代理
都是为了尽快返回给用户数据,一方面加快用户访问速度,另外一方面也减轻了后端服务器的压力
随着网站业务的继续发展,这时候就能够像分布式应用服务器同样,对数据库系统和文件系统进行分布式管理
分布式数据库
是网站数据库拆分的最后手段,通常咱们能够采起业务分库,根据不一样业务的数据库部署在不一样的数据库服务器上
这两个方式都是依赖于互联网的技术手段,应用服务器经过一个统一的数据访问模块来访问各类数据,从而减轻应用程序有多个数据源的麻烦
对于大型网站,咱们能够分而治之,把整个网站的业务分为不一样的模块,好比大型的交易购物完整能够分为首页、店铺、订单、买家等,分别交给不一样的业务团队来负责
同时咱们将一个网站根据模块划分拆分红多个应用,每一个应用进行单独的部署和维护,应用之间经过超连接创建关系(指向不一样的应用地址),最后经过相同的数据存储系统来构成一个互相关联的完整系统
随着业务拆分,整个系统愈来愈大,应用的总体复杂度呈指数级增长,部署维护愈来愈困难,而且全部的应用服务器都要与数据库服务链接, 在数万台服务器规模的状况下,这些链接的数目是服务器规模的平方,致使资源不足
这时候就要对相同的业务进行提取,独立部署,把这些可重用的业务和链接数据库等,提取出来做为公共业务服务,而应用系统只须要经过分布式服务访问公共业务服务完成业务操做
到这里,基本上大多数的技术问题都能获得解决,还有一些实时同步等具体业务问题也均可以经过现有的技术解决