paxos學習筆記

paxos算法主要解決的問題就是一個分佈式系統中如何就某一個值達成一致。java

爲了理解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賦值,這樣一來就出現了死鎖現象。爲了解決這樣的死鎖問題,略微對權限

上面的方案就行修改。請求

上一個方案出現死鎖的根本緣由是一個請求得到鎖了,另外一個請求就不能再獲取鎖。因此在這個方案裏,咱們容許搶戰式獲取鎖。方法

。。。error

相關文章
相關標籤/搜索