如果把上世纪90年代初CERN正式发布Web标准和第一个Web服务的岀现当做互 联网站的开始,那么互联网站的发展只经历了短短20多年的时间。在20多年的时间里, 互联网的世界发生了巨大变化,今天,全球有近一半的人口使用互联网,人们的生活因 为互联网而产生了巨大改变。从信息检索到即时通信,从电子购物到文化娱乐,互联网 渗透到生活的每个角落,而且这种趋势还在加速。因为互联网,我们的世界正变得越来 越小。

同时我们也看到,在互联网跨越式发展的进程中,在电子商务火热的市场背后却是 不堪重负的网站架构,某些B2C网站逢促销必宕机几乎成为一种规律,而铁道部电子客 票官方购票网站的频繁故障和操作延迟更将这一现象演绎得淋漓尽致。

一边是企业在网站技术上的大量投入,一边却是网站在关键时刻的频繁宕机;一边
是工程师夜以继日地加班工作,一边却是网站故障频发新功能上线缓慢;一边是互联网 业务快速发展多领域挑战传统行业,一边却是网站安全漏洞频发让网民胆战心惊怨声载道。

如何打造一个高可用、高性能、易扩展、可伸缩且安全的网站?如何让网站随应用 所需灵活变动,即使是山寨他人的产品,也可以山寨的更高、更快、更强,一年时间用 户数从零过亿呢?

1.1大型网站软件系统的特点

与传统企业应用系统相比,大型互联网应用系统有以下特点。

  1. 高并发,大流量:需要面对高并发用户,大流量访问。Google日均PV数35亿,日
    均IP访问数3亿;腾讯QQ的最大在线用户数1.4亿(2011年数据);淘宝2012年“双 十一”活动一天交易额超过191亿,活动开始第一分钟独立访问用户达1000万。
  2. 高可用:系统7x24小时不间断服务。大型互联网站的宕机事件通常会成为新闻焦
    点,例如2010年百度域名被黑客劫持导致不能访问,成为重大新闻热点。
  3. 海量数据:需要存储、管理海量数据,需要使用大量服务器。Facebook每周上传的 照片数目接近10亿,百度收录的网页数目有数百亿,Google有近百万台服务器为全球用 户提供服务。
  4. 用户分布广泛,网络情况复杂:许多大型互联网都是为全球用户提供服务的,用户 分布范围广,各地网络情况千差万别。在国内,还有各个运营商网络互通难的问题。而 中美光缆的数次故障,也让一些对国外用户依赖较大的网站不得不考虑在海外建立数据 中心。
  5. 安全环境恶劣:由于互联网的开放性,使得互联网站更容易受到攻击,大型网站几 乎每天都会被黑客攻击。2011年国内多个重要网站泄露用户密码,让普通用户也直面一 次互联网安全问题。
  6. 需求快速变更,发布频繁:和传统软件的版本发布频率不同,互联网产品为快速适 应市场,满足用户需求,其产品发布频率是极高的。Office的产品版本以年为单位发布, 而一般大型网站的产品每周都有新版本发布上线,至于中小型网站的发布就更频繁了, 有时候一天会发布几十次。
  7. 渐进式发展:与传统软件产品或企业应用系统一开始就规划好全部的功能和非功能 需求不同,几乎所有的大型互联网站都是从一个小网站开始,渐进地发展起来的oFacebook 是伯克扎克同学在哈佛大学的宿舍里开发的;Google的第一台服务器部署在斯坦福大学 的实验室里;阿里巴巴则是在马云家的客厅里诞生的。好的互联网产品都是慢慢运营岀来的,不是一开始就开发好的,这也正好与网站架构的发展演化过程对应。

1.2大型网站架构演化发展历程

大型网站的技术挑战主要来自于庞大的用户,高并发的访问和海量的数据,任何简 单的业务一旦需要处理数以P计的数据和面对数以亿计的用户,问题就会变得很棘手。 大型网站架构主要就是解决这类问题。

1.2.1初始阶段的网站架构

大型网站都是从小型网站发展而来,网站架构也是一样,是从小型网站架构逐步演 化而来。小型网站最开始时没有太多人访问,只需要一台服务器就绰绰有余,这时的网 站架构如图1.1所示。

应用程序、数据库、文件等所有的资源都在一台服务器上。通常服务器操作系统使
用Linux,应用程序使用PHP开发,然后部署在Apache上,数据库使用MySQL,汇集 各种免费开源软件及一台廉价服务器就可以开始网站的发展之路了。

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

