分布式协调与同步算法

分布式技术的发展:

  1. 单机模式

所有应用程序和数据均部署在一台电脑或服务器上,由一台计算机完成所有的处理。模式的好处是功能、代码和数据集中,便于维护、管理和执行。但是CPU 和内存等硬件的性能将成为单机模式的瓶颈,会出现性能受限、单点失效问题

  1. 数据并行或数据分布式

并行计算采用消息共享模式使用多台计算机并行运行或执行多项任务,核心原理是每台计算机上执行相同的程序,将数据进行拆分放到不同的计算机上进行计算。好处是,可以利用多台计算机并行处理多个请求,使得我们可以在相同的时间内完成更多的请求处理,解决了单机模式的计算效率瓶颈问题。但是还存在着以下问题:

  • 相同的应用部署到不同的服务器上,当大量用户请求过来时,如何能比较均衡地转发到不同的应用服务器上呢。
  • 当请求量较大时,对数据库的频繁读写操作,使得数据库的 IO 访问成为瓶颈。
  • 当有些数据成为热点数据时,会导致数据库访问频繁,压力增大。

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

  1. 任务并行或任务分布式

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

任务并行模式完成一项复杂任务主要有两个核心步骤:首先将单任务拆分成多个子任务,然后让多个子任务并行执行。提供了更好的性能、扩展性、可维护性的同时,也带来了设计上的复杂性问题。

分布式其实就是将相同或相关的程序运行在多台计算机上,从而实现特定目标的一种计算方式。产生分布式的最主要驱动力量,是我们对于性能、可用性及可扩展性的不懈追求。

分布式系统的指标

分布式系统的出现就是为了用廉价的、普通的机器解决单个计算机处理复杂、大规模数据和任务时存在的性能问题、资源瓶颈问题,以及可用性和可扩展性问题。换句话说,分布式的目的是用更多的机器,处理更多的数据和更复杂的任务。

  • 性能性能指标,包括吞吐量(Throughput)、响应时间(Response Time)和完成时间(Turnaround Time)。

    吞吐量指的是,系统在一定时间内可以处理的任务数。常见的吞吐量指标有 QPS(Queries PerSecond)、TPS(Transactions Per Second)和 BPS(Bits Per Second)。

    响应时间指的是,系统响应一个请求或输入需要花费的时间。

    完成时间指的是,系统真正完成一个请求或处理需要花费的时间。

  • 可用性

    可用性,通常指的是系统在面对各种异常时可以正确提供服务的能力。可用性是分布式系统的一项重要指标,衡量了系统的鲁棒性,是系统容错能力的体现。

    可靠性通常用来表示一个系统完全不出故障的概率,更多地用在硬件领域。而可用性则更多的是指在允许部分组件失效的情况下,一个系统对外仍能正常提供服务的概率。

  • 可扩展性

可扩展性,指的是分布式系统通过扩展集群机器规模提高系统性能 (吞吐、响应时间、 完成时间)、存储容量、计算能力的特性,是分布式系统的特有性质。

当任务的需求随着具体业务不断提高时,除了升级系统的性能做垂直 / 纵向扩展外,另一个做法就是通过增加机器的方式去水平 / 横向扩展系统规模。

垂直 / 纵向扩展指的是,增加单机的硬件能力,比如 CPU 增强、内存增大等;水平 /横向扩展指的就是,增加计算机数量。好的分布式系统总在追求“线性扩展性”,

  • 资源占用

在分布式系统里,以排他性的资源访问方式,叫作分布式互斥(Distributed Mutual Exclusion),而这种被互斥访问的共享资源就叫作临界资源(Critical Resource)。

集中式算法

引入一个协调者程序,得到一个分布式互斥算法。每个程序在需要访问临界资源时,先给协调者发送一个请求。如果当前没有程序使用这个资源,协调者直接授权请求程序访问;否则,按照先来后到的顺序为请求程序“排一个号”。如果有程序使用完资源,则通知协调者,协调者从“排号”的队列里取出排在最前面的请求,并给它发送授权消息。拿到授权消息的程序,可以直接去访问临界资源。

在这里插入图片描述
从上述流程可以看出,一个程序完成一次临界资源访问,需要如下几个流程和消息交互:

  • 向协调者发送请求授权信息,1 次消息交互;
  • 协调者向程序发放授权信息,1 次消息交互;
  • 程序使用完临界资源后,向协调者发送释放授权,1 次消息交互。
    因此,每个程序完成一次临界资源访问,需要进行 3 次消息交互。

