你好,我是好刚,这一节介绍大型网站技术架构第一章:网站架构的演化。我们将了解网站如何从初始的小型网站开始,随着业务发展而不断演化迭代,最终发展成技术成熟,规模复杂的大型网站。
1. 小型网站
网站刚创建,用户访问量少,只需要一台服务器,应用程序,数据库,文件等所有资源都在上面。
通常操作系统使用Linux, 服务器软件使用Nginx/Apache,应用程序使用PHP 开发,数据库使用Mysql。
随着网站业务发展,用户访问量增加,导致服务器性能越来越差,数据不断增加也导致存储空间不足。这时就需要将应用和数据分离。
2. 应用和数据分离
在分离后整个网站使用三台服务器:应用服务器,数据库服务器和文件服务器。各服务器需要部署的应用软件不同,所以对硬件资源的要求也不一样,对于应用服务器需要更强大的CPU,数据库则需要快速检索磁盘和数据缓存,文件服务器负责存储用户上传的文件,需要更大的硬盘。因为使用不同特性的服务器承担不同服务,网站处理用户请求的能力和数据存储空间可以得到极大改善。
随着网站发展,用户进一步增加,数据库压力会不断增大,进而导致数据访问延迟,影响网站性能。这时需要进一步优化网站架构,使用缓存改善性能。
3. 缓存
实际中,网站大部分访问会集中在一小部分数据上,将这部分数据缓存到内存中,就可以减少数据库的访问压力,加快访问速度。网站中使用的缓存分为两种,应用服务器上的本地缓存和专门缓存服务器上的远程缓存。
本地缓存的特点是访问速度更快,但是受到应用服务器内存限制,可以缓存的数据量有限,而且会和本地应用争用内存。远程缓存就可以使用集群,部署在大内存服务器上,理论上可以做成不受内存容量限制。
使用缓存后,除了加快访问速度,由于缓存住的数据不需要再次访问数据库,所以数据库负载压力也将得到缓解。
但是面对持续升高的访问请求量,单一应用服务器能够处理的请求是有限的,在访问高峰期,这就会成为网站瓶颈。可以使用集群解决这个问题。
4. 应用服务器集群
集群可以通过增加新服务器的方式,来分担用户请求,改善负载压力。利用这一点,架构上可以通过改变服务器数量来改变系统处理能力,实现系统的可伸缩性。
另一方面,来自用户的请求,在负载均衡的作用下会被分发到应用服务集群的某一台机器上进行处理。当有更多用户请求时,只需要往集群增加服务器就可以使应用程序负载不再成为网站瓶颈。
解决了应用服务器瓶颈,并且网站在使用缓存技术后,大部分读请求不经过数据库就可以完成访问,但是一部分穿透缓存的读操作和全部写操作还是需要访问数据库。在网站用户量达到一定规模后,数据库会因为这部分写操作压力过高而成为网站的瓶颈。为了解决这个问题,需要使用数据库的读写分离。
5. 数据库读写分离
利用数据库的主从热备功能配置主从服务。应用程序写数据时访问主数据库,主数据库通过主从复制机制将数据同步到从数据库,在读数据时访问从数据库,实现数据库读写分离,改善数据库负载压力。
为了方便应用程序访问读写分离的数据库,一般使用专门的数据库访问模块,使读写分离对应用透明。
下一步,网站业务继续发展,服务的用户范围越来越广,用户的网络环境开始变得复杂,不同地区用户访问速度差别极大。为了留住用户,改善网站访问速度,可以使用CDN 和反向代理加速。
6. 使用CDN 和反向代理
CDN 和反向代理的基本原理都是使用缓存加快网站访问速度。
CDN 部署在网络提供商的机房,从距离用户最近的机房获取数据,反向代理则部署在网站机房,缓存服务器响应的结果数据。两者都是一种缓存机制,通过将缓存数据直接返回给用户,加速用户访问,同时也避免这部分请求落到后端服务器上,减轻了后端服务器负载压力。
网站业务进一步发展,导致任何强大的单一服务器都满足不了持续增长的存储需求。此时就需要使用分布式存储。
7. 使用数据库和分布式文件系统
在数据库读写分离,拆成主从服务器后,数据库随着业务发展再次满足不了访问压力,这个时候就需要使用分布式数据库。文件系统也是一样,需要部署分布式文件系统。
需要注意的是,分布式数据库一般是网站数据库拆分的最后手段,对网站工程师的技术要求也很高,网站也很难达到这种业务量级,实际中更常见的做法是对数据库进行分库分表,将业务数据存储到不同的数据库实例上,通过增加数据库实例的方式改善数据库存储压力。
并且随着网站发展,对数据存储和检索的需求越来越复杂,此时可以考虑使用NoSQL 数据库。
8. 使用NOSQL 和搜索引擎
对于NoSQL 数据库和搜索引擎技术,主要针对特定业务场景。常见的NoSQL 数据库有MongoDB 和HBase,非数据库查询技术如搜索引擎服务,包括ElasticSearch,solr 等。其中基于ElasticSearch 的ELK 日志收集与分析系统是现在极为流行的日志分析系统解决方案。
另外由于NoSQL 和搜索引擎都是来源于互联网的技术手段,对可伸缩的分布式具有良好的支持。这里需要注意下,在大型网站中,会使用很多不同类型的数据存储技术,所以应用程序最好通过一个统一的数据访问模块访问各种数据源,方便管理维护。
网站发展到这个阶段,业务场景和人员结构都极为复杂,导致网站的开发和管理成为发展瓶颈,此时可以将网站业务分成不同的产品线,由不同部门分别负责。
9. 业务拆分
根据业务将一个网站拆分成许多不同的应用,由不同部门独立开发部署。应用之间使用消息队列进行数据分发,并基于同一个数据存储系统来构成一个关联的完整系统,继续推动业务发展。
但是随着业务拆分得越来越小,存储系统越来越大,应用程序之间的复杂性呈指数级增加,部署维护也越来越困难。也就需要进入了网站架构的第10个阶段:分布式服务。
10. 分布式服务
分布式服务通过将应用中一些公共的业务提取出来,形成服务,由这些服务维护数据并对各种应用提供接口,应用系统只需要管理用户界面,通过分布式服务调用完成业务操作。
大型网站的架构演化到这里,基本上解决了大多数的技术问题,同时具体开发中的问题也可以通过组合改进现有技术来解决。
11. 小结
最后我们小结一下,在最终网站架构下,用户请求的处理流程。首先,用户请求通过CDN,到网站的反向代理,然后经由负载均衡分发到应用集群的某一台机器上进行处理,而应用则根据业务拆分,相互之间通过消息队列传递数据,并且调用分布式服务进行业务逻辑处理,分布式服务从分布式缓存中读取数据,往分布式数据库中写入数据,针对特定场景还会使用到NoSQL和搜索引擎,再拿到数据后,分布式服务将处理后的数据原路响应给用户。
大型网站技术架构的第一章:架构演化就先介绍到这里,下一节我们介绍网站架构的模式。
我是好刚,欢迎大家关注我的微信公众号:好刚编程,观看更多技术小视频喔。
参考资料
-
《大型网站技术架构:核心原理与案例分析》 李智慧