写点什么

分布式缘何而起?从单兵,到游击队,到集团军

  • 2019-09-26
  • 本文字数:3735 字

    阅读完需:约 12 分钟

分布式缘何而起?从单兵,到游击队,到集团军

你好,我是聂鹏程。这是《分布式技术原理与算法解析》专栏的第一篇文章,我们先来聊聊什么是分布式。


与其直接用些抽象、晦涩的技术名词去给分布式下一个定义,还不如从理解分布式的发展驱动因素开始,我们一起去探寻它的本质,自然而然地也就清楚它的定义了。


在今天这篇文章中,我将带你了解分布式的起源,是如何从单台计算机发展到分布式的,进而帮助你深入理解什么是分布式。为了方便你更好地理解这个演进过程,我将不考虑多核、多处理器的情况,假定每台计算机都是单核、单处理器的。

分布式起源

单兵模式:单机模式

1946 年情人节发布的 ENIAC 是世界上的第一台通用计算机,它占地 170 平米重达 30 吨,每秒可进行 5000 次加法或者 400 次乘法运算,标志着单机模式的开始。


所谓单机模式是指,所有应用程序和数据均部署在一台电脑或服务器上,由一台计算机完成所有的处理。


以铁路售票系统为例,铁路售票系统包括用户管理、火车票管理和订单管理等模块,数据包括用户数据、火车票数据和订单数据等,如果使用单机模式,那么所有的模块和数据均会部署在同一台计算机上,也就是说数据存储、请求处理均由该计算机完成。这种模式的好处是功能、代码和数据集中,便于维护、管理和执行。


单机模式的示意图,如下所示:




这里需要注意的是,本文的所有示意图中,紫色虚线表示在一台计算机内。


事物均有两面性,我们再来看看单机模式的缺点。单个计算机的处理能力取决于 CPU 和内存等,但硬件的发展速度和性能是有限的,而且升级硬件的性价比也是我们要考虑的,由此决定了 CPU 和内存等硬件的性能将成为单机模式的瓶颈。


你有没有发现,单机模式和单兵作战模式非常相似,单台计算机能力再强,就好比特种兵以一敌百,但终归能力有限。此外,将所有任务都交给一台计算机,也会存在将所有鸡蛋放到一个篮子里的风险,也就是单点失效问题。


归纳一下,单机模式的主要问题是:性能受限、存在单点失效问题。

游击队模式:数据并行或数据分布式

既然单机模式存在性能和可用性的问题。那么,有没有什么更好的计算模式呢?答案是肯定的。


为解决单机模式的问题,并行计算得到了发展,进而出现了数据并行(也叫作数据分布式)模式。并行计算采用消息共享模式使用多台计算机并行运行或执行多项任务,核心原理是每台计算机上执行相同的程序,将数据进行拆分放到不同的计算机上进行计算。


请注意,并行计算强调的是对数据进行拆分,任务程序在每台机器上运行。要达到这个目的,我们必须首先把单机模式中的应用和数据分离,才可能实现对数据的拆分。这里的应用就是执行任务的程序,任务就是提交的请求。以铁路售票系统为例,运行在服务器上的用户管理、火车票管理和订单管理等程序就是应用,用户提交的查询火车票、购买火车票的请求就是任务。


在单机模式中,应用和数据均在一台计算机或服务器上,要实现数据的并行,首先必须将应用和数据分离以便将应用部署到不同的计算机或服务器上;然后,对同类型的数据进行拆分,比方说,不同计算机或服务器上的应用可以到不同的数据库上获取数据执行任务。


以铁路售票系统的数据并行为例,主要包括两个步骤,如下所示:


第一步,将应用与数据分离,分别部署到不同的服务器上:




第二步,对数据进行拆分,比如把同一类型的数据拆分到两个甚至更多的数据库中,这样应用服务器上的任务就可以针对不同数据并行执行了。


对于铁路售票系统来说,根据线路将用户、火车票和订单数据拆分到不同的数据库中,部署到不同的服务器上,比如京藏线的数据放在数据库服务器 1 上的数据库中,沪深线的数据放在数据库服务器 2 上的数据库中。




需要注意的是,为了更好地帮助你理解这个数据拆分的过程,我在这里选择拆分数据库的方式进行讲解。由于数据库服务器本身的并发特性,因此你也可以根据你的业务情况进行选择,比方说所有业务服务器共用一个数据库服务器,而不一定真的需要去进行数据库拆分。


