Distributed System 笔记 - Synchronization 和 ACID

本文详细介绍了分布式系统中的选举算法,包括Bully算法和环算法,以及实现互斥的集中式、分布式算法如Richardt和Agrawala算法、令牌环算法。此外,还探讨了分布式事务的ACID特性及其在并发控制中的应用,如2PL协议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习资源:

CMU 15440 Lecture note: http://www.andrew.cmu.edu/course/15-440-f14/applications/ln/lecture7.html

分布式系统原理与范型, chap5


5.4 选举算法

许多分布式算法需要有一个进程充当协调者,发起者或者其他特殊角色。这里讨论选举出一个协调者(用于协调的进程)的算法。

假定每个进程有一个唯一的编号(例如它的网络地址)。通常,选举算法会试着找出进程号最大的进程,将它指定为协调者。

另外,假定每个进程都知道其他进程的进程号,但不知道当前有哪些进程正在运行,而哪些进程已经崩溃。选举算法的目的是确保发起选举以后,所有的进程都同意选举出的新协调者,则选举结束。

5.4.1 Bully算法

当任何一个线程P发现当前的协调者已经不再响应请求的时候,它就发起一次选举(P主持选举):

1)P向所有编号比它大的进程发送一个election消息

2)如果无人响应,则P自己获胜,成为协调者

3)如果有编号比P大的进程响应,则那个响应的线程接管了P的选举工作,P的选举工作到此完成

由上面的步骤可以看出,任何时刻,一个进程只能从编号比它小的进程处得到election消息。这个进程(election的接受者)发回一个OK消息给发送者(响应election),表面它仍然在运行,并接管选举工作。以此步骤进行下去,最终只有一个编号最大的线程在举行选举,而其他线程都已经放弃选举或者无法响应,这个最大的线程就是新的协调者。它赢得了选举并把获胜的消息(coordinator消息)发送给所有线程,通知它们自己是新的协调者。因此可见,最大的线程总是获胜,因此称为bully。


需要注意的是,可以有多个进程同时举行选举工作。4发起选举后,同时向5和6都发送了election消息,当然5和6也都回响应。此时4得到响应后,停止了自己的选举工作。但是5和6都在同时举行选举工作。这并不是问题。因为5会向6发送election消息并得到6的响应,从而放弃主持选举。

5.4.1 环算法

假定所有进程按照一定的逻辑排序,那么每个进程就知道它的后继者是谁。

当任何一个进程发现当前的协调者不工作时,它就

1)发送一个带有自己本身进程号的election消息给后继者

2)如果这个后继者已经崩溃不再运行,则这个election消息会沿着环一直找下去,直到找到正则运行的进程

3)这里的election消息其实是一个列表,在每一步中,每一环都把自己的进程号加到election的消息列表里,使自己成为候选人之一,然后发给下一个后继者

4)最终,election消息和里面包含选举人的列表会沿着环返回到最初的发起人。列表中进程号最大者变成了新的协调者。

5)election消息被改为coordinator消息,再次沿着环发送出去,通知所有进程它是新的协调者


5.5 互斥 Mutual Exclusion

当一个进程需要读或者更新某个共享数据的时候,它先进入临界区,达到互斥,以保证没有其他的进程可以同时访问这个共享数据。

5.5.1 集中式算法

达到互斥最直接的方法是选举一个进程作为协调者。当任何一个进程需要进入临界区达到互斥时,它都需要向协调者发送一个请求消息,说明它想要进入哪个临界区并请求允许。如果当前没有其他的进程在这个临界区中,协调者就会允许它进入。


上图过程,进程1进入临界区后,协调者3不允许进程2再同时进入临界区,因此无应答(进程2被阻塞),同时把进程2放入等待队列中。

优点:

1)该方法通过协调者实现临界区只需要3个信号:请求,允许,释放

2)很公平,允许请求的顺序和接受时的顺序是一样的(有等待队列实现)

3)没有进程会一直等待而饿死

缺点:

极其依赖于协调者。

1)协调者可能故障

2)协调者的性能也可能成为瓶颈

5.5.2 分布式算法

Richart and Agrawala 算法要求系统中所有的事件都是完全排序的,也就是说,对于一串事件,哪一个事件先发生必须非常明确。算法如下:

当一个进程想进入临界区时,它构造一个消息,其中包含它要进入的临界区的名字,它本身的进程号和当前的时间。然后它把这个消息发送给所有其他的进程,也包括它自己。当其他进程接受到来自另一个线程的请求消息时,它根据自己与消息中的临界区相关的信息采取相应的动作:

1)接受者不在临界区中,也不想进入临界区,则接受者向发送者发OK消息

2)接受者已经在临界区中,则不应答,而是将该请求消息放入队列

