1. 程式人生 > >分散式系統基本概念(一致性、資料分佈、複製策略、分散式協議)

分散式系統基本概念(一致性、資料分佈、複製策略、分散式協議)

分散式系統基本概念 異常型別 1 伺服器down機(隨時發生、記憶體資料丟失(因此需要考慮資料持久化)、down機重啟之後要恢復記憶體資訊) 2 網路異常(訊息丟失、訊息亂序(UDP)或者網路包資料錯誤、區域內可通訊區域間不可通訊) 3 磁碟故障(磁碟損壞(備份)、磁碟資料錯誤(校驗和解決)) 超時?不能簡單的當做失敗(分散式儲存的3態成功、失敗、超時) 一致性 副本是分散式儲存系統容錯技術的唯一手段 保證副本之間的一致性是整個分散式系統的理論核心 兩個角度理解: 1 使用者角度: (1)強一致性:A寫完,A、B、C後續都讀到最新 (2)弱一致性:不能保證 (3)最終一致性:弱一致性的特例。A寫入,保證後續如果沒有寫操作更新同樣的值,A、B、C的讀取“最終”都會是新值。 最終一致性: (1)因果一致性:A通知B已經更新了一個數據項,B後續訪問返回更新後的值。一次寫入 將保證取代前一次寫入。 (2)讀寫一致性:A寫了新值,A的後續操作都會讀取新值。(但是B、C不一定)(因果的特例) (3)會話一致性:會話期間一致性。現有會話和原有會話之間一致性不保證。 (4)單調讀一致性:A讀取了某個值,後續操作不會讀到更早的值。 (5)單調寫一致性:多個副本的寫操作的順序與A的寫順序一樣。 2 儲存系統:
副本一致性:多個副本是否一致。(不一致的時間視窗) 更新順序一致性:副本之間是否按照相同的順序執行更新操作。 衡量指標 (1)效能:吞吐能力(QPS TPS)、響應延遲、兩個要權衡不能同時滿足 (2)可用性:面對異常的時候提供正常服務的能力。 (3)一致性: (4)可擴充套件性:儲存容量、計算量、效能。 資料分佈 順序分佈、雜湊分佈 雜湊:找出好的雜湊函式很難 原因 (1)如果按照值key雜湊,同一個使用者的資料分佈在多臺伺服器上。 (2)按照使用者id雜湊,會出現資料傾斜(某些使用者的資料量很大) 對於大使用者問題: (1)手動拆分 (2)自動拆分:對雜湊作調整以達到此目的 傳統雜湊的問題: (1)伺服器上下線,N值變化,對映被打亂,資料重新分佈(將會帶來資料遷移) (2)不遷移資料的話命中率急劇下降 解決辦法: (1)將雜湊值與伺服器的對應關係作為元資料,交給元資料伺服器管理。先計算雜湊值,查詢元資料伺服器,獲得對應伺服器。 (2)一致性雜湊:隨機分配token構成環,先計算key的雜湊值,然後存放到順時針方向第一個大於或者等於該雜湊值的token所在結點。(伺服器上下線只會影響環中相鄰結點) 負載均衡
心跳包傳輸負載資訊 CAP原理(CAP Theorem) 一致性(C onsistency)、可用性(A vailability)、分割槽容忍性(P artition tolerance) CAP原理指的是,這三個要素最多隻能同時實現兩點,不可能三者兼顧。因此在進行分散式架構設計時,必須做出取捨。而對於分散式數 據系統,分割槽容忍性是基本要求 ,否則就失去了價值。因此設計分散式資料系統,就是在一致性和可用性之間取一個平衡。 複製策略 強同步複製 非同步複製 二者的區別在於使用者的寫請求是否需要同步到備副本才可以返回成功 一致性與可用性是矛盾的,強同步保證副本間的一致性,但是如果備副本出現故障,也可能阻塞儲存系統的正常寫服務,可用性受影響。 非同步不保證一致性,主副本出現故障有可能丟失資料。 容錯
故障檢測 通過租約協議實現 1 心跳 (1)有可能A、B之間發生網路問題 (2)機器B過於繁忙無法響應 2 租約機制 就是帶有時間限制的授權 B在租約有效期內允許提供服務,快到期時重新申請,過期認為是發生故障 故障恢復 遷移服務 分散式協議 兩階段提交協議 (1)請求階段 協調者通知參與者準備提交或者取消事務 同意或者取消 (2)提交階段 提交或者取消 所有的參與者都同意才執行 問題: (1)事務參與者發生故障 設定超時時間 超時不響應就失敗 (2)協調者發生故障 協調者將相關操作記錄資訊同步到備用協調者 發生故障後切換 paxos協議