可以看出,在数据并行或数据分布式模式中,每台计算机都是全量地从头到尾一条龙地执行一个程序,就像一个全能的铁道游击队战士。所以,你也可以将这种模式形象地理解成游击队模式,就和铁道游击队插曲的歌词有点类似:“我们扒飞车那个搞机枪,撞火车那个炸桥梁……”


这种模式的好处是,可以利用多台计算机并行处理多个请求,使得我们可以在相同的时间内完成更多的请求处理,解决了单机模式的计算效率瓶颈问题。但这种模式仍然存在如下几个问题,在实际应用中,我们需要对其进行相应的优化:


  • 相同的应用部署到不同的服务器上,当大量用户请求过来时,如何能比较均衡地转发到不同的应用服务器上呢?解决这个问题的方法是设计一个负载均衡器,我会在”分布式高可靠“模块与你讲述负载均衡的相关原理。

  • 当请求量较大时,对数据库的频繁读写操作,使得数据库的 IO 访问成为瓶颈。解决这个问题的方式是读写分离,读数据库只接收读请求,写数据库只接收写请求,当然读写数据库之间要进行数据同步,以保证数据一致性。

  • 当有些数据成为热点数据时,会导致数据库访问频繁,压力增大。解决这个问题的方法是引入缓存机制,将热点数据加载到缓存中,一方面可以减轻数据库的压力,另一方面也可以提升查询效率。


从上面介绍可以看出,数据并行模式实现了多请求并行处理,但如果单个请求特别复杂,比方说需要几天甚至一周时间的时候,数据并行模式的整体计算效率还是不够高。


由此可见,数据并行模式的主要问题是:对提升单个任务的执行性能及降低时延无效。

集团军模式:任务并行或任务分布式

那么,有没有办法可以提高单个任务的执行性能,或者缩短单个任务的执行时间呢?答案是肯定的。任务并行(也叫作任务分布式)就是为解决这个问题而生的。那什么是任务并行呢?


任务并行指的是,将单个复杂的任务拆分为多个子任务,从而使得多个子任务可以在不同的计算机上并行执行。


我们仍以铁路售票系统为例,任务并行首先是对应用进行拆分,比如按照领域模型将用户管理、火车票管理、订单管理拆分成多个子系统分别运行在不同的计算机或服务器上。换句话说,原本包括用户管理、火车票管理和订单管理的一个复杂任务,被拆分成了多个子任务在不同计算机或服务器上执行,如下图所示:



可以看出,任务并行模式完成一项复杂任务主要有两个核心步骤:首先将单任务拆分成多个子任务,然后让多个子任务并行执行。这种模式和集团军模式很像,任务拆分者对应领导者,不同子系统对应不同兵种,不同子程序执行不同任务就像不同的兵种执行不同的命令一样,并且运行相同子系统或子任务的计算机又可以组成一个兵团。


在集团军模式中,由于多个子任务可以在多台计算机上运行,因此通过将同一任务待处理的数据分散到多个计算机上,在这些计算机上同时进行处理,就可以加快任务执行的速度。因为,只要一个复杂任务拆分出的任意子任务执行时间变短了,那么这个任务的整体执行时间就变短了。


当然,nothing is perfect。集团军模式在提供了更好的性能、扩展性、可维护性的同时,也带来了设计上的复杂性问题,毕竟对一个大型业务的拆分也是一个难题。不过,对于大型业务来讲,从长远收益来看,这个短期的设计阵痛是值得的。这也是许多大型互联网公司、高性能计算机构等竞相对业务进行拆分以及重构的一个重要原因。

分布式是什么?

讲了半天,那到底什么是分布式呢?


总结一下,分布式其实就是将相同或相关的程序运行在多台计算机上,从而实现特定目标的一种计算方式。


从这个定义来看,数据并行、任务并行其实都可以算作是分布式的一种形态。从这些计算方式的演变中不难看出,产生分布式的最主要驱动力量,是我们对于性能、可用性及可扩展性的不懈追求。

总结

在今天这篇文章中,我和你分享了分布式的起源,即从单机模式到数据并行(也叫作数据分布式)模式,再到任务并行(也叫作任务分布式)模式。


单机模式指的是,所有业务和数据均部署到同一台机器上。这种模式的好处是功能、代码和数据集中,便于维护、管理和执行,但计算效率是瓶颈。也就是说单机模式性能受限,也存在单点失效的问题。


数据并行(也叫作数据分布式)模式指的是,对数据进行拆分,利用多台计算机并行执行多个相同任务,通过在相同的时间内完成多个相同任务,从而缩短所有任务的总体执行时间,但对提升单个任务的执行性能及降低时延无效。