随着网站业务的发展,一台服务器逐渐不能满足需求:越来越多的用户访问导致性 能越来越差,越来越多的数据导致存储空间不足。这时就需要将应用和数据分离。应用 和数据分离后整个网站使用三台服务器:应用服务器、文件服务器和数据库服务器,如

图1.2所示。这三台服务器对硬件资源的要求各不相同,应用服务器需要处理大量的业务 逻辑,因此需要更快更强大的CPU;数据库服务器需要快速磁盘检索和数据缓存,因此 需要更快的硬盘和更大的内存;文件服务器需要存储大量用户上传的文件,因此需要更 大的硬盘。

应用和数据分离后,不同特性的服务器承担不同的服务角色,网站的并发处理能力
和数据存储空间得到了很大改善,支持网站业务进一步发展。但是随着用户逐渐增多, 网站又一次面临挑战:数据库压力太大导致访问延迟,进而影响整个网站的性能,用户 体验受到影响。这时需要对网站架构进一步优化。

1.2.3使用缓存改善网站性能

网站访问特点和现实世界的财富分配一样遵循二八定律:80%的业务访问集中在20% 的数据上。淘宝买家浏览的商品集中在少部分成交数多、评价良好的商品上;百度搜索 关键词集中在少部分热门词汇上;只有经常登录的用户才会发微博、看微博,而这部分 用户也只占总用户数目的一小部分。
既然大部分的业务访问集中在一小部分数据上,那么如果把这一小部分数据缓存在
内存中,是不是就可以减少数据库的访问压力,提高整个网站的数据访问速度,改善数 据库的写入性能了呢?

网站使用的缓存可以分为两种:缓存在应用服务器上的本地缓存和缓存在专门的分 布式缓存服务器上的远程缓存。本地缓存的访问速度更快一些,但是受应用服务器内存 限制,其缓存数据量有限,而且会出现和应用程序争用内存的情况。远程分布式缓存可 以使用集群的方式,部署大内存的服务器作为专门的缓存服务器,可以在理论上做到不 受内存容量限制的缓存服务,如图1.3所示。

使用缓存后,数据访问压力得到有效缓解,但是单一应用服务器能够处理的请求连 接有限,在网站访问高峰期,应用服务器成为整个网站的瓶颈。

1.2.4使用应用服务器集群改善网站的并发处理能力

使用集群是网站解决高并发、海量数据问题的常用手段。当一台服务器的处理能力、
存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服 务器.都满足不了网站持续增长的业务需求。这种情况下,更恰当的做法是增加一台服 务器分担原有服务器的访问及存储压力。

对网站架构而言,只要能通过增加一台服务器的方式改善负载压力,就可以以同样 的方式持续增加服务器不断改善系统性能,从而实现系统的可伸缩性。应用服务器实现 集群是网站可伸缩集群架构设计中较为简单成熟的一种,如图1.4所示。

通过负载均衡调度服务器,可将来自用户浏览器的访问请求分发到应用服务器集群 中的任何一台服务器上,如果有更多的用户,就在集群中加入更多的应用服务器,使应 用服务器的负载压力不再成为整个网站的瓶颈。

1.2.5数据库读写分离

网站在使用缓存后,使绝大部分数据读操作访问都可以不通过数据库就能完成,但 是仍有一部分读操作(缓存访问不命中、缓存过期)和全部的写操作需要访问数据库, 在网站的用户达到一定规模后,数据库因为负载压力过高而成为网站的瓶颈。
目前大部分的主流数据库都提供主从热备功能,通过配置两台数据库主从关系,可
以将一台数据库服务器的数据更新同步到另一台服务器上。网站利用数据库的这一功能, 实现数据库读写分离,从而改善数据库负载压力,如图1.5所示。

应用服务器在写数据的时候,访问主数据库,主数据库通过主从复制机制将数据更
新同步到从数据库,这样当应用服务器读数据的时候,就可以通过从数据库获得数据。
为了便于应用程序访问读写分离后的数据库,通常在应用服务器端使用专门的数据访问 模块,使数据库读写分离对应用透明。

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

