大型网站的特点
高并发
、大流量
:PV(page view)量巨大高可用
:7*24小时不间断服务海量数据
:需要存储、管理海量数据,需要使用大量服务器- 用户
分布广泛
,网络情况复杂:网络运营商 安全
环境恶劣:黑客的攻击- 需求
快速变更
,发布频繁:快速适应市场,满足用户需求 渐进式
发展:与传统软件产品或企业应用系统一开始就规划好全部的功能和非功能需求不同,几乎所有的大型互联网网站都是从一个小网站开始的,渐进地发展起来的
大型网站架构演化过程
初始阶段的网站架构
在初始阶段,访问量并不大,所以应用程序、数据库、文件等所有的资源都在一台服务器上。应用服务和数据服务分离
随着业务的发展,就会发现一台服务器抗不过来了,所以将应用服务器与数据(文件、数据库)服务器分离。三台服务器对硬件资源的要求各不相同:应用服务器需要更快的CPU,文件服务器需要更大的磁盘和带宽,数据库服务器需要更快速的磁盘和更大的内存。分离之后,三个服务器各司其职,也方便针对性的优化。使用缓存改善网站性能
缓存的使用无处不在,缓存的根本目的是加快访问速度。当数据库的访问压力过大的时候,就可以考虑使用缓存了。网站使用的缓存可以分为两种: 缓存在应用服务器上的本地缓存和缓存在专门的分布式缓存服务器上的远程缓存。使用应用服务器集群改善网站的并发处理能力
随着业务的发展,单个应用服务器一定会成为瓶颈,应用服务器实现集群是网站可伸缩集群架构设计中较为简单成熟的一种。后面也会提到,将应用服务器设计为无状态的(没有需要保存的上下文信息),就可以通过增加机器,使用负载均衡来scale out。数据库读写分离
即使使用了缓存,但在缓存未命中、或者缓存服务时效的情况下,还是需要访问数据库,这个时候就需要数据库的读写分离:主库提供写操作,从库提供读服务。注意,在上图中增加了一个数据访问模块,可以对应用层透明数据库的主从分离信息。使用反向代理和CDN 加速网站晌应
CDN和反向代理其实都是缓存,区别在于CDN 部署在网络提供商的机房;而反向代理则部署在网站的中心机房。使用CDN 和反向代理的目的都是尽旱返回数据给用户, 一方面加快用户访问速度,另一方面也减轻后端服务器的负载压力。使用分布式文件系统和分布式数据库系统
单个物理机的磁盘是有限的,单个关系数据库的处理能力也是有上限的,所以需要分布式文件存储与分布式数据库。当然,也需要”统一数据访问模块“,使得应用层不用关心文件、数据的具体位置。值得一提的事,关系型数据库自身并没有很好的水平扩展方案,因此一般都需要一个数据库代理层,如cobar、mycat。使用NoSQL 和搜索引擎
很多应用并一定适合用关系数据库存储,更加灵活的NoSql能更加方便的解决一些问题,而且NoSQL天然就支持分布式。专门的搜索引擎在提供更优质服务的同时,也大大减轻了数据库的压力。业务拆分
将一个网站拆分成许多不同的应用, 每个应用独立部署维护。应用之间可以通过一个超链接建立关系(在首页上的导航链接每个都指向不同的应用地址) ,也可以通过消息队列进行数据分发, 当然最多的还是通过访问同一个数据存储系统来构成一个关联的完整系统分布式服务
既然每一个应用系统都需要执行许多相同的业务操作, 比如用户管理、商品管理等,那么可以将这些共用的业务提取出来,独立部署。通过服务的分布式,各个应用能更好的独立发展,实现了从依赖模块到依赖服务的过渡。将通用的公共服务独立出来,也方便做服务管控,比如对各个应用的服务请求进行监控,在高峰时期限制、关闭某些应用的访问等。
大型网站架构价值观与设计误区
价值观
核心价值
随网站所需灵活应对,大型网站不是从无到有一步就搭建好一个大型网站,而是能够伴随小型网站业务的渐进发展,慢慢地演化成一个大型网站。
驱动力量
网站的业务发展—业务成就了技术,事业成就了人,而不是相反。
设计误区
一味追随大公司的解决方案。
为了技术而技术,常见问题。
企图用技术解决所有问题:技术是用来解决业务问题的,而业务的问题,也可以通过业务的手段去解决。