3)接受者也想进入临界区但还未进入。这是会有两种请求消息,一个是这个接受者自己因为想进入临界区而发给其他进程的请求消息(R-self)和从其他进程处接受到的请求消息(R-other)。这时接受者会比较R-self和R-other,时间戳较早的那个获胜,较慢的那个进入队列。例如如果接受者自己的R-self较早,那么它自己进入临界区,而把R-other放入队列,不发送任何消息。如果是R-other,那么接受者会发送OK消息回去。

4)当处于临界区的接受者退出临界区后,它会向队头等待的进程发送OK消息



5.5.3 令牌环 token ring 算法

构造一个逻辑环,环中为每个进程分配了一个位置。排序并不重要,重要的是环中的每一个进程知道它的后继者。

当环初始化时,进程0得到token。这个token沿着环运行,用点对点的方式,把它从进程k传到k+1. 进程从它的邻近进程处或得token,检查自己是否要进入临界区,如果要进入,则hold住token,进入临界区,做该做的工作后,退出临界区,然后把token沿着环传给后继者。也就是说,只有token的拥有者才可以进入临界区。

缺点:

1)token可能丢失


5.6 分布式事务 transaction ACID

transaction 的模型最初来自商业界。两个公司做交易,在签订合同之前,他们之间可以进行协商谈判,如果谈判失败,则恢复到谈判之前的状态(没有任何交易发生)。如果一旦签订了合同,则双方一定要完成交易。

计算机中的模型与此类似,一个进程宣布它想和其他进程开始一个transaction, 它们之间可以协商,创建删除实体,执行一些操作。然后发起者宣布它希望所有的进程都提交commit目前已经完成的工作,如果所有进程都同意,则这些完成的工作的结果就变为永久性的。否则,如果有其他进程拒绝(或者崩溃),那么形势就回到了transaction之前的状态,例如对文件或数据库的修改都会消失。所以是“要么全有,要么全无”

银行的例子:

1)从账户1提取金额a

2)向账户2存入金额a

如果完成1)以后而没执行2)以前就崩溃了,则显然错误发生了。

通过把这个两个操作组织为 transaction 可以解决这个问题。这两个操作要么都执行完成,要么都不执行。关键在于,如果transaction 执行失败了,要能够退回执行前的状态。 

Transaction primitives:



ACID:



1) Atomic: 要么全有,要么全无。transaction是不可分割的动作。当一个transaction处于执行中时,其他进程看不到中间状态。例如,一个transaction正在向一个文件写入新的内容,其他进程此时只能看到原来旧的内容。如果这个transaction执行成功,则新的内容会忽然出现。因此中间状态不可见。

2)consistent:系统拥有的一致性不被transaction所破坏。例如,对于银行系统,transaction发生之前和transaction执行成功之后,总资金额总是不会变的。

3)isolated:如果两个transactions并行地执行,那么他们直接应该是独立的,结果就好像他们是顺序执行的一样

4)durable: transaction一旦执行成功,那么结果就是永久性的,任何故障都不可能使结果丢失或取消。


nested transaction 和 distributed transaction的区别




5.6.3 transaction 的实现

1. 私有空间

当一个进程开始一个transaction,它被分配一个私有空间,该空间包含所有它需要访问的文件。在transaction执行完成之前,所有的读写操作都在私有空间进行,而不是直接对文件系统进行。

具体关于读和写的优化,详见教材p218


2. write ahead log

使用这种方法时,文件就已经真正被修改,但是在任何一块数据被修改前,一条记录被log, 说明哪个transaction正则对哪块数据进行改动,旧值和新值分别是什么。只有当日志被成功写入后,改动才可以commit。


5.6.4 currency control

concurrency control 的目的是为了让几个transaction同时执行,而执行过程中相互不受影响,就像顺序执行它们一样。


1)最低层 datat manager, 只负责对数据的读写,本身其实对transaction一无所知

2)中间层scheduler,正确地控制并发。它决定哪个transaction,在何时被允许使用 data manager 进行读写操作。相关的调度算法会有涉及。见教材p221

3)最高层 transaction manager。主要负责transaction的原子性


2PL - 2 phase locking

整个事务分为两个阶段,前一个阶段为加锁,后一个阶段为解锁。在加锁阶段,事务只能加锁,也可以操作数据,但不能解锁,直到事务释放第一个锁,就进入解锁阶段,此过程中事务只能解锁,也可以操作数据,不能再加锁。两阶段锁协议使得事务具有较高的并发度,因为解锁不必发生在事务结尾。它的不足是没有解决死锁的问题,因为它在加锁阶段没有顺序要求。如两个事务分别申请了A, B锁,接着又申请对方的锁,此时进入死锁状态。
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值