集中式算法的优点在于**直观、简单、信息交互量少、易于实现,并且所有程序只需和协调者通信,程序之间无需通信。**但是,这个算法的问题也出在了协调者身上。

  • 协调者会成为系统的性能瓶颈。想象一下,如果有 100 个程序要访问临界资源,那么协调者要处理 100*3=300 条消息。也就是说,协调者处理的消息数量会随着需要访问临界资源的程序数量线性增加。
  • 容易引发单点故障问题。协调者故障,会导致所有的程序均无法访问临界资源,导致整个系统不可用。

分布式算法

当一个程序要访问临界资源时,先向系统中的其他程序发送一条请求消息,在接收到所有程序返回的同意消息后,才可以访问临界资源。其中,请求消息需要包含所请求的资源、请求者的 ID,以及发起请求的时间。在分布式领域中,我们称之为分布式算法,或者使用组播和逻辑时钟的算法。

完成一次临界资源的访问,需要进行如下的信息交互:

  • 向其他 n-1 个程序发送访问临界资源的请求,总共需要 n-1 次消息交互;
  • 需要接收到其他 n-1 个程序回复的同意消息,方可访问资源,总共需要 n-1 次消息交互。
    可以看出,一个程序要成功访问临界资源,至少需要 2*(n-1) 次消息交互。假设,现在系统中的 n 个程序都要访问临界资源,则会同时产生 2n(n-1) 条消息。总结来说,在大型系统中使用分布式算法,消息数量会随着需要访问临界资源的程序数量呈指数级增加,容易导致高昂的“沟通成本”。

分布式算法根据“先到先得”以及“投票全票通过”的机制,让每个程序按时间顺序公平地访问资源,简单粗暴、易于实现。但,这个算法可用性很低,主要包括两个方面的原因:

  • 当系统内需要访问临界资源的程序增多时,容易产生“信令风暴”,也就是程序收到的请求完全超过了自己的处理能力,而导致自己正常的业务无法开展。
  • 一旦某一程序发生故障,无法发送同意消息,那么其他程序均处在等待回复的状态中,使得整个系统处于停滞状态,导致整个系统不可用。所以,相对于集中式算法的协调者故障,分布式算法的可用性更低

所以分布式算法适合节点数目少且变动不频繁的系统,且由于每个程序均需通信交互,因此适合 P2P 结构的系统。比如,运行在局域网中的分布式文件系统,具有 P2P 结构的系统等。

分布式算法是一个“先到先得”和“投票全票通过”的公平访问机制,但通信成本较高,可用性也比集中式算法低,适用于临界资源使用频度较低,且系统规模较小的场景。

令牌环算法

所有程序构成一个环结构,令牌按照顺时针(或逆时针)方向在程序之间传递,收到令牌的程序有权访问临界资源,访问完成后将令牌传送到下一个程序;若该程序不需要访问临界资源,则直接把令牌传送给下一个程序。
在这里插入图片描述
令牌环算法里单个程序具有更高的通信效率。同时,在一个周期内,每个程序都能访问到临界资源,因此令牌环算法的公平性很好。

但是,不管环中的程序是否想要访问资源,都需要接收并传递令牌,所以也会带来一些无效通信。假设系统中有 100 个程序,那么程序 1 访问完资源后,即使其它 99 个程序不需要访问,也必须要等令牌在其他 99 个程序传递完后,才能重新访问资源,这就降低了系统的实时性。

综上,令牌环算法非常适合通信模式为令牌环方式的分布式系统,例如移动自组织网络系统。一个典型的应用场景就是无人机通信。

令牌环算法是一种更加公平的算法,通常会与通信令牌结合,从而取得很好的效果。特别是当系统支持广播或组播通信模式时,该算法更加高效、可行。

对于集中式和分布式算法都存在的单点故障问题,在令牌环中,若某一个程序(例如上图的无人机 2)出现故障,则直接将令牌传递给故障程序的下一个程序(例如,上图中无人机 1 直接将令牌传送给无人机 3),从而很好地解决单点故障问题,提高系统的健壮性,带来更好的可用性。但,这就要求每个程序都要记住环中的参与者信息,这样才能知道在跳过一个参与者后令牌应该传递给谁。

时下有一个很流行的互斥算法,两层结构的分布式令牌环算法,把整个广域网系统中的节点组织成两层结构,可以用于节点数量较多的系统,或者是广域网系统。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值