任务并行(也叫作任务分布式)模式指的是,单任务拆分成多个子任务,多个子任务并行执行,只要一个复杂任务中的任意子任务的执行时间变短了,那么这个业务的整体执行时间也就变短了。该模式在提高性能、扩展性、可维护性等的同时,也带来了设计上的复杂性问题,比如复杂任务的拆分。


在数据并行和任务并行这两个模式的使用上,用户通常会比较疑惑,到底是采用数据并行还是任务并行呢?


一个简单的原则就是:任务执行时间短,数据规模大、类型相同且无依赖,则可采用数据并行;如果任务复杂、执行时间长,且任务可拆分为多个子任务,则考虑任务并行。在实际业务中,通常是这两种模式并用。赶紧行动起来,去分析一下你的业务到底应该采用哪种分布式模式吧,加油!


最后你可以思考一下,你觉得分布式与传统的并行计算的区别是什么?你可以结合多核、多处理器的情况进行思考。


面试老问分布式,一脸懵怎么办?前华为分布式 Lab 资深技术专家聂鹏程,带你 12 周精通分布式核心技术。戳此试读>>>《分布式技术原理与算法解析》


2019-09-26 14:591402

评论

发布
暂无评论
发现更多内容

tomcat打包成rpm包

lee

tomcat rpm

第 7 周 性能优化(一)总结

蓝黑

极客大学架构师训练营

架构师训练营第八周作业

邓昀垚

极客大学架构师训练营

数据结构与算法系列之链表操作全集(三)(GO)

书旅

数据结构 Go 语言

终于啃完了这份Java核心原理+框架“面试圣经”,成功五面上岸美团

Java架构追梦

Java 架构 面试 微服务 框架开发

重磅解读:K8s Cluster Autoscaler模块及对应华为云插件Deep Dive

华为云开发者联盟

容器 k8s 服务

全面解析ArrayList,超详细!

程序员的时光

面试 ArrayList JAVA集合

简析低代码开发与传统开发的区别与优势

Marilyn

敏捷开发 低代码

每周一看:16份文档资料,程序员软硬实力全概览,总有一个适合你

小Q

Java 学习 程序员 架构 面试

架构师训练营第 1 期第 8 周作业

业哥

2020LF AI&DATA DAY(AI开源日):中国开源社区迈入全球化新征程

mongodb 源码实现系列 - 网络传输层模块实现三

杨亚洲(专注MongoDB及高性能中间件)

MySQL mongodb 分布式 高性能 分布式数据库mongodb

DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座

华章IT

数据库 postgresql

架构师训练营第 1 期第 7 周作业

owl

极客大学架构师训练营

数据结构与算法系列之栈&队列(GO)

书旅

数据结构与算法 Go 语言

解决大中型浏览器(Chrome)插件开发痛点:自定义热更新方案——2.基于双缓存更新功能模块

梁龙先森

Java chrome 大前端 浏览器 技术方案

架构师训练营第八周总结

邓昀垚

go-zero如何追踪你的请求链路

万俊峰Kevin

Trace microservice Go 语言

【涂鸦物联网足迹】API及SDK介绍

IoT云工坊

软件开发 物联网 API sdk 云平台

会展云技术解读 | 面对突发事故,APP如何做好崩溃分析与性能监控?

京东科技开发者

云计算 云服务

移动安全加固助力 App 实现全面、有效的安全防护

蚂蚁集团移动开发平台 mPaaS

安全攻防 App风险 mPaaS

《迅雷链精品课》第一课:认识区块链

迅雷链

区块链

阿里云官方推出操作系统“等保合规”镜像 -- Alibaba Cloud Linux 等保2.0三级版

阿里云基础软件团队

内核

“开源软件供应链点亮计划-暑期2020”公布结果 基于ChubaoFS开发的项目获得最佳质量奖

京东科技开发者

大数据 开源 云原生

接口测试如何在post请求中传递文件

测试人生路

接口测试

天啦撸!打印日志竟然只晓得 Log4j?

沉默王二

Java 日志 log4j

技术分享:WebAssembly能否重新定义前端开发模式?

葡萄城技术团队

webassembly

分库分表的 9种分布式主键ID 生成方案,挺全乎的

程序员小富

分库分表 Java 分布式

嗯,查询滑动窗口最大值的这4种方法不错...

王磊

Java 数据结构和算法

【云小课】版本管理发展史之Git+——代码托管

华为云开发者联盟

git 代码管理 托管

医疗界“最强大脑”落户杭州!阿里巴巴联合浙大一院共同打造

互联网

分布式缘何而起?从单兵,到游击队,到集团军_架构_聂鹏程_InfoQ精选文章