在paxos演算法中,分為4種角色:

  Proposer :提議者

  Acceptor:決策者

  Client:產生議題者

  Learner:最終決策學習者

上面4種角色中,提議者和決策者是很重要的,其他的2個角色在整個演算法中應該算做打醬油的,Proposer就像Client的使者,由Proposer使者拿著Client的議題去向Acceptor提議,讓Acceptor來決策。這裡上面出現了個新名詞:最終決策。現在來系統的介紹一下paxos演算法中所有的行為:

  1. Proposer提出議題
  2. Acceptor初步接受 或者 Acceptor初步不接受
  3. 如果上一步Acceptor初步接受則Proposer再次向Acceptor確認是否最終接受
  4. Acceptor 最終接受 或者Acceptor 最終不接受

上面Learner最終學習的目標是Acceptor們最終接受了什麼議題?注意,這裡是向所有Acceptor學習,如果有多數派個Acceptor最終接受了某提議,那就得到了最終的結果,演算法的目的就達到了。畫一幅圖來更加直觀:

 

為什麼需要3個Acceptor?因為Acceptor必須是最少大於等於3個,並且必須是奇數個,因為要形成多數派嘛,如果是偶數個,比如4個,2個接受2個不接受,各執己見,沒法搞下去了。

為什麼是3個Proposer? 其實無所謂是多少個了,1~n 都可以的;如果是1個proposer,毫無競爭壓力,很順利的完成2階段提交,Acceptor們最終批准了事。如果是多個proposer就比較複雜了,請繼續看。

上面的圖中是畫了很多節點的,每個節點需要一臺機器麼?答案是不需要的,上面的圖是邏輯圖,物理中,可以將Acceptor和Proposer以及Client放到一臺機器上,只是使用了不同的埠號罷了,Acceptor們啟動不同埠的TCP監聽,Proposer來主動連線即可;完全可以將Client、Proposer、Acceptor、Learner合併到一個程式裡面;這裡舉一個例子:比如開發一個JOB程式,JOB程式部署在多臺伺服器上(數量為奇數),這些JOB有可能同時處理一項任務,現在使用paxos演算法讓這些JOB自己來商量由誰(哪臺機器)來處理這項任務,這樣JOB程式裡就需要包含Client、Proposer、Acceptor、Learner這4大功能,並且需要配置其他JOB伺服器的IP地址。

再舉一個例子,zookeeper常常用來做分散式事務鎖。Zookeeper所使用的zad協議也是類似paxos協議的。所有分散式自協商一致性演算法都是paxos演算法的簡化或者變種。Client是使用zookeeper服務的機器,Zookeeper自身包含了Acceptor, Proposer, Learner。Zookeeper領導選舉就是paxos過程,還有Client對Zookeeper寫Znode時,也是要進行Paxos過程的,因為不同Client可能連線不同的Zookeeper伺服器來寫Znode,到底哪個Client才能寫成功?需要依靠Zookeeper的paxos保證一致性,寫成功Znode的Client自然就是被最終接受了,Znode包含了寫入Client的IP與埠,其他的Client也可以讀取到這個Znode來進行Learner。也就是說在Zookeeper自身包含了Learner(因為Zookeeper為了保證自身的一致性而會進行領導選舉,所以需要有Learner的內部機制,多個Zookeeper伺服器之間需要知道現在誰是領導了),Client端也可以Learner,Learner是廣義的。

