分布式技术架构原理解析之协调与同步(一)分布式互斥

分布式互斥

通过**《分布式技术架构原理解析之序篇》**,对分布式系统有了一个初步了解。今天,和大家一起分享:分布式协调与同步。学习如何让分布在不同计算机上的程序具有“团队精神”,换句话说就是如何让程序通过协作共同去达成一个业务目标。首先我们来看一下分布式互斥呢。
在分布式系统里,对于同一共享资源,在同一时刻只能被一个程序访问,叫作分布式互斥(Distributed Mutual Exclusion),而这种被互斥访问的共享资源就叫作临界资源(Critical Resource)

1分布式互斥实现

1.1 集中式算法

举一个例子你正在一家餐厅使用自助咖啡机泡制咖啡,突然有个人过来挪走了你的杯子,开始泡制他自己的咖啡。就像我们使用自助咖啡机时不希望被打扰一样,对于同一共享资源,一个程序正在使用的时候也不希望被其他程序打扰。对于这个咖啡机,我们首先想到的就是,增加一个“协调者”来约束大家使用自助咖啡机,解决强行插入打断别人的问题。
类似地,我们引入一个协调者程序:

  • 每个程序在需要访问临界资源时,先给协调者发送一个请求。如果当前没有程序使用这个资源,协调者直接授权请求程序访问;
  • 否则,按照先来后到的顺序为请求程序“排一个号”在队列中等待;
  • 如果有程序使用完资源,则通知协调者,协调者从“排号”的队列里取出排在最前面的请求,并给它发送授权消息;
  • 拿到授权消息的程序,可以直接去访问临界资源。
    这个互斥算法,就是我们所说的集中式算法,也可以叫做中央服务器算法。之所以这么称呼,是因为协调者代表着集中程序或中央服务器。
    集中式算法的示意图如下所示:
    集中式算法示意图
    上图中有程序1、程序2、程序3、程序4四个普通程序,另一个程序为协调者。按照集中式算法程序的请求流程如下:
    1、当程序 2 和程序 4 需要使用临界资源时,它们会向协调者发起申请,请求协调者授权,但是程序 3正在使用临界资源。2、这时,协调者根据程序 2 和 4 的申请时间顺序,依次将它们放入等待队列。(在这个案例里,程序 4 的申请时间早于程序2,因此排在程序 2 的前面);
    3、程序 3 使用完临界资源后,通知协调者释放授权。
    4、协调者从等待队列中取出程序4,并给它发放授权。程序 4 就可以使用临界资源了。
    从上述流程可以看出,一个程序完成一次临界资源访问,需要如下几个流程和消息交互
  • 向协调者发送请求授权信息,1 次消息交互;
  • 协调者向程序发放授权信息,1 次消息交互;
  • 程序使用完临界资源后,向协调者发送释放授权,1
    次消息交互。
    因此,每个程序完成一次临界资源访问,需要进行 3 次消息交互
集中算法特点

集中式算法具有简单易于实现的特点,但可用性、性能易受协调者影响。在实际应用场景中选择集中式算法的时候,一定要选择性能好、可靠性高的服务器来运行协调者,同时要做好主备备份,主故障后备可以立马升为主。

1.2 分布式算法

既然引入协调者会有单点故障、性能等问题,那么是否可换一个思路,来实现对临界资源的互斥访问呢?
当一个程序要访问临界资源时,先向系统中的其他程序发送一条请求消息,在接收到所有程序返回的同意消息后,才可以访问临界资源。其中,请求消息需要包含所请求的资源请求者的 ID,以及发起请求的时间
这就是民主协商法。在分布式领域中,我们称之为分布式算法,或者使用组播和逻辑时钟的算法。
如下图所示程序 1、2、3 需要访问共享资源 A。在时间戳为 8 的时刻,程序 1 想要使用资源 A,于是向程序 2 和 3 发起使用资源 A 的申请,希望得到它们的同意。在时间戳为 12 的时刻,程序 3 想要使用资源 A,于是向程序 1 和 2 发起访问资源 A 的请求。
程序1和程序3差不多同一时间要访问共享资源A
如图所示,此时程序 2 暂时不访问资源 A,因此同意了程序 1 和 3 的资源访问请求。对于程序 3 来说,由于程序 1 提出请求的时间更早,因此同意程序 1 先使用资源,并等待程序 1 返回同意消息。
程序1的请求时间比程序3更早,获得所有授权,访问资源A
如图所示,程序 1 接收到其他所有程序的同意消息之后,开始使用资源 A。当程序 1 使用完资源 A 后,释放使用权限,向请求队列中需要使用资源 A 的程序 3 发送同意使用资源的消息,并将程序 3 从请求队列中删除。此时,程序 3 收到了其他所有程序的同意消息,获得了使用资源 A 的权限,开始使用临界资源 A 的旅程。
程序1释放资源A,程序3获得所有授权,访问资源A
从上述流程可以看出,一个程序完成一次临界资源的访问,需要进行如下的信息交互:

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

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

1.3 令牌环算法

除了集中式算法、分布式算法以外,其实还有其他方法可以实现分布式互斥。 如下图所示,所有程序构成一个环结构,令牌按照顺时针(或逆时针)方向在程序之间传递,收到令牌的程序有权访问临界资源,访问完成后将令牌传送到下一个程序;若该程序不需要访问临界资源,则直接把令牌传送给下一个程序。在分布式领域,这个算法叫作令牌环算法,也可以叫作基于环的算法。
令牌环算法示意图
因为在使用临界资源前,不需要像分布式算法那样挨个征求其他程序的意见了,所以相对而言,在令牌环算法里单个程序具有更高的通信效率。同时,在一个周期内,每个程序都能访问到临界资源,因此令牌环算法的公平性很好
但是,不管环中的程序是否想要访问资源,都需要接收并传递令牌,所以也会带来一些无效通信。假设系统中有 100 个程序,那么程序 1 访问完资源后,即使其它 99 个程序不需要访问,也必须要等令牌在其他 99 个程序传递完后,才能重新访问资源,这就降低了系统的实时性。
综上,令牌环算法非常适合通信模式为令牌环方式的分布式系统,例如移动自组织网络系统。
对于集中式和分布式算法都存在的单点故障问题,在令牌环中,若某一个程序出现故障,则直接将令牌传递给故障程序的下一个程序,从而很好地解决单点故障问题,提高系统的健壮性,带来更好的可用性。但,这就要求每个程序都要记住环中的参与者信息,这样才能知道在跳过一个参与者后令牌应该传递给谁。

令牌环算法特点

令牌环算法的公平性高,在改进单点故障后,稳定性也很高,适用于系统规模较小,并且系统中每个程序使用临界资源的频率高且使用时间比较短的场景。

2 总结

本文讲解了什么是分布式互斥,以及为什么需要分布式互斥。然后,介绍了 3 类典型的分布式互斥方法,即:集中式算法、分布式算法,以及令牌环算法。后面一篇继续介绍分布式系统协调与同步的相关内容-分布式选举

3 分布式互斥方法思维导图

分布式互斥方法思维导图

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值