互联网技术架构演变过程-软件架构设计学习第四天(非原创)

文章大纲

一、演变过程思路图
二、何为大型网站
三、架构体系演进
四、架构总结
五、参考文章

一、演变过程思路图

二、何为大型网站

1. 大型网站特性

既然说的是大型网站架构,那么架构的背后自然是解决人因面对大型网站特性而带来的问题。这样可以先给大家说下大型网站的特性,这些特性带来的问题就是人要解决的问题:
(1)高并发、大流量:PV 量巨大;
(2)高可用:7*24 小时不间断服务;
(3)海量数据:文件数目分分钟 xxTB;
(4)用户分布广泛,网络情况复杂:网络运营商;
(5)安全环境恶劣:黑客的攻击;
(6)需求快速变更,发布频繁:快速适应市场,满足用户需求;
(7)渐进式发展:慢慢地运营出大型网站;

2. 大型网站架构理解

大型网站架构的概念对于每一个开发者来说很笼统、很模糊,正如盲人摸象,看到的、了解到的只是很小的一部分,大部分情况下我们只是负责架构中的一小块内容,所以很难清晰地给出具体定义。这就是所谓“不识庐山真面目 只缘身在此山中”的尴尬吧。所以我们要跳出来,站在宏观的角度,从整体到细节实现来认识大型网站架构。

那么从宏观的角度怎么去认识大型网站架构呢?正如前面几篇《细品架构系列》所描述对架构的认识,按照问题识别—>概念认知—>架构切分的思路,来分析大型网站架构的诞生:

  1. 问题识别:当前什么问题、谁的问题、问题边界;
  2. 概念认知:通过分析问题,会产生哪些概念,统一概念认知,达成沟通交流规范;
  3. 架构切分:根据概念来解决问题,如何架构切分,产生哪些架构,提出具体解决方案;

PS:上面的三个步骤具体如何识别、认知、切分,请详细参考前面几篇《细品架构系列》文章,可能使你会对架构有重新的认识。

在进行分析大型网站架构的演进之路前,首先我们要明确的两个价值观:

  1. 核心价值:随网站所需灵活应对;大型网站不是从无到有一步就搭建好一个大型网站,而是能够伴随小型网站业务的渐进发展,慢慢地演化成一个大型网站;
  2. 驱动力量:网站的业务发展— 业务成就了技术,事业成就了人,而不是相反;

还有,大型网站架构演进必须避免的几个误区:

  1. 一味追随大公司的解决方案;
  2. 为了技术而技术-->常见问题;
  3. 企图用技术解决所有问题:技术是用来解决业务问题的,而业务的问题,也可以通过业务的手段去解决;

三、架构体系演进

1. 单机时代

草根时期,快速开发网站并上线。当然,通常只是先试水,用户规模也没有形成,经济能力和投入也非常有限。应用程序、数据库、文件等所有资源都集中在一台 Server上,典型案例:基于 LAMP 架构的 PHP 网站;

优点:简单、快速迭代达成业务目标;

缺点:存在单点、谈不上高可用;

技术点:应用设计要保证可扩展;

2. 缓存出场

有一定的业务量和用户规模了,想提升网站速度,于是,缓存出场了。

优点:简单有效、方便维护;
缺点:存在单点、谈不上高可用;
技术点:客户端(浏览器)缓存、前端页面缓存、页面片段缓存、本地数据缓存/数据库缓存、远程缓存;

如上图,缓存可以分为:

  1. 页面缓存:客户端缓存,减少对网站的访问;
  2. 本地缓存:访问速度快,但数据量有限,减少对DB查询;
  3. 远程缓存:远程访问,可以集群,因此容量不受限制;

3. 数据服务与应用分离

市场反响还不错,用户量每天在增长,数据库疯狂读写,逐渐发现一台服务器快撑不住了。于是,决定把数据服务和APP做分离。

优点:简单有效、方便维护、提高不同Server对硬件资源的利用率;

缺点:存在单点、谈不上高可用;

技术点:文件服务器部署、数据库服务器,扩展数据访问模块;

分离后三台 Server 对硬件资源的需求各不相同:

  1. 应用服务器:需要更快更强大的 CPU;
  2. 数据库服务器:需要更快的硬盘和更大的内存;
  3. 文件服务器:需要更大的硬盘;

4. 数据库读写分离

单台数据库也感觉快撑不住了,一般都会尝试做“读写分离”。由于大部分互联网“读多写少”的特性所决定的。Salve的台数,取决于按业务评估的读写比例。

