资源汇总
Paxos和分布式存储系统(问题定义)
Paxos用来确定一个不可变变量的取值
- 取值可以是任意二进制数据
- 一旦确定将不再更改,并且可以被获取到(不可变性、可读取性)
在分布式存储系统中应用Paxos
- 在分布式存储系统中,数据本身可变,采用多部分进行存储
- 多个副本的更新操作序列
[op1, op2, op3, ... , opn]
是相同的、不变的。 - 用Paxos依次来确定不可变变量
opi
的取值(即第i个操作时什么) - 每确定完Opi之后,让各个数据副本执行
opi
将问题转换为,设计一个系统,来存储名称为var的变量
- 系统内部由多个
Acceptor
组成,负责存储和管理var
变量- 外部有多个
proposer
机器任意并发调用API,向系统提交不同的var
取值- var可以是任意二进制数据
- 系统对外的API库接口为:
propose(var, V)
返回<ok, f>
或者<error>
(f是系统内部已经确定的取值,如果propose设置成功则f为V,否则为其他proposer
设置成功的结果)
系统要保证var的取值满足一致性
- 如果
var
的取值没有确定,则var的取值为null
- 一旦
var
的取值被确定,则不可更改。并且一直可以获取到这个值
系统要满足一定的容错特性
- 可以容忍任意
proposer
机器出现故障 - 可以容忍少数
Acceptor
故障(半数以下)
暂时不考虑:
- 网络分化
Acceptor
故障会丢失var
难点
分布式环境下确定一个不可变变量的难点有:
- 管理多个
Proposer
的并发执行 - 保证
var
变量的不可变性 - 容忍任意
Proposer
机器故障 - 容忍半数以下
Acceptor
机器故障
方案1
先考虑由单个Acceptor
组成,通过类似互斥锁机制来管理并发的Proposer
运行
Proposer
首相向Acceptor
申请Acceptor
的互斥访问权限,然后才能请求Acceptor
接受自己的取值Acceptor
给Proposer
发放互斥访问权,谁申请到互斥访问权,就接受谁提交的值
这样就让Proposer
按照获取互斥访问权的顺序依次访问Acceptor
,一旦Acceptor
接收了某个Proposer
的取值,则认为var
取值被确定
,其他Proposer
不再更改。
基于互斥访问权的Acceptor
的实现
Proposer(var, V)的两阶段实现
缺陷:
如果Proposer在释放互斥锁之前发生故障,会导致系统陷入死锁。(不能容忍任何Proposer机器故障)
方案2
引入抢占式访问权Acceptor
可以让某个Proposer
获取到的访问权失效,不再接收它的访问。之后,可以将访问权交给其他Proposer
,让其他Proposer
访问Acceptor
Proposer
向Acceptor
申请访问权时,指定编号epoch
,并认为越大的epoch
值越新,获取到访问权后,才能向Acceptor
提交值。Acceptor
采取喜新厌旧原则:
- 一旦接收到更新的
epoch
申请,马上让之前的旧epoch
访问权限失效,不再接收它们提交的取值 - 给新的
epoch
发放访问权,只接受新epoch
提交的取值
也就是新的epoch
可以抢占旧的epoch
,为了保持一致性,不同epoch
的Proposer
之间采后者认同前者的原则。
- 肯定旧的
epoch
无法生成确定性取值时,新的epoch
会提交自己的value,不会冲突 - 一旦旧
epoch
形成了确定性取值,新的epoch
可以获取到该值,并会认同,而不会破坏
基于抢占式访问权的Acceptor的实现
Propose(var, V)的两阶段实现
总结:
基于抢占式访问权的核心思想让Proposer将epoch递增的顺序抢占式的依次运行,后者会认同前者。
【优点】:
可以避免方案一种Proposer故障带来的死锁问题,并且仍可以保证var取值的一致性
【缺点】:
单点问题任然存在
Paxos
Paxos就是在方案二的基础上,试图解决Acceptor
的单点问题,引入了多Acceptor
。仍然采用喜新厌旧的原则,但是
因为引入了多个Acceptor
,则不再简单地”后者认同前者”,还采用了”少数服从多数”原则:
一旦某个epoch的取值f被半数以上的Acceptor接受,则认为此var的取值确定为f,不再更改。
Paxos中的Acceptor
实现相较方案二保持不变。
|
|
总结:
核心思想:在抢占式访问(方案2)的基础上引入了多Acceptor,保证一个epoch,只有一个Proposer运行,Proposer按照递增的
次序运行。
新epoch的Proposer采用后者认同前者的思路运行。
Paxos算法可以满足容错性要求。
- 半数以下的Acceptor出现故障时,存货的Acceptor依然可以生成var的确定性取值
- 一旦var的值被确定,即使出现半数以下的Acceptor故障,此取值可以被获取,且不再被更改。
Paxos算法的Liveness问题
新轮次的抢占会让旧轮次停止运行,如果每一轮在第二阶段执行成功之前都被新一轮次抢占,则导致活锁。如何解决?