在如今互联网技术高速发展的背景下,分布式技术已经是各种技术革命的先驱,它早已不再局限于传统的互联网等应用场景。诸如IoT物联网、Mobile移动计算、AI人工智能、Blockchain区块链、Cloud云计算、Data大数据、Edge边缘计算,无不都是以分布式技术为基石。在互联网这个领域,分布式技术更加是各大型互联网公司和大型项目必然具备的技能。毫不夸张地说,没有分布式技术就没有如今的互联网,也就没有诸如阿里巴巴、腾讯这样的巨无霸互联网公司。
虽然各大互联网公司都有或多或少的裁员计划,但是分布式技术人才却依然是各大公司争夺的焦点,因为哪个公司更好的掌握了分布式技术,哪个公司就更容易在新一轮技术浪潮中获得主动。
接下来就通过分布式技术的起源来说明什么是分布式技术
单兵模式:单机模式
1946年情人节发布的ENIAC是世界上的第一台通用计算机,它占地170平米重达30吨,每秒可进行5000次加法或者400次乘法运算,标志着单机模式的开始。
所谓单机模式是指,所有应用程序和数据均部署在一台电脑或服务器上,由一台计算机完成所有的处理。
以火车票系统为例,包括用户管理、火车票管理和订单管理等模块,每个模块都包含自己的数据,单机模式下,所有的模块和数据均会部署在同一台计算机上,整个系统所有的功能都部署在一台计算机上。
如下图,蓝色虚线代表一台计算机。
图片
这种模式的好处是功能、代码和数据集中,便于维护、管理和执行。
这种模式的缺点是对于大型系统来说,牵一发而动全身,一个简单功能的修改,就要以短时间停止整个系统的代价来进行升级系统。
再就是随着系统的不断更新迭代,系统会越来越庞大,这对单个计算机的处理能力有极高的要求,单个计算机的处理能力取决于CPU和内存等,但硬件的发展速度和性能是有限的,而且升级硬件的性价比也是我们要考虑的,由此决定了CPU和内存等硬件的性能将成为单机模式的瓶颈。
然而所有的功能及数据都部署在一台计算机上面,那么系统能否正常运行就依赖于这台计算机是否健壮,计算机一旦宕机,那么整个系统将瘫痪,不可用。
归纳一下,单机模式的主要问题是:性能受限、升级困难、存在单点失效问题。
多兵模式:数据分布式
单兵模式是就像是一个士兵执行多项任务,当任务越来越多的时候,一个士兵累死也完不成目标,那就多个士兵一起分做这些任务。
为解决单机模式的问题,并行计算得到了发展,进而出现了数据并行(也叫作数据分布式)模式。
在这个模式下,数据并行强调对数据进行拆分,并且应用程序并行运行,也就是将相同应用程序部署在多台计算机上。要达到这个目的,我们必须首先把单机模式中的应用程序和数据分离,然后再实现对数据的拆分。这里所说的任务就是提交的请求。
以铁路售票系统为例,整个系统包含用户管理模块,火车票管理模块,订单模块。
第一步,将应用与数据分离,分别部署到不同的服务器上:
第二步,对数据进行拆分,比如把同一类型的数据拆分到两个甚至更多的数据库中,这样应用服务器上的任务就可以针对不同数据并行执行了。
对于铁路售票系统来说,根据线路将用户、火车票和订单数据拆分到不同的数据库中,部署到不同的服务器上,比如京藏线的数据放在数据库服务器1上的数据库中,沪深线的数据放在数据库服务器2上的数据库中。
图片
这种模式的好处表现为以下两点:
- 可以将大量的任务分门别类的分配给多台应用服务器,每个应用服务器对应的数据也是独立的,提高了数据访问效率。这样一来,相同的时间内可以让大量的任务并行处理,相比于单机模式,相同的时间内能完成更多的任务量。
- 计算机成本方面,因为多台部署,每台计算机分摊任务数,实际每台计算机处理的任务数不是很多,对计算机的配置要求不是很高,因此成本方面短期内可能会略高于单机模式,但从长远来看,必然是低于单机模式的。
这种模式的缺点表现为以下两点:
- 数据分布式模式的运维复杂度相比于单机模式高很多:
首先每台应用服务器分摊任务数,那么哪些任务由哪台应用服务器处理这个问题需要有方案解决,一般是通过负载均衡器分发任务,那是实现负载均衡器无疑提高了系统的复杂性。
其次随着业务发展,分摊到每台应用服务器的任务数变的很大的时候,应用服务器频繁对数据库进行访问,很容易达到数据库io瓶颈,此时就需要有方案解决数据库io问题,一般采用的是数据库读写分离,在进行读写分离的时候又要特别注意主库和从库的数据一致性问题,这无疑提高了整个系统的复杂性。
再就是业务中往往会使得一批数据成为热点数据,此时会导致数据库访问频繁,即便是读写分离也无法抗住这瞬间爆发的请求量,这个时候不得不引入缓存机制,将数据缓存到内存,但是内存是有限的,这就要求缓存机制必须具备缓存失效,缓存预热等功能,这无疑增加了系统的复杂性。
不难看出数据分布式模式本来就是任务数增多后的产物,那系统的复杂性也理所应当会升高,这无可厚非,好在目前市场上对以上的问题都有成熟的解决方案。
2.数据分布式模式实现了多请求并行处理,但是并没有从根本上解决单个请求的性能问题,比方说一个请求在单机模式下需要几天甚至更长的时间来完成,数据分布式模式下并没有减少这个请求的完成时间。
由此可见,数据并行模式的主要问题是:对提升单个任务的执行性能及降低时延无效。
多兵种模式:任务分布式
多兵模式将大量的任务进行分摊处理,每个大兵将任务从头到尾处理完成,这样保证了整体任务的处理效率,但是却无法提高单个任务的处理效率。假设多兵模式是将同个兵种10名士兵组成一个团体来完成任务,那么多兵种模式就是将多个兵种的士兵一共10名组成一个团体来完成任务,在这个团体中可能每个兵种有一个或者两个或者三个士兵,在执行任务的时候多个不同兵种的士兵共同完成一个任务。多兵种模式就是将任务进行拆分,提高单个任务的效率
任务分布式指的是,将单个复杂的任务拆分为多个子任务,从而使得多个子任务可以在不同的计算机上并行执行。 任务分布式模式强调的是对任务进行拆分。就是将一个复杂的业务中的一条任务拆分成几个子任务,这些子任务中有个是需要串行执行,有的则可以并行执行,而那些可以并行执行的子任务就是提升整个任务效率的关键。
我们仍以铁路售票系统为例,当购买火车票的时候,整个购买业务流程为:查询用户,查询火车票,下单购买。任务拆分前,这个业务流程是串行的,耗时为这三个操作的时间和,任务分布式模式下的做法是将用户管理、火车票管理、订单管理拆分成多个子系统分别运行在不同的计算机或服务器上。这样一来,查询用户和查询火车票的子任务是可以同时进行的,总耗时不再是两者之和,而是两者中最大的那个耗时,如下图所示:
图片
上面说的火车票的例子比较很笼统的,我们再拿一个电商的项目来说明下:
比如我们要买一个商品,商品页面做了什么呢?商品页面需要展示商品列表,推荐列表,商品类别展示,商家信息等等,在单机模式下,这些信息都将是一台计算机完成查询的,那么这些操作将是串行的,无疑查询时间是很长的,你或许会说利用多线程可以将不同的查询并行操作,这样也是可以减少耗时,但是你要知道不管有多少个线程并行,单台计算机上的多线程并行其实都是cpu交替运行(这里不考虑多cpu多核),说白了无非是在充分压榨cpu的基础上依然保持串行查询。任务分布式模式下就会将推荐系统分离出来单独部署在一台服务器,将商品系统分离出来单独部署一台服务器,商家系统分离出来单独部署一台服务器,这样在查询商品列表的时候,商品系统可以利用多线程的方式并行调用推荐系统和商家系统分别查询推荐列表和商家信息。这样才能真正的实现并行查询。
任务分布式的思想其实是任务拆分,但是拆分后的任务并不要求一定可以保持并行,对于一个复杂的任务,如果拆分出来的任务都必须保持串行才符合业务,那么拆分依然是有意义的,因为将一个大的系统拆分成多个小的系统后,当某个小功能需要升级时,只需要升级那个对应的小的子系统即可,避免了牵一发而动全身,而且代码分开维护也会降低开发成本,这也是分而治之的上乘思想。
**多兵种模式在提供了更好的性能、扩展性、可维护性的同时,也带来了设计上的复杂性问题 **
分布式是什么?
说了半天分布式发展历程,那到底什么是分布式呢?
顾名思义,其实就是分开部署的方式,所谓分开是指庞大的数据体系分成小的可以独立的数据体系,复杂的系统拆分成功能单一的小的子系统,拆分后的独立体系各自部署在独立的计算机上运行。换个说法就是将相同或相关的程序运行在多台计算机上,从而实现特定目标的一种计算方式。
从这个定义来看,数据并行、任务并行其实都可以算作是分布式的一种形态。从这些计算方式的演变中不难看出,产生分布式的最主要驱动力量,是我们对于性能、可用性及可扩展性的不懈追求。
实现分布式涉及到哪些内容呢?
我们上面只是对概念的阐述,其实实现分布式还是比较复杂的,会涉及到很多技术,但是仔细总结还是有章可循的,下图基本可以概括分布式技术全部了吧。
图片
这张图是按照业务的架构层次线,自底向上按照资源、通信、数据与计算的维度,梳理出了4个横向技术层次:
- 分布式资源池化
- 分布式通信
- 分布式数据存储与管理
- 分布式计算
这样的划分符合业务架构设计的一般规律,即“在一定资源上,进行一定通信,通过一定计算,完成一定数据的加工和处理,从而对外提供特定的服务”。
其实上面的这句话是分布式技术的基础:既然是分布式系统,那么计算机(应用程序)之间一定要通信,每个计算机(应用程序)一定会有数据存储,也一定会有业务逻辑处理(计算),还有不同的业务子系统对计算机配置的以来程度也不一样。
那么,通信是哪台计算机(应用程序)对哪台计算机(应用程序)通信,存储是如何存储,如果是多台计算机(应用程序)可以提供计算,那么由哪台计算机(应用程序)最终提供计算,如果多个计算机(应用程序)同时修改共享资源,那么如何保证不会出现数据一致性问题,如果计算机(应用程序)宕机,又该如何处理,这些问题的需要一个组织者,这个组织者进行协同,调度,追踪这些计算机(应用程序),保证系统的高可用,数据一致性,同时还要兼顾性能和扩展性。