优点:简单有效、降低数据库单台压力;

缺点:读写分离,增加程序难度,架构变复杂,维护难度增加;

技术点:数据库主从同步部署,扩展数据访问模块,实现读写分离;

5. 应用服务集群

数据库层面是缓解了,但是应用程序层面也出现了瓶颈,由于访问量增大,加上早期程序员水平有限写的代码也很烂,人员流动性也大,很难去维护和优化。所以,很常用的办法还是“堆机器”。

优点:增加服务器和HA机制,系统性能及可用性得到保证;

缺点:应用之间缓存、Session一致性问题;

技术点:负载均衡;

通过集群解决高并发、海量数据问题的常用手段,实现系统的可伸缩性。通过负载均衡调度器,可将用户访问分发到集群中的某台 Server 上,应用服务器的负载压力不再成为整个网站的瓶颈。

6. 集中式缓存、Session集中存储

加机器谁都会加,关键是加完之后得有效果,加完之后可能会引发一些问题。例如非常常见的:集群应用之间页面输出缓存和本地缓存一致性的问题,Session保存的问题......。

优点:应用之间缓存、Session一致,存储无限制,可以扩展;

缺点:不如本地缓存访问快,缓存服务器、Session服务器等仍存在单点问题;

技术点:缓存服务器部署、Session集中存储方案;

7. 动静分离

动静分离也是提高网站响应速度的一种常用方式。将动态请求与静态请求分离开,尽量减少对应用服务器的压力。同时,可以再进一步对静态请求,进行缓存,以加快响应速度。可以需要开发人员配合(把静态资源放独立站点下),也可以不需要开发人员配合(利用7层反向代理来处理,根据后缀名等信息来判断资源类型)。

优点:减轻应用负载压力,针对静态文件缓存;

缺点:静态文件缓存更新失效问题;

技术点:动静分离、静态文件缓存方案;

8. 反向代理和CDN加速网站响应

使用反向代理和CDN加速网站响应:CDN 和反向代理的基本原理都是缓存,区别在于:

  1. CDN部署在网络提供商的机房;
  2. 反向代理则部署在网站的中心机房;

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

优点:减轻应用负载压力,异地缓存有效解决不同地方用户访问过慢的问题;

缺点:成本大幅增加,架构进一步复杂化,也维护难度进一步增大,静态文件缓存更新失效问题;

技术点:CDN、反向代理方案;

9. 使用NoSQL和搜索引擎

到这里,已经基本做到了DB层面和应用层面的横向扩展了,可以开始关注一些其它方面,例如:站内搜索的精准度,对DB的依赖,开始引入全文索引、NoSQL。

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

优点:降低DB依赖;

缺点:单点问题,谈不上高可用;

技术点:NoSQL、搜索引擎、分布式;

到目前为止,一个能够承载日均百万级访问量的中型网站架构基本介绍完了。

10. 如何保证高可用

在做扩展满足了基本的性能需求后,我们会逐渐关注“可用性”(也就是我们通常听别人吹牛时说的SLA、几个9)。如何保证真正“高可用”,也是个难题。

对关键应用/服务,做集群冗余负载,这也是保证高可用比较常用的手段:

  1. 文件系统、数据库系统集群;
  2. 静态内容服务器集群;
  3. CDN服务器集群;
  4. 反向代理服务器集群;
  5. 负载均衡调度器集群;
  6. 分布式NoSQL服务器集群;
  7. 搜索引擎服务器集群;
  8. 分布式缓存服务器集群;
  9. 分布式Session服务器集群;

优点:集群负载,保证高可用;

缺点:数据一致性、数据有状态问题;

技术点:负载调度器、集群方案;

截止目前为止,都没有怎么去改动应用程序的架构,或者说通俗点,都不怎么需要大面积的修改代码。

如果上面那些手段都用光了,还是支撑不住怎么办?不停的加机器也不是办法啊?

11. 应用垂直拆分

随着业务越来越复杂,网站的功能越来越多,虽然部署层面是采用的集群,但是应用程序架构层面还是“集中式”的,这样会导致很多耦合,不便于开发、维护,而且容易“一荣俱损”。所以,通常会把网站拆分出不同的子站点来单独宿主。

通过分而治之的手段将整个网站业务分成不同的产品线,如首页、商铺、订单、卖家、买家等 拆分成不同的产品线,分归不同的业务团队负责。各个应用之间可以通过建立一个超链接建立关系,也可以通过消息队列进行数据分发。