用户规模越来越大,由于中国复杂的网络环境,不同地区
的用户访问网站时,速度差别也极大。有研究表明,网站访问延迟和用户流失率正相关, 网站访问越慢,用户越容易失去耐心而离开。为了提供更好的用户体验,留住用户,网 站需要加速网站访问速度。主要手段有使用CDN和反向代理,如图1.6所示。
CDN和反向代理的基本原理都是缓存,区别在于CDN部署在网络提供商的机房,使 用户在请求网站服务时,可以从距离自己最近的网络提供商机房获取数据;而反向代理 则部署在网站的中心机房,当用户请求到达中心机房后,首先访问的服务器是反向代理 服务器,如果反向代理服务器中缓存着用户请求的资源,就将其直接返回给用户。

使用CDN和反向代理的目的都是尽早返回数据给用户,一方面加快用户访问速度, 另一方面也减轻后端服务器的负载压力。

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

任何强大的单一服务器都满足不了大型网站持续增长的业务需求。数据库经过读写 分离后,从一台服务器拆分成两台服务器,但是随着网站业务的发展依然不能满足需求, 这时需要使用分布式数据库。文件系统也是一样,需要使用分布式文件系统,如图1.7所
分布式数据库是网站数据库拆分的最后手段,只有在单表数据规模非常庞大的时候 才使用。不到不得已时,网站更常用的数据库拆分手段是业务分库,将不同业务的数据 库部署在不同的物理服务器上。

1.2.8使用NoSQL和搜索引擎

随着网站业务越来越复杂,对数据存储和检索的需求也越来越复杂,网站需要采用 一些非关系数据库技术如NoSQL和非数据库查询技术如搜索引擎,如图1.8所示。

图1.8使用NoSQL系统和搜索引擎
NoSQL和搜索引擎都是源自互联网的技术手段,对可伸缩的分布式特性具有更好的 支持。应用服务器则通过一个统一数据访问模块访问各种数据,减轻应用程序管理诸多 数据源的麻烦。

1.2.9业务拆分

大型网站为了应对日益复杂的业务场景,通过使用分而治之的手段将整个网站业务 分成不同的产品线,如大型购物交易网站就会将首页、商铺、订单、买家、卖家等拆分 成不同的产品线,分归不同的业务团队负责。
具体到技术上,也会根据产品线划分,将一个网站拆分成许多不同的应用,每个应 用独立部署维护。应用之间可以通过一个超链接建立关系(在首页上的导航链接每个都 指向不同的应用地址),也可以通过消息队列进行数据分发,当然最多的还是通过访问同 一个数据存储系统来构成一个关联的完整系统,如图1.9所示。

1.2.10分布式服务

随着业务拆分越来越小,存储系统越来越庞大,应用系统的整体复杂度呈指数级增
加,部署维护越来越困难。由于所有应用要和所有数据库系统连接,在数万台服务器规

模的网站中,这些连接的数目是服务器规模的平方,导致存数据库接资源不足,拒绝服 务。
既然每一个应用系统都需要执行许多相同的业务操作,比如用户管理、商品管理等, 那么可以将这些共用的业务提取岀来,独立部署。由这些可复用的业务连接数据库,提 供共用业务服务,而应用系统只需要管理用户界面,通过分布式服务调用共用业务服务 完成具体业务操作,如图1.10所示。

大型网站的架构演化到这里,基本上大多数的技术问题都得以解决,诸如跨数据中 心的实时数据同步和具体网站业务相关的问题也都可以通过组合改进现有技术架构来解 决。
但事物发展到一定阶段,就会拥有自身的发展冲动,摆脱其初衷,向着使自己更强 大的方向发展。既然大型网站架构解决了海量数据的管理和高并发事务的处理,那么就 可以把这些解决方案应用到网站自身以外的业务上去。我们看到目前许多大型网站都开 始建设云计算平台,将计算作为一种基础资源出售,中小网站不需要再关心技术架构问 题,只需要按需付费,就可以使网站随着业务的增长逐渐获得更大的存储空间和更多的 计算资源。