現在通過一則故事來學習paxos的演算法的流程(2階段提交),有2個Client(老闆,老闆之間是競爭關係)和3個Acceptor(政府官員):

  1. 現在需要對一項議題來進行paxos過程,議題是“A專案我要中標!”,這裡的“我”指每個帶著他的祕書Proposer的Client老闆。
  2. Proposer當然聽老闆的話了,趕緊帶著議題和現金去找Acceptor政府官員。
  3. 作為政府官員,當然想誰給的錢多就把專案給誰。
  4. Proposer-1小姐帶著現金同時找到了Acceptor-1~Acceptor-3官員,1與2號官員分別收取了10比特幣,找到第3號官員時,沒想到遭到了3號官員的鄙視,3號官員告訴她,Proposer-2給了11比特幣。不過沒關係,Proposer-1已經得到了1,2兩個官員的認可,形成了多數派(如果沒有形成多數派,Proposer-1會去銀行提款在來找官員們給每人20比特幣,這個過程一直重複每次+10比特幣,直到多數派的形成),滿意的找老闆覆命去了,但是此時Proposer-2保鏢找到了1,2號官員,分別給了他們11比特幣,1,2號官員的態度立刻轉變,都說Proposer-2的老闆懂事,這下子Proposer-2放心了,搞定了3個官員,找老闆覆命去了,當然這個過程是第一階段提交,只是官員們初步接受賄賂而已。故事中的比特幣是編號,議題是value。

    這個過程保證了在某一時刻,某一個proposer的議題會形成一個多數派進行初步支援;

  5. 現在進入第二階段提交,現在proposer-1小姐使用分身術(多執行緒併發)分了3個自己分別去找3位官員,最先找到了1號官員籤合同,遭到了1號官員的鄙視,1號官員告訴他proposer-2先生給了他11比特幣,因為上一條規則的性質proposer-1小姐知道proposer-2第一階段在她之後又形成了多數派(至少有2位官員的贓款被更新了);此時她趕緊去提款準備重新賄賂這3個官員(重新進入第一階段),每人20比特幣。剛給1號官員20比特幣, 1號官員很高興初步接受了議題,還沒來得及見到2,3號官員的時候

這時proposer-2先生也使用分身術分別找3位官員(注意這裡是proposer-2的第二階段),被第1號官員拒絕了告訴他收到了20比特幣,第2,3號官員順利簽了合同,這時2,3號官員記錄client-2老闆用了11比特幣中標,因為形成了多數派,所以最終接受了Client2老闆中標這個議題,對於proposer-2先生已經出色的完成了工作;

這時proposer-1小姐找到了2號官員,官員告訴她合同已經簽了,將合同給她看,proposer-1小姐是一個沒有什麼職業操守的聰明人,覺得跟Client1老闆混沒什麼前途,所以將自己的議題修改為“Client2老闆中標”,並且給了2號官員20比特幣,這樣形成了一個多數派。順利的再次進入第二階段。由於此時沒有人競爭了,順利的找3位官員籤合同,3位官員看到議題與上次一次的合同是一致的,所以最終接受了,形成了多數派,proposer-1小姐跳槽到Client2老闆的公司去了。

  Paxos過程結束了,這樣,一致性得到了保證,演算法執行到最後所有的proposer都投“client2中標”所有的acceptor都接受這個議題,也就是說在最初的第二階段,議題是先入為主的,誰先佔了先機,後面的proposer在第一階段就會學習到這個議題而修改自己本身的議題,因為這樣沒職業操守,才能讓一致性得到保證,這就是paxos演算法的一個過程。原來paxos演算法裡的角色都是這樣的不靠譜,不過沒關係,結果靠譜就可以了。該演算法就是為了追求結果的一致性。