优点:降低耦合、分压;

缺点:应用架构复杂;

技术点:业务抽取拆分;

12. 业务垂直分库

应用都拆了,由于单个数据库的连接,QPS,TPS,I/O处理能力都非常有限,DB层面也可以去做垂直分库操作。

优点:降低DB耦合、分压DB;

缺点:数据访问模块复杂;

技术点:业务抽取拆分;

13. 分布式服务化

拆分应用和DB之后,其实还是会有很多问题。不同的站点,里面可能会有相同逻辑和功能的代码。当然,对于一些基础的功能我们可以封装DLL或者Jar包去到处提供引用,但是这种强依赖也很容易造成一些问题(版本问题、依赖关系等处理起来非常麻烦)。

既然每一个应用系统都需要执行许多相通的业务操作,比如用户管理、商品管理等,那么可以将这些共用的业务提取出来,独立部署。这样,传说中的SOA的价值就得到体现了。

优点:服务统一管理,提供重用度;

缺点:应用架构更复杂;

技术点:业务抽取拆分、服务化技术方案;

14. 消息队列

应用、服务之间还是会出现一些依赖问题,这时候,高吞吐量的解耦利器出现了。

优点:提高吞吐量、应用、服务之间解耦;

缺点:存在消息消费延迟问题;

技术点:消息队列技术方案;

15. 分库分表

最后,再介绍一个大型互联网公司都用的绝技--分库分表。个人经验,不是业务发展和各方面非常迫切,不要轻易走这一步。
因为分库分表谁都会干,关键是拆完之后怎么办。目前,市面上还没有完全开源免费的方案,能让你一劳永逸地解决数据库拆分问题。
分库分表:
横向拆分;
纵向拆分;
分布式数据库访问层;
数据库中间件(代理);

四、架构总结

上面讲述了在网站业务发展的不同阶段,会面临不同的问题,针对不同的问题,会选择不同的架构。大型网站架构就是在不同阶段时解决不同问题的过程中慢慢演进来的。
最后几句话,送给有缘的你:
一切以解决业务目标为首要任务;
没有以业务为目标的任何架构、技术,都是毫无意义的耍流氓;
再牛逼的架构、再牛逼的技术,不能够解决业务的问题,你也只能算是会架构、会技术的工匠,而不能算是真正意义上的架构师;
业务成就了技术,平台成就了人,事业成就了人,而不是相反;

五、参考文章

https://www.jianshu.com/p/9197d8a0781b

原文地址:https://www.cnblogs.com/WUXIAOCHANG/p/10986212.html

时间: 2024-08-04 03:42:09

互联网技术架构演变过程-软件架构设计学习第四天(非原创)的相关文章

软件架构设计常用方法-软件架构设计学习第五天(非原创) 发布成功,点击查看文章

文章大纲 一.需考虑问题二.前端架构三.应用层架构四.服务层架构五.存储层架构六.后台架构七.数据采集与监控八.安全架构九.数据中心机房架构十.自动化运维十一.参考文章 一.需考虑问题 1. 研发过程管理困难 (1)依赖管理,每个模块对其他模块的依赖是管理困难的:(2)版本管理:(3)部署管理(搭火车,难以触达到用户):(4)模块组织方式(库工程,源代码级别,没有权限).(5)构建打包痛苦:可能不能打包(2.x安装不上),合并代码搞了很久,编译打包时间过长. 2. 架构设计需考虑情况 (1)业务

《架构真经:互联网技术架构的设计原则》

架构真经:互联网技术架构的设计原则 主旨 这本书的英文名是scalability rules,但这里的scalability比狭义的可扩展性含义更广泛,不止是架构上,也涉及到工程.团队等方面的经验总结. 50条可扩展性规则 规则1 避免过度设计 产品的设计超出设计需求.完成的产品对于用户过度复杂.技术实现复杂到令他人难以理解都是过度设计的表现.复杂的系统实施成本高.维护困难,简单的系统容易扩展.可维护性强且成本低. 规则2 方案中包括扩展 在早期考虑到容量扩展的需求,但借助IaaS等服务可以在容

大型互联网技术架构4-分布式存储-II Google

