分布式互斥
对于同一共享资源,要求同一时刻只能有一个程序能够访问这种资源。
这种排他性的资源访问方式,叫作分布式互斥(Distributed Mutual Exclusion),而这种被互斥访问的共享资源就叫作临界资源(Critical Resource)。
分布式互斥算法
集中式算法
引入一个协调者(中央服务器)来负责接收和分发请求,如果当前资源没人使用,则发放授权,如果有,则进入请求队列排队。当有程序释放资源时,唤醒排在最前面的程序。
这个过程中会有3次交互
- 向协调者发送请求授权信息,1 次消息交互;
- 协调者向程序发放授权信息,1 次消息交互;
- 程序使用完临界资源后,向协调者发送释放授权,1 次消息交互。
优点
直观、简单、信息交互量少、易于实现,程序之间解耦。
缺点
协调者会成为系统的性能瓶颈。
如果有 100 个程序要访问临界资源,那么协调者要处理 100*3=300 条消息。也就是说,协调者处理的消息数量会随着需要访问临界资源的程序数量线性增加。
容易引发单点故障问题。协调者故障,会导致所有的程序均无法访问临界资源,导致整个系统不可用。
尽量选择配置好的服务器,且对中央服务器进行主备。
分布式算法
当一个程序要访问临界资源时,先向系统中的其他程序发送一条请求消息,在接收到所有程序返回的同意消息后,才可以访问临界资源。其中,请求消息需要包含所请求的资源、请求者的 ID,以及发起请求的时间。
组播和逻辑
先到先得,投票全通过机制
访问一次临界资源的交互
- 向其他 n-1 个程序发送访问临界资源的请求,总共需要 n-1 次消息交互;
- 需要接收到其他 n-1 个程序回复的同意消息,方可访问资源,总共需要 n-1 次消息交互。
缺点 可用性低
消息数量会随着需要访问临界资源的程序数量呈指数级增加,容易导致高昂的“沟通成本”。
一旦某一程序发生故障,无法发送同意消息,那么其他程序均处在等待回复的状态中,使得整个系统处于停滞状态,导致整个系统不可用。
改进方案
如果检测到一个程序故障,则直接忽略这个程序,无需再等待它的同意消息。
但是这样需要对其他程序进行故障检测,加大了复杂度。
场景
分布式算法适合节点数目少且变动不频繁的系统,且由于每个程序均需通信交互,因此适合 P2P 结构的系统。
比如HDFS:
令牌环算法
在华为的轮值 CEO 体系里,CEO 就是临界资源,同时只能有一个人担任,由多名高管轮流出任CEO。
有程序构成一个环结构,令牌按照顺时针(或逆时针)方向在程序之间传递,收到令牌的程序有权访 问临界资源,访问完成后将令牌传送到下一个程序;若该程序不需要访问临界资源,则直接把令牌传送给下一个程序。
优点
拥有更高的通信效率。
解决了单点故障的问题,但是需要记录下每个结点的信息。
适用场景
令牌环算法非常适合通信模式为令牌环方式的分布式系统,例如移动自组织网络系统。一个典型的应用场景就是无人机通信。
适合访问临界资源频率高,且使用时间少的场景。
无人机在通信时,工作原理类似于对讲机,同一时刻只能发送信息或接收信息。因此,通信中的上行链路(即向外发送信息的通信渠道)是临界资源。当某个无人机故障时,将令牌传递给下一个无人机。