分布式缘何而起
与其直接用些抽象、晦涩的技术名词去给分布式下一个定义,还不如从理解分布式的发展驱
动因素开始,我们一起去探寻它的本质,自然而然地也就清楚它的定义了。
在今天这篇文章中,我将带你了解分布式的起源,是如何从单台计算机发展到分布式的,进
而帮助你深入理解什么是分布式。为了方便你更好地理解这个演进过程,我将不考虑多核、
多处理器的情况,假定每台计算机都是单核、单处理器的。
分布式起源
单兵模式:单机模式
1946 年情人节发布的 ENIAC 是世界上的第一台通用计算机,它占地 170 平米重达 30
吨,每秒可进行 5000 次加法或者 400 次乘法运算,标志着单机模式的开始。
所谓单机模式是指,所有应用程序和数据均部署在一台电脑或服务器上,由一台计算机完成
所有的处理。
以铁路售票系统为例,铁路售票系统包括用户管理、火车票管理和订单管理等模块,数据包
括用户数据、火车票数据和订单数据等,如果使用单机模式,那么所有的模块和数据均会部
署在同一台计算机上,也就是说数据存储、请求处理均由该计算机完成。这种模式的好处是
功能、代码和数据集中,便于维护、管理和执行。
单机模式的示意图,如下所示:
这里需要注意的是,本文的所有示意图中,紫色虚线表示在一台计算机内。
事物均有两面性,我们再来看看单机模式的缺点。单个计算机的处理能力取决于 CPU 和内
存等,但硬件的发展速度和性能是有限的,而且升级硬件的性价比也是我们要考虑的,由此
决定了 CPU 和内存等硬件的性能将成为单机模式的瓶颈。
你有没有发现,单机模式和单兵作战模式非常相似,单台计算机能力再强,就好比特种兵以
一敌百,但终归能力有限。此外,将所有任务都交给一台计算机,也会存在将所有鸡蛋放到
一个篮子里的风险,也就是单点失效问题。
归纳一下,单机模式的主要问题是:性能受限、存在单点失效问题。
游击队模式:数据并行或数据分布式
既然单机模式存在性能和可用性的问题。那么,有没有什么更好的计算模式呢?答案是肯定
的。
为解决单机模式的问题,并行计算得到了发展,进而出现了数据并行(也叫作数据分布式)
模式。并行计算采用消息共享模式使用多台计算机并行运行或执行多项任务,核心原理是每
台计算机上执行相同的程序,将数据进行拆分放到不同的计算机上进行计算。
请注意,并行计算强调的是对数据进行拆分,任务程序在每台机器上运行。要达到这个目
的,我们必须首先把单机模式中的应用和数据分离,才可能实现对数据的拆分。这里的应用
就是执行任务的程序,任务就是提交的请求。以铁路售票系统为例,运行在服务器上的用户
管理、火车票管理和订单管理等程序就是应用,用户提交的查询火车票、购买火车票的请求
就是任务。
在单机模式中,应用和数据均在一台计算机或服务器上,要实现数据的并行,首先必须将应
用和数据分离以便将应用部署到不同的计算机或服务器上;然后,对同类型的数据进行拆
分,比方说,不同计算机或服务器上的应用可以到不同的数据库上获取数据执行任务。
以铁路售票系统的数据并行为例,主要包括两个步骤,如下所示:
第一步,将应用与数据分离,分别部署到不同的服务器上:
第二步,对数据进行拆分,比如把同一类型的数据拆分到两个甚至更多的数据库中,这样应
用服务器上的任务就可以针对不同数据并行执行了。
对于铁路售票系统来说,根据线路将用户、火车票和订单数据拆分到不同的数据库中,部署
到不同的服务器上,比如京藏线的数据放在数据库服务器 1 上的数据库中,沪深线的数据
放在数据库服务器 2 上的数据库中。
需要注意的是,为了更好地帮助你理解这个数据拆分的过程,我在这里选择拆分数据库的方
式进行讲解。由于数据库服务器本身的并发特性,因此你也可以根据你的业务情况进行选
择,比方说所有业务服务器共用一个数据库服务器,而不一定真的需要去进行数据库拆分。
可以看出,在数据并行或数据分布式模式中,每台计算机都是全量地从头到尾一条龙地执行
一个程序,就像一个全能的铁道游击队战士。所以,你也可以将这种模式形象地理解成游击
队模式,就和铁道游击队插曲的歌词有点类似:“我们扒飞车那个搞机枪,撞火车那个炸桥
梁……”
这种模式的好处是,可以利用多台计算机并行处理多个请求,使得我们可以在相同的时间内
完成更多的请求处理,解决了单机模式的计算效率瓶颈问题。但这种模式仍然存在如下几个
问题,在实际应用中,我们需要对其进行相应的优化:
从上面介绍可以看出,数据并行模式实现了多请求并行处理,但如果单个请求特别复杂,比
方说需要几天甚至一周时间的时候,数据并行模式的整体计算效率还是不够高。
由此可见,数据并行模式的主要问题是:对提升单个任务的执行性能及降低时延无效。
集团军模式:任务并行或任务分布式
那么,有没有办法可以提高单个任务的执行性能,或者缩短单个任务的执行时间呢?答案是
肯定的。任务并行(也叫作任务分布式)就是为解决这个问题而生的。那什么是任务并行
呢?
任务并行指的是,将单个复杂的任务拆分为多个子任务,从而使得多个子任务可以在不同的
计算机上并行执行。
相同的应用部署到不同的服务器上,当大量用户请求过来时,如何能比较均衡地转发到不
同的应用服务器上呢?解决这个问题的方法是设计一个负载均衡器,我会在”分布式高可
靠“模块与你讲述负载均衡的相关原理。
当请求量较大时,对数据库的频繁读写操作,使得数据库的 IO 访问成为瓶颈。解决这个
问题的方式是读写分离,读数据库只接收读请求,写数据库只接收写请求,当然读写数据
库之间要进行数据同步,以保证数据一致性。
当有些数据成为热点数据时,会导致数据库访问频繁,压力增大。解决这个问题的方法是
引入缓存机制,将热点数据加载到缓存中,一方面可以减轻数据库的压力,另一方面也可
以提升查询效率。