The largest single database on earth - Google Spanner. 我们继续互联网技术架构-分布式存储. 上文大篇幅介绍了一些分布式存储的理论,偏重理论.可别小看这些理论,Google的各个神器都是建立在这些理论之上,甚至整个Apache的大数据3剑客项目都是受惠于这些理论.难怪@Tiger大牛讲Google靠的是一大批世界顶尖数据,物理,计算领域的Ph.D.,这些大神以及他们的Paper是Google为什么是Google的原因,以及Google没有开源

大型互联网技术架构3-分布式存储-I

我们继续互联网技术架构-分布式存储. 总目录: 分布式存储概述 分布式存储特性 - 哈希分布/一致性哈希分布 分布式存储协议 - 两阶段与Paxos 1. 概述 分布式存储作为互联网之核心基石,没有分布式海量存储就好比无源之水.分布式系统不是什么新鲜事物,教科书里已经研究了好多年,但是不温不火,直到近年互联网大数据应用的兴起才使得它大规模的应用到工程实践中,其主要特点概括为:规模大+成本低.现在的大型互联网公司少则几百几千个PC服务器,多的达到数百万级别低成本PC服务器集群; 总体来说,分布式存

软件架构设计学习总结(12):大型网站技术架构(六)网站的伸缩性架构

网站系统的伸缩性架构最重要的技术手段就是使用服务器集群功能,通过不断地向集群中添加服务器来增强整个集群的处理能力."伸"即网站的规模和服务器的规模总是在不断扩大. 1.网站架构的伸缩性设计 网站的伸缩性设计可以分成两类,一类是根据功能进行物理分离实现伸缩,一类是单一功能通过集群实现伸缩.前者是不同的服务器部署不同的服务,提供不同的 功能:后者是集群内的多台服务器部署相同的服务,提供相关的功能. 1.1 不同功能进行物理分离实现伸缩 纵向分离:即分层后分离,将业务处理流程上的不同部分分离

互联网技术架构给我们的启示

可以理解为自白书,知道自己太落后啦~ --中国建设银行信息技术管理部副总经理 王申科 据阿里官方公布的数据,2013年"双11"这一天,天猫.淘宝成交额共计350.19亿元,相当于10月全国日均消费额的一半,较去年的191亿元增长83%.支付宝交总交易笔数达到1.88亿笔,其中无线支付达到4518万笔,分别是去年同一天的1.77倍和5倍. 参照央行发布的2013年第二季度支付体系运行数据,二季度全国银行卡消费业务笔数约为30.6亿笔,平均每天约3400万笔,那么支付宝"双11

软件架构设计学习总结

软件架构设计就是软件系统的'布局谋篇',是软件抽象发展到一定阶段的产物.软件设计人员学习软件架构知识,旨在站在较高的层面上,整体的解决好软件的设计,复用,质量和维护等方面的实际问题.本文以图形的方式进行总结归纳,从软件架构的描述,设计,风格,评价,形成方法进行阐述. 软件架构设计总述: 软件架构的概念 软件架构的意义 软件架构的风格 分层架构 面向服务的架构(SOA) 特定领域的架构(DSSA) 软件产品线 基于架构的软件开发(ABSD) 软件架构与质量属性 软件架构评估 -----------

软件架构设计学习总结(14):大型网站技术架构(八)网站的安全架构

从互联网诞生起,安全威胁就一直伴随着网站的发展,各种Web攻击和信息泄露也从未停止.常见的攻击手段有XSS攻击.SQL注入.CSRF.Session劫持等. 1.XSS攻击 XSS攻击即跨站点脚本攻击(Cross Site Script),指黑客通过篡改网页,注入恶意HTML脚本,在用户访问网页时,控制用户浏览器进行恶意操作的一种攻击方式. 常见的XSS攻击类型有两种,一种是反射型,攻击者诱使用户点击一个嵌入恶意脚本的链接,达到攻击的目的,如下图所示: 另一种XSS攻击是持久型XSS攻击,黑客提

软件架构设计学习总结(13):大型网站技术架构(七)网站的可扩展性架构

扩展性是指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力. 设计网站可扩展架构的核心思想是模块化,并在此基础上,降低模块间的耦合性,提供模块的复用性.模块通过分布式部署,独立的模块部署在独立的服务器上(集群)从物理上分离模块之间的耦合关系. 模块分布式部署以后具体聚合方式主要有分布式消息队列和分布式服务. 1.利用分布式消息队列降低系统耦合性 如果模块之间不存在直接调用,那么新增模块或者修改模块对其他模块影响最小,这样系统的可扩展性无疑更好一些.         事件驱动框架:通过在