2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

  • 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:591839

评论

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

电商系统拆分微服务

gawaine

架构师训练

架构1期模块六作业

五只羊

架构实战营

模块六作业

VE

架构实战营

instanceof运算符的实质:Java继承链与JavaScript原型链

zhoulujun

JavaScript 原型链 instanceof constructor prototype

微信朋友圈高性能复杂度分析模拟

穿裤子的云

架构实战营

模块二作业

Geek_fc100d

架构实战营

架构训练营模块六作业

高铎

架构实战营

架构实战营第六模块作业

子豪sirius

架构实战营

网络攻防学习笔记 Day120

穿过生命散发芬芳

网络安全 8月日更

架构实战营模块一

WolvesLeader

架构实战营

膜拜!首次公布Java10W字面经,Github访问量破百万

今晚早点睡

Java 程序员 计算机

大数据0815作业

朱磊

政府与市场应该如何互动

石云升

8月日更 财经思维

在字节奋战8年,今天回头一看只剩下这份1857页的算法笔记了

编程susu

Java 编程 程序员 计算机 技术宅

阿里P8熬了一个月肝出这份32W字Java面试手册,在Github标星31K+

编程susu

Java 编程 程序员 计算机 技术宅

消息队列Kafka:源码解读(一)-异步任务管理

正向成长

kafka源码 时钟轮 TimingWheel

架构训练营模块五作业

高铎

架构实战营

模块六作业

河马先生

架构实战营

模块一作业

南山先生

#架构实战营

极客时间---架构实战营2期---模块一作业

Dylan TANG

极客时间 架构实战营 作业一

VR运动病要想好,FemTech少不了

脑极体

从命令执行到GetShell,适合新手学习

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

字节跳动三面拿offer:网络+IO+redis+JVM+GC+红黑树+数据结构

编程susu

Java 编程 程序员 计算机 技术宅

深入了解RocketMQ之NameServer

邱学喆

KVConfigManager RouteInfoManager

05. AI就是会学习的计算机程序:从机器学习角度看AI

Databri_AI

人工智能

模块6

Geek_ywh40v

架构实战营模块六作业

maybe

Python代码阅读(第21篇):将变量名称转换为蛇式命名风格

Felix

Python 编程 Code Programing 阅读代码

模块6作业

SAKIN

架构实战营作业 M06

Shawn Liu

「架构实战营」

Java面试很难?啃完阿里老哥这套Java架构速成笔记,我都能拿30K

Java 编程 架构 面试 程序人生

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