分布式:从单台计算机到分布式的演化

分布式起源

单机模式

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

以铁路售票系统为例,铁路售票系统包括用户管理、火车票管理和订单管理等模块,数据包括用户数据、火车票数据和订单数据等,如果使用单机模式,那么所有的模块和数据均会部署在同一台计算机上,也就是说数据存储、请求处理均由该计算机完成。如下图:

在这里插入图片描述

  • 这种模式的好处是功能、代码和数据集中,便于维护、管理和执行。
  • 缺点是单个计算机的处理能力取决于 CPU 和内存等,但硬件的发展速度和性能是有限的,而且升级硬件的性价比也是我们要考虑的,由此决定了 CPU 和内存等硬件的性能将成为单机模式的瓶颈。另外,将所有任务都交给一台计算机,可能会存在单点失效的问题

数据并行或数据分布式

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

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

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

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

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

在这里插入图片描述

  • 第二步,对数据进行拆分,比如把同一类型的数据拆分到两个甚至更多的数据库中,这样应用服务器上的任务就可以针对不同数据并行执行了。
    在这里插入图片描述
    对于铁路售票系统来说,根据线路将用户、火车票和订单数据拆分到不同的数据库中,部署到不同的服务器上,比如京藏线的数据放在数据库服务器 1 上的数据库中,沪深线的数据放在数据库服务器 2 上的数据库中。

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

  • 相同的应用部署到不同的服务器上,当大量用户请求过来时,如何能比较均衡的转发到不同的应用程序服务器上呢?解决这个问题的方法是设计一个负载均衡器
  • 当请求量较大时,对数据库的频繁读写操作,使得数据库的IO访问成为瓶颈。解决这个问题的方法是读写分离,读数据库只接收读请求,写数据库只接收写请求,当然读写数据库之间要进行数据同步,以保证数据一致性
  • 当有些数据成为热点数据时,会导致数据库访问频繁,压力增大。解决方法是引入缓存机制,将热点数据加载到缓存中,一方面可以减轻数据库的压力,一方面也可以提升查询效率。

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

也就是说,数据并行模式的主要问题是:对提升单个任务的执行性能以及降低时延无效

任务并行或者任务分布式

那么,有没有办法可以提高单个任务的执行性能,或者缩短单个任务的执行时间呢?这就引入了任务并行(也叫做任务分布式)

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

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

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

由于多个子任务可以在多台计算机上运行,因此通过将同一任务待处理的数据分散到多个计算机上,在这些计算机上同时进行处理,就可以加快任务执行的速度。

集团军模式在提供了更好的性能、扩展性、可维护性的同时,也带来了设计上的复杂性问题

分布式是什么?

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

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

总结

  • 单机模式指的是,所有业务和数据都部署到同一台机器上。这种模式的好处时功能、代码和数据集中,便于维护、管理和执行,但计算效率时瓶颈。也就是说单机模式性能受限,也存在单点失效的问题
  • 数据并行(也叫做数据分布式)模式指的是,对数据进行拆分,利用多台计算机并行执行多个相同的任务,通过在相同时间内完成多个相同任务,从而缩短所有任务的总体执行时间,但是对提升单个任务的执行性能以及降低时延无效。
  • 任务并行(也叫做任务分布式)模式指的是,单任务拆分成多个子任务,多个子任务并行执行,只要一个复杂任务中的任意子任务的执行时间变短了,那么这个业务的整体执行时间也就变短了。该模式在提高性能、扩展性、可维护性等的同时,也带来了设计上的复杂性问题,比如复杂任务的拆分。

问题是什么时候用数据并行什么时候用任务并行呢?一个简单的原则是:任务执行时间短、数据规模大、类型相同而且无依赖,则可以采用数据并行;如果任务复杂、执行时间长、而且任务可以拆分为多个子任务,则考虑任务并行。在实际业务中,通常是这两种模式并用。