网站技术架构(1)—演化

随着20世纪90年代,第一代Web标准和第一个网站的出现,互联网发生了跨越式的发展。在发展的进程中,隐藏在越来越复杂的网站背后的确实越来越不堪重负的网站架构,即使是淘宝,在往年的促销活动中也经常会发生服务器宕机的情况,更不用说几乎天天宕机的新浪微博。

因此,网站架构的调整也就提上了日程。

大型网站的特点

与传统的软件行业和企业应用系统相比,互联网的网站拥有以下的特点:

  1. 高并发,大流量:几乎每个大型网站都有百万千万甚至过亿的用户量,因此每天都会面对大量的高并发访问网站的用户和大流量的访问力度。
  2. 高可用:一个网站想要吸引用户,一定要维持自己的网站7*24小时不间断提供服务。一旦服务器频繁发生宕机,那么用户就会快速的流失到竞品产品。
  3. 海量数据:海量用户就代表着海量的数据,为了存储和管理这些数据,需要大量的服务器。
  4. 用户网络情况复杂:用户分布在全国各地甚至全球各地,而各地的网络情况又不尽相同,要考虑如何让各地的用户都能正常的访问网站。
  5. 安全环境恶劣:互联网的开放性导致网站很容易遭到黑客的攻击,比如前端最常见的XSS和CSRF攻击,大型网站几乎每天都在被攻击。
  6. 需求迭代频繁:互联网产品为了适应快速的市场,满足用户的需求,几乎每周甚至每天都会发布新的版本。
  7. 渐进式发展:与软件行业不同,每个大型网站都是从一个小型网站慢慢发展起来的。Facebook值扎克伯格在宿舍开发的,阿里巴巴则是在马云家里的客厅诞生的。好的互联网产品都是慢慢运营出来的。

大型网站架构演化历程

初始阶段

所有大型网站都是由小型网站发展而来的,网站架构也一样,都是慢慢演化而来的。

小网站成立初期,因为用户访问量不大,因此只需要一台服务器就可以满足网站的正常运行,架构图如下所示:

应用程序、数据库、文件等所有资源都放在一台服务器上,这些工作基本一个研发工程师就可以完成,以前的Linux+PHP+Apache+Mysql体系,甚至现在的Linux+Node+React/Vue+Mysql,我们需要的只是一台廉价的服务器,就可以走上开发网站之路了。

(欢迎访问我的社区网站:Fisoa)

应用服务和数据服务相分离

随着用户的不断增多,我们会发现,随着越来越多的用户访问,服务器性能越来越差,存储空间严重不足。

这个时候我们就需要将应用和数据分离开,分离之后我们应该有三台服务器:应用服务器,文件服务器,数据库服务器。

三种服务器对硬件资源的要求都不相同:

  1. 应用服务器需要强大的CPU处理大量的业务逻辑。
  2. 文件服务器需要存储大量用户上传的文件,因此需要更大的硬盘。
  3. 数据库服务器需要更快的检索速度和数据缓存,因此需要更快的硬盘和更大的内存。

随着应用和数据的分离,不同特性的服务器承担不同的服务,网站处理并发的能力和数据存储空间都可以得到改善,并且继续支持网站的发展。

使用缓存改善网站性能

随着网站用户量的进一步增多,网站又会面临一次挑战:数据库压力过大导致访问延迟,进而影响整个网站的性能,用户体验收到影响。

通过二八定律我们可以了解到:80%的用户访问都集中在20%的数据上。淘宝买家浏览的产品集中在少部分,微博搜索的内容也集中在少部分,百度搜索的关键词也集中在少部分,而搜索和浏览那些冷门的消息的,只是用户中的一小部分。

既然访问基本上集中在这小部分的数据上,那么我们就可以将这一小部分数据缓存在内存中,这样就可以减少数据库的访问压力,提高整个网站的访问速度了。

网站初期我们依然可以使用服务器的本地缓存,这样访问速度最快,但是随着用户的增多,本地缓存的内存有限,我们如果继续将数据缓存在服务器本地的话,就会发生缓存和应用程序争夺内存的情况,因此这个时候我们就需要将缓存也单独独立出去,设置一个大内存的服务器作为专门的缓存服务器。

因为单台缓存服务器的存储空间总是有限的,我们经常使用多台服务器组成集群来缓存数据。

使用了缓存之后,数据访问的压力可以得到有效的缓解。

使用集群提高网站的并发能力

使用了缓存之后,在网站访问的高峰期,应用服务器的性能则成为了新的网站瓶颈。

