第一篇 概述
第一章 大型网站架构演化
1.1 大型网站软件系统的特点
高并发,大流量
高可用
海量数据
用户分布广泛,网络情况复杂
安全环境恶劣
需要快速变更,频繁发布
渐进式发展
1.2 大型网站架构演化发展历程
1.2.1 初始阶段
越来越多用户访问,导致应用系统性能越来越差,服务器存储空间不足。这时就需要将应用和数据分离。
1.2.2 应用服务和数据服务分离
随着用户逐渐增多,数据库访问压力太大,导致访问延迟,进一步影响网站性能,用户体验受到影响。这是需要增加缓存来缓解数据库压力。
1.2.3 使用缓存改善网站性能
本地缓存:访问更快,受应用服务器内存限制,缓存数据量有限,还会出现跟应用程序抢内存的情况。
远程分布式缓存:不受内存限制,但限制于网络。
数据库压力得到缓解,但是单一的应用服务器能够处理的请求连接有限,在网站访问高峰期,应用服务器成为了整个网站的瓶颈。这时需要使用应用服务器集群来改善网站的并发处理能力。
1.2.4 使用应用服务器改善网站的并发处理能力
负载均衡调度服务器:负责将访问请求分发到应用服务器集群中的任何一台服务器上
网站达到一定规模后,数据库负载压力过大将再一次成为网站瓶颈。这时可以采用读写分离的方式来解决问题。
1.2.5 数据库读写分离
网站利用主从数据库的功能,实现数据库读写分离,从而改善数据库负载压力。
数据访问模块:通过该模块将数据库的使用对应用透明,不需要管数据库侧是如何实现的。
由于中国复杂的网络环境,不同地区访问网站时,速度差别也很大。为了提供更好的用户体验,留住客户,引入CDN和反向代理技术,加速网站的访问速度。
1.2.6 使用方向代理和CDN加速网站响应
CND服务器:部署在网络提供商的机房,是用户在请求网站时,可以从距离自己最近的网络提供商机房获取数据
反向代理服务器:部署在网站的中心机房,当用户请求到达机房后,首先访问反向代理服务器,如果反向代理服务器中缓存了用户请求的资源,则直接返回给用户
随着网站业务的发展仍然不满足需求时,分布式数据库是网站数据库拆分的最后手段,只有在单表数据规模非常庞大的时候才使用。一般网站更常用的是业务分库,将不同业务的数据库部署在不同服务器上。
12.7 使用分布式文件系统和分布式数据库系统
随着网站业务越来越复杂,对数据存储和检查的需求也越来约复杂,网站可以采用非关系数据库技术如NoSQL和非数据库查询技术如搜索引擎。
12.8 使用NoSQL和搜索引擎
NoSQL:传统的关系型数据库在处理海量数据时性能会收到限制,NoSQL能更好的应对这种情况
搜索引擎:快速高效的检索出大量数据,提供网站的搜索功能和用户体验
大型网站发展到这里,业务场景日益复杂,可以采用分而治之的手段将网站业务分成不同的产品线。如大型购物网站就会将首页、商铺、订单、买家、卖家等拆成不同的产品线,分归不同的业务团队负责。具体到技术,则将一个网站拆分多个不同应用,每个应用独立部署。
12.9 业务拆分
消息队列:可以在应用之间进行异步通信,将消息从一个应用程序传递到另一个应用程序。它可以缓解高负载时的压力,提高应用程序的可伸缩性和可用性。当一个应用程序需要向另一个应用程序发送消息时,它将消息放入队列中,而不需要直接与另一个应用程序进行通信。另一个应用程序则可以从队列中获取消息并处理它。这种方式可以减少应用程序之间的直接依赖,提高系统的可靠性和灵活性。
随着业务越拆越小,存储系统越来越大,应用系统复杂度呈指数级增加,部署维护越来越困难。这个时候可以通过分布式服务调用公共业务服务完成具体业务操作,应用系统只需要管理用户界面即可。
1.2.10 分布式服务
1.2章节小结
1、(初步)将应用、数据库、文件系统等分离,减小服务器压力,提高性能
2、(成长)引入缓存机制(本地缓存、远程分布式缓存),减小数据库压力,提高性能
3、(成长)使用负载均衡+应用服务器集群的方式来应对高并发访问
4、(成长)采用数据库主/从复制的功能,实现读写分离,进一步减小数据库压力
5、(成长)为了更快的响应用户,留住用户,可以加入CDN和反向代理的技术,实现这一目标
6、(深入)当数据越来越庞大,单表数据非常庞大时,可以将数据库升级至分布式数据库,来再一次的减小数据库压力
7、(深入)业务日益复杂后,可以将业务拆分到不同的产品线,不同团队负责,独立部署
8、(深入)随着业务越拆越小,维护逐渐困难,不同业务存在相同业务功能。这时可以提取公共业务服务,前置应用系统只管用户界面,公共业务服务器负责完成具体业务操作
1.3 大型网站架构演化的价值观
1、逐渐演化
2、随业务发展而变化
在网站很小的时候去追求网站架构是舍本逐末,得不偿失。小网站最需要做的是为了提供更好的服务来创造价值,得到用户认可,活下去,野蛮生长。
1.4 网站架构的设计误区
1、追求大公司的解决方案
大公司的解决方案很成功,但不一定适合
2、为了技术而技术
脱离业务的技术,毫无意义
3、企图用技术解决所有问题
技术是用来解决业务问题的,而业务的问题,也可以通过业务的手段来解决。例子:12306从零点秒杀售票方式更换成了分时段售票,引入排队机制。这其实就是用业务手段控制了并发访问的量