paxos学习笔记

paxos算法主要解决的问题就是一个分布式系统中如何就某一个值达成一致。

为了理解paxos算法,首先定义这样一个问题:有这样一个变量a,它属于不变变量(相当于java中的final变量),他的值一旦确定,便不能改变。现在有n个异步请求要求给a变量赋值,那如何保证最好大家看到值都是一致(相同)的呢?

首先想到的一个简单的方案就是加锁,该方法分为两步:

  1. 获取锁
    • 一个请求r1到来,如果发现已经被其他请求加锁,则反回error,表示获取锁失败(获取赋值权限失败)

    • 如果发现没有其他请求加锁,这返回<success,a>,表示成功获取锁,并返回a变量的值。
  2. 赋值
    • 针对第一个步骤,如果返回值为error,认为获取权限失败,不在提交赋值操作。
    • 如果第一个步骤返回的是success,则首先判断a变量的值是否为null:
      • 如果为null,则确定a变量之前没有被任何请求赋值过,所以给a变量赋值v,赋值成功后释放锁。
      • 如果不为null,则说明a已经被赋值过,不在给a赋值,并释放锁。

仔细分析上面的问题,就会发现一个问题:如果发出请求r1的机器,在获得权限(给a加锁)成功后,出现了故障,不能再经行第二

阶段的操作,也就不能再释放锁,其他请求就一直不能给a赋值,这样一来就出现了死锁现象。为了解决这样的死锁问题,略微对

上面的方案就行修改。

上一个方案出现死锁的根本原因是一个请求获得锁了,另一个请求就不能再获取锁。所以在这个方案里,我们允许抢战式获取锁。

。。。

 

    

 

posted on 2016-05-07 14:00  方文才  阅读(274)  评论(0编辑  收藏  举报