什么是分布式互斥
分布式系统里,对于同一共享资源,一个程序正在使用的时候不希望被其他程序打扰。即要求某一时刻只能有一个程序能够访问这种资源。
这种排他的资源访问方式,就叫分布式互斥;这种被互斥访问的共享资源就叫做临界资源。
集中式算法
集中式算法的核心是引入一个协调者程序,每个程序在需要访问资源的时候先给协调着发送一个请求。如果当前资源没有被其他程序使用,就直接授权给程序。否则,便会给该程序排一个号,按照先后顺序进行排列。资源使用被释放后,就通知协调着,协调者从排号队列里取出最为优先的请求,并授权。程序拿到授权后访问资源。
举个例子:
程序 A、B 为普通运行程序,另一个程序为X为协调者。当程序 A 和程序 B 需要使用临界资源时,它们会向协调者发起申请,请求协调者授权。不巧的是,程序 C正在使用临界资源。这时,协调者根据程序 A 和 B的申请时间顺序,依次将它们放入等待队列。程序 C 使用完临界资源后,通知协调者释放授权。此时,协调者从等待队列中取出程序 A,并给它发放授权。这时,程序 A 就可以使用临界资源了。
优点:集中式算法的优点在于直观、简单、信息交互量少、易于实现,并且所有程序只需和协调者通信,程序之间无需通信。
缺点:一方面,协调者会成为系统的性能瓶颈。协调者处理的消息数量会随着需要访问临界资源的程序数量线性增加。另一方面,容易引发单点故障问题。协调者故障,会导致所有的程序均无法访问临界资源,导致整个系统不可用。
分布式算法
当一个程序要访问临界资源时,先向系统中的其他程序发送一条请求消息,在接收到所有程序返回的同意消息后,才可以访问临界资源。其中,请求消息需要包含所请求的资源、请求者的 ID,以及发起请求的时间。
在大型系统中使用分布式算法,消息数量会随着需要访问临界资源的程序数量呈指数级增加,容易导致高昂的"沟通成本"。
bully算法:长者为大
Raft算法:少数服从多数
ZAB算法:Raft算法的优化