1. 大型网站架构演化相关推荐

  1. 读《大型网站技术架构:核心原理与案例分析》第一章:大型网站架构演化

    写在前面 从开始写代码到现在,已经做了好几个项目了,BS和CS的都有,一直都以一个码农自居.但,作为一个进步的程序员,都有一个成为架构师的理想.于是,在平时的工作中,也积极的去看各种书籍,看园子里面的 ...

  2. 大型网站架构演化历程

    http://www.hollischuang.com/archives/728 本文内容大部分来自<大型网站技术架构>,这本书很值得一看,强烈推荐. 大型网站系统的特点 高并发,大流量 ...

  3. (转)大型网站架构演化发展历程

    前面已经描述了大型网站系统的特点,而对一个大型网站系统,其架构也是重要的一个环节. 大型网站技术主要的挑战来自于庞大的用户.高并发以及海量的数据这三个方面.大型网站的形成就像一颗大树的成长,历尽长时间 ...

  4. 《大型网站技术架构》读书笔记一:大型网站架构演化

    来源:http://www.cnblogs.com/edisonchou/p/3773891.html 此篇已收录至<大型网站技术架构>读书笔记系列目录贴,点击访问该目录可获取更多内容. ...

  5. 2.大型网站架构演化的价值观

    这个世界没有哪个网站从诞生起就是大型网站:也没有哪个网站第一次发布就拥有 庞大的用户,高并发的访问,海量的数据:大型网站都是从小型网站发展而来.网站的 价值在于它能为用户提供什么价值,在于网站能做什么 ...

  6. 大型网站架构演化(一)——初始阶段的网站架构

    大型网站的技术挑战主要来自于庞大的用户,高并发的访问和海量的数据,任何简单的业务一旦需要处理数以P计的数据和面对数以亿计的用户,问题就会变得很棘手.大型网站架构主要是解决这类问题. 大型网站都是从小型 ...

  7. 大型网站技术架构(一)大型网站架构演化

    2019独角兽企业重金招聘Python工程师标准>>> 看完了有一本书,就应该有所收获,有所总结,最近把<大型网站技术架构>一书给看完了,给人的印象实在深刻,再加上之前也 ...

  8. 大型网站技术架构(一)--大型网站架构演化(转)

    http://blog.csdn.net/chaofanwei/article/details/26865169 看完了有一本书,就应该有所收获,有所总结,最近把<大型网站技术架构>一书给 ...

  9. [置顶]大型网站技术架构(一)大型网站架构演化

    看完了有一本书,就应该有所收获,有所总结,最近把<大型网站技术架构>一书给看完了,给人的印象实在深刻,再加上之前也搞过书本上讲的反向代理和负载均衡以及session独立存储和缓存,因此书本 ...

最新文章

  1. poj3259(SPFA算法)
  2. 梦幻西游手游服务器维护时段,梦幻西游手游2018合区时间服务器汇总详解
  3. list 去重_测试面试题集Python列表去重
  4. Android之Service与IntentService的比较
  5. Scene Flow场景流halcon算子,持续更新
  6. aix磁盘挂载到linux,AIX下文件系统挂载点相互调换方案
  7. Kendo UI开发教程(9): Kendo UI Validator 概述
  8. matlab帮助_【MATLAB】使用 APP DESIGNER 模块来帮助你做参数设计
  9. 《Genesis-3D游戏引擎系列教程-入门篇》九:发布到移动平台
  10. 多线程设计实例——Monte Carlo法估算圆周率
  11. java正则 连续数字,正则表达式实现匹配连续数字的方法
  12. Elasticsearch索引yellow修复
  13. android 画图
  14. 英语语言用计算机研究什么软件,高中英语新课程标准词汇习得研究—多媒体计算机辅助语言软件在教学中的应用.doc...
  15. word文档无法编辑且点击后每次跳到首页
  16. flex布局,没有justify-self,如何实现一左一中布局
  17. SpringBoot整合redis缓存(一)
  18. 【截取整个网页】Chrome浏览器快速截屏,高清截图
  19. 电脑win10显示依赖服务器,Win10系统弹出错误1068依赖服务或组无法启动如何解决...
  20. newifi y1刷PandoraBox+突破校园网上网限制

热门文章

  1. 期末作业成品代码——威海影视(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
  2. 魔法成为现实?武大学生团队造出了“隐身衣”,成本不到 500 元
  3. SpringBoot+MyBatis项目Dao层最简单写法
  4. 化学类调剂计算机,汕头大学理学院计算机化学方向招收收985、211院校本科毕业考研调剂生 - 考研 - 小木虫 - 学术 科研 互动社区...
  5. JS修改this指向:call、apply和bind函数
  6. 【bzoj4887】[Tjoi2017]可乐 矩阵乘法
  7. 抽象代数 04.07 Jordan-Holder定理
  8. 妥妥的去面试之Android基础(四)
  9. 关于动漫《昨日青空》的网页
  10. 是谁在偷窥你的手机隐私?