使用集群是网站解决高并发、海量数据的常用手段,既然一台服务器的处理能力、存储空间不足,那么我们只需要使用多台服务器去平分原本属于一台服务器的压力即可。

这样使用集群的好处是,当我们网站发展,又碰到了瓶颈的时候,只需要向集群中继续添加服务器即可,这样就实现了系统的可伸缩性。可以说使用应用服务器集群是实现网站可伸缩性设计中比较简单而且成熟的一种方式了。

通过负载均衡服务器的调节,将来自用户客户端的访问分发到应用服务器集群中的任何一台服务器上,这样就大幅降低了每一台应用服务器的压力。

数据库读写分离

使用了缓存之后,我们网站中的绝大部分的数据读操作就可以不通过数据库直接在缓存中完成了,但是仍然有一部分的读操作(缓存未命中、缓存过期等)和全部的写操作需要访问数据库,在用户量达到一定规模之后,数据库就会因为负载压力过高而成为网站的瓶颈。

目前主流的数据库都有主从热备功能,通过配置两台数据库的主从关系,可以将一台数据库的数据更新同步到另一台服务器上。利用这个功能,我们可以实现数据库的读写分离,从而改善数据库的敷在压力。

应用程序写数据的时候,访问主数据库,读数据的时候访问从数据库,当主数据数据发生改变的时候,通过主从热备功能,将数据同步到从数据库即可。

通常应用服务器上都有一个专门的数据访问模块,业务通过访问这个数据访问模块来获取数据,具体如何获取的数据则是由数据访问模块完成,即数据库读写分离对应用程序完全透明。

使用反向代理和CDN加速网站响应

解决用户网络情况复杂的主要手段就是使用CDN和反向代理。

CDN和反向代理的原理都是缓存,区别在于CDN部署在网络提供商的机房,用户访问网站的时候,可以从离自己最近的机房获取数据;而反向代理则部署在网站的中心机房,当用户请求到达中心机房之后,直接访问反向代理服务器,如果反向代理服务器中缓存着需要的资源的话,就直接返回给用户。

使用CDN和反向代理的目的都是尽快的将数据返回给用户,一方面加快响应速度,一方面减轻服务器的负载压力。

使用分布式文件系统和分布式数据库系统

任何单一的服务器都不可能满足大型网站持续增长的业务需求。数据库读写分离之后由一台服务器变成两台服务器,但是依然不能满足需求,这个时候就需要分布式数据库。文件系统也是一样的,需要使用分布式文件系统。

分布式数据库是网站数据库拆分的最后手段,只有在单表数据量实在特别庞大的时候才会使用。通常更加常用的手段是业务分库,不同的业务访问不同的数据库。

业务拆分

当我们的网站发展到一定程度之后,业务场景就会变得十分复杂,这个时候就会将整个网站划分成不同的产品线进行单独维护,最终在入口处拼装起来,如淘宝首页是将店铺、订单、卖家、买家、搜索、分类等等不同的产品线拼接起来组成的,每一个产品线都有一个单独的团队维护。

在技术方面,我们也会根据产品线的划分,将一个网站拆成不同的应用,每个应用都独立维护,最后通过访问同一个数据存储系统来构成一个关联的完整系统。

分布式服务

随着业务拆分越来越细化,存储系统越来越庞大,应用部署维护起来就会越来越困难。由于所有应用要和所有数据库系统连接,就会导致数据库连接资源不足,拒绝提供服务。

我们可以发现,每一个应用系统都会进行一些相同的操作,比如用户管理、商品管理、买家卖家管理等等。既然如此,我们就可以将这些共用的业务提取出来,独立部署。这些业务和数据库连接,提供共用的业务服务,应用程序只需要访问这些共用的业务,就可以获得数据,具体是数据是如何或得到的则是由共用业务去完成的。

这样的共有业务我们称之为服务,当然服务也需要进行分布式部署以提高网站性能的。

服务是一个网站中基础但是很重要的部分,因为任何一个微小的服务产生问题,都会导致多条甚至所有的产品线出现问题。

云计算服务与虚拟服务器

我们知道,任何产品发展到一定阶段之后,就会想到摆脱自身的桎梏,独立出去。既然大型网站的架构解决和海量数据的管理和高并发事务的处理,那么这些解决方案就可以应用到自身网站之外的业务上去,因此就会产生很多云计算服务和虚拟服务器等产品,例如阿里云、腾讯云等等。云计算平台将计算作为基础资源进行销售,从而使得中小型企业只需要支付一定的费用,就可以获得更大的存储空间和计算资源,而不需要关心技术架构问题。

共有 0 条评论

Top