領導演算法
❶ Raft 演算法(詳細版)
在分布式系統中,一致性演算法至關重要。在所有一致性演算法中,Paxos 最負盛名,它由萊斯利·蘭伯特(Leslie Lamport)於 1990 年提出,是一種基於消息傳遞的一致性演算法,被認為是類似演算法中最有效的。
Paxos 演算法雖然很有效,但復雜的原理使它實現起來非常困難,截止目前,實現 Paxos 演算法的開源軟體很少,比較出名的有 Chubby、LibPaxos。此外,Zookeeper 採用的 ZAB(Zookeeper Atomic Broadcast)協議也是基於 Paxos 演算法實現的,不過 ZAB 對 Paxos 進行了很多改進與優化,兩者的設計目標也存在差異——ZAB 協議主要用於構建一個高可用的分布式數據主備系統,而 Paxos 演算法則是用於構建一個分布式的一致性狀態機系統。
由於 Paxos 演算法過於復雜、實現困難,極大地制約了其應用,而分布式系統領域又亟需一種高效而易於實現的分布式一致性演算法,在此背景下,Raft 演算法應運而生。
Raft 演算法在斯坦福 Diego Ongaro 和 John Ousterhout 於 2013 年發表的《In Search of an Understandable Consensus Algorithm》中提出。相較於 Paxos,Raft 通過邏輯分離使其更容易理解和實現,目前,已經有十多種語言的 Raft 演算法實現框架,較為出名的有 etcd、Consul 。
根據官方文檔解釋,一個 Raft 集群包含若干節點,Raft 把這些節點分為三種狀態:Leader、 Follower、Candidate,每種狀態負責的任務也是不一樣的。正常情況下,集群中的節點只存在 Leader 與 Follower 兩種狀態。
• Leader(領導者) :負責日誌的同步管理,處理來自客戶端的請求,與Follower保持heartBeat的聯系;
• Follower(追隨者) :響應 Leader 的日誌同步請求,響應Candidate的邀票請求,以及把客戶端請求到Follower的事務轉發(重定向)給Leader;
• Candidate(候選者) :負責選舉投票,集群剛啟動或者Leader宕機時,狀態為Follower的節點將轉為Candidate並發起選舉,選舉勝出(獲得超過半數節點的投票)後,從Candidate轉為Leader狀態。
通常,Raft 集群中只有一個 Leader,其它節點都是 Follower。Follower 都是被動的,不會發送任何請求,只是簡單地響應來自 Leader 或者 Candidate 的請求。Leader 負責處理所有的客戶端請求(如果一個客戶端和 Follower 聯系,那麼 Follower 會把請求重定向給 Leader)。
為簡化邏輯和實現,Raft 將一致性問題分解成了三個相對獨立的子問題。
• 選舉(Leader Election) :當 Leader 宕機或者集群初創時,一個新的 Leader 需要被選舉出來;
• 日誌復制(Log Replication) :Leader 接收來自客戶端的請求並將其以日誌條目的形式復制到集群中的其它節點,並且強制要求其它節點的日誌和自己保持一致;
• 安全性(Safety) :如果有任何的伺服器節點已經應用了一個確定的日誌條目到它的狀態機中,那麼其它伺服器節點不能在同一個日誌索引位置應用一個不同的指令。
根據 Raft 協議,一個應用 Raft 協議的集群在剛啟動時,所有節點的狀態都是 Follower。由於沒有 Leader,Followers 無法與 Leader 保持心跳(Heart Beat),因此,Followers 會認為 Leader 已經下線,進而轉為 Candidate 狀態。然後,Candidate 將向集群中其它節點請求投票,同意自己升級為 Leader。如果 Candidate 收到超過半數節點的投票(N/2 + 1),它將獲勝成為 Leader。
第一階段:所有節點都是 Follower。
上面提到,一個應用 Raft 協議的集群在剛啟動(或 Leader 宕機)時,所有節點的狀態都是 Follower,初始 Term(任期)為 0。同時啟動選舉定時器,每個節點的選舉定時器超時時間都在 100~500 毫秒之間且並不一致(避免同時發起選舉)。
第二階段:Follower 轉為 Candidate 並發起投票。
沒有 Leader,Followers 無法與 Leader 保持心跳(Heart Beat),節點啟動後在一個選舉定時器周期內未收到心跳和投票請求,則狀態轉為候選者 Candidate 狀態,且 Term 自增,並向集群中所有節點發送投票請求並且重置選舉定時器。
注意,由於每個節點的選舉定時器超時時間都在 100-500 毫秒之間,且彼此不一樣,以避免所有 Follower 同時轉為 Candidate 並同時發起投票請求。換言之,最先轉為 Candidate 並發起投票請求的節點將具有成為 Leader 的「先發優勢」。
第三階段:投票策略。
節點收到投票請求後會根據以下情況決定是否接受投票請求(每個 follower 剛成為 Candidate 的時候會將票投給自己):
請求節點的 Term 大於自己的 Term,且自己尚未投票給其它節點,則接受請求,把票投給它;
請求節點的 Term 小於自己的 Term,且自己尚未投票,則拒絕請求,將票投給自己。
第四階段:Candidate 轉為 Leader。
一輪選舉過後,正常情況下,會有一個 Candidate 收到超過半數節點(N/2 + 1)的投票,它將勝出並升級為 Leader。然後定時發送心跳給其它的節點,其它節點會轉為 Follower 並與 Leader 保持同步,到此,本輪選舉結束。
注意:有可能一輪選舉中,沒有 Candidate 收到超過半數節點投票,那麼將進行下一輪選舉。
在一個 Raft 集群中,只有 Leader 節點能夠處理客戶端的請求(如果客戶端的請求發到了 Follower,Follower 將會把請求重定向到 Leader) ,客戶端的每一個請求都包含一條被復制狀態機執行的指令。Leader 把這條指令作為一條新的日誌條目(Entry)附加到日誌中去,然後並行得將附加條目發送給 Followers,讓它們復制這條日誌條目。
當這條日誌條目被 Followers 安全復制,Leader 會將這條日誌條目應用到它的狀態機中,然後把執行的結果返回給客戶端。如果 Follower 崩潰或者運行緩慢,再或者網路丟包,Leader 會不斷得重復嘗試附加日誌條目(盡管已經回復了客戶端)直到所有的 Follower 都最終存儲了所有的日誌條目,確保強一致性。
第一階段:客戶端請求提交到 Leader。
如下圖所示,Leader 收到客戶端的請求,比如存儲數據 5。Leader 在收到請求後,會將它作為日誌條目(Entry)寫入本地日誌中。需要注意的是,此時該 Entry 的狀態是未提交(Uncommitted),Leader 並不會更新本地數據,因此它是不可讀的。
第二階段:Leader 將 Entry 發送到其它 Follower
Leader 與 Followers 之間保持著心跳聯系,隨心跳 Leader 將追加的 Entry(AppendEntries)並行地發送給其它的 Follower,並讓它們復制這條日誌條目,這一過程稱為復制(Replicate)。
有幾點需要注意:
1. 為什麼 Leader 向 Follower 發送的 Entry 是 AppendEntries 呢?
因為 Leader 與 Follower 的心跳是周期性的,而一個周期間 Leader 可能接收到多條客戶端的請求,因此,隨心跳向 Followers 發送的大概率是多個 Entry,即 AppendEntries。當然,在本例中,我們假設只有一條請求,自然也就是一個Entry了。
2. Leader 向 Followers 發送的不僅僅是追加的 Entry(AppendEntries)。
在發送追加日誌條目的時候,Leader 會把新的日誌條目緊接著之前條目的索引位置(prevLogIndex), Leader 任期號(Term)也包含在其中。如果 Follower 在它的日誌中找不到包含相同索引位置和任期號的條目,那麼它就會拒絕接收新的日誌條目,因為出現這種情況說明 Follower 和 Leader 不一致。
3. 如何解決 Leader 與 Follower 不一致的問題?
在正常情況下,Leader 和 Follower 的日誌保持一致,所以追加日誌的一致性檢查從來不會失敗。然而,Leader 和 Follower 一系列崩潰的情況會使它們的日誌處於不一致狀態。Follower可能會丟失一些在新的 Leader 中有的日誌條目,它也可能擁有一些 Leader 沒有的日誌條目,或者兩者都發生。丟失或者多出日誌條目可能會持續多個任期。
要使 Follower 的日誌與 Leader 恢復一致,Leader 必須找到最後兩者達成一致的地方(說白了就是回溯,找到兩者最近的一致點),然後刪除從那個點之後的所有日誌條目,發送自己的日誌給 Follower。所有的這些操作都在進行附加日誌的一致性檢查時完成。
Leader 為每一個 Follower 維護一個 nextIndex,它表示下一個需要發送給 Follower 的日誌條目的索引地址。當一個 Leader 剛獲得權力的時候,它初始化所有的 nextIndex 值,為自己的最後一條日誌的 index 加 1。如果一個 Follower 的日誌和 Leader 不一致,那麼在下一次附加日誌時一致性檢查就會失敗。在被 Follower 拒絕之後,Leader 就會減小該 Follower 對應的 nextIndex 值並進行重試。最終 nextIndex 會在某個位置使得 Leader 和 Follower 的日誌達成一致。當這種情況發生,附加日誌就會成功,這時就會把 Follower 沖突的日誌條目全部刪除並且加上 Leader 的日誌。一旦附加日誌成功,那麼 Follower 的日誌就會和 Leader 保持一致,並且在接下來的任期繼續保持一致。
第三階段:Leader 等待 Followers 回應。
Followers 接收到 Leader 發來的復制請求後,有兩種可能的回應:
寫入本地日誌中,返回 Success;
一致性檢查失敗,拒絕寫入,返回 False,原因和解決辦法上面已做了詳細說明。
需要注意的是,此時該 Entry 的狀態也是未提交(Uncommitted)。完成上述步驟後,Followers 會向 Leader 發出 Success 的回應,當 Leader 收到大多數 Followers 的回應後,會將第一階段寫入的 Entry 標記為提交狀態(Committed),並把這條日誌條目應用到它的狀態機中。
第四階段:Leader 回應客戶端。
完成前三個階段後,Leader會向客戶端回應 OK,表示寫操作成功。
第五階段,Leader 通知 Followers Entry 已提交
Leader 回應客戶端後,將隨著下一個心跳通知 Followers,Followers 收到通知後也會將 Entry 標記為提交狀態。至此,Raft 集群超過半數節點已經達到一致狀態,可以確保強一致性。
需要注意的是,由於網路、性能、故障等各種原因導致「反應慢」、「不一致」等問題的節點,最終也會與 Leader 達成一致。
前面描述了 Raft 演算法是如何選舉 Leader 和復制日誌的。然而,到目前為止描述的機制並不能充分地保證每一個狀態機會按照相同的順序執行相同的指令。例如,一個 Follower 可能處於不可用狀態,同時 Leader 已經提交了若乾的日誌條目;然後這個 Follower 恢復(尚未與 Leader 達成一致)而 Leader 故障;如果該 Follower 被選舉為 Leader 並且覆蓋這些日誌條目,就會出現問題,即不同的狀態機執行不同的指令序列。
鑒於此,在 Leader 選舉的時候需增加一些限制來完善 Raft 演算法。這些限制可保證任何的 Leader 對於給定的任期號(Term),都擁有之前任期的所有被提交的日誌條目(所謂 Leader 的完整特性)。關於這一選舉時的限制,下文將詳細說明。
在所有基於 Leader 機制的一致性演算法中,Leader 都必須存儲所有已經提交的日誌條目。為了保障這一點,Raft 使用了一種簡單而有效的方法,以保證所有之前的任期號中已經提交的日誌條目在選舉的時候都會出現在新的 Leader 中。換言之,日誌條目的傳送是單向的,只從 Leader 傳給 Follower,並且 Leader 從不會覆蓋自身本地日誌中已經存在的條目。
Raft 使用投票的方式來阻止一個 Candidate 贏得選舉,除非這個 Candidate 包含了所有已經提交的日誌條目。Candidate 為了贏得選舉必須聯系集群中的大部分節點。這意味著每一個已經提交的日誌條目肯定存在於至少一個伺服器節點上。如果 Candidate 的日誌至少和大多數的伺服器節點一樣新(這個新的定義會在下面討論),那麼它一定持有了所有已經提交的日誌條目(多數派的思想)。投票請求的限制中請求中包含了 Candidate 的日誌信息,然後投票人會拒絕那些日誌沒有自己新的投票請求。
Raft 通過比較兩份日誌中最後一條日誌條目的索引值和任期號,確定誰的日誌比較新。如果兩份日誌最後條目的任期號不同,那麼任期號大的日誌更加新。如果兩份日誌最後的條目任期號相同,那麼日誌比較長的那個就更加新。
如同 4.1 節介紹的那樣,Leader 知道一條當前任期內的日誌記錄是可以被提交的,只要它被復制到了大多數的 Follower 上(多數派的思想)。如果一個 Leader 在提交日誌條目之前崩潰了,繼任的 Leader 會繼續嘗試復制這條日誌記錄。然而,一個 Leader 並不能斷定被保存到大多數 Follower 上的一個之前任期里的日誌條目 就一定已經提交了。這很明顯,從日誌復制的過程可以看出。
鑒於上述情況,Raft 演算法不會通過計算副本數目的方式去提交一個之前任期內的日誌條目。只有 Leader 當前任期里的日誌條目通過計算副本數目可以被提交;一旦當前任期的日誌條目以這種方式被提交,那麼由於日誌匹配特性,之前的日誌條目也都會被間接的提交。在某些情況下,Leader 可以安全地知道一個老的日誌條目是否已經被提交(只需判斷該條目是否存儲到所有節點上),但是 Raft 為了簡化問題使用了一種更加保守的方法。
當 Leader 復制之前任期里的日誌時,Raft 會為所有日誌保留原始的任期號,這在提交規則上產生了額外的復雜性。但是,這種策略更加容易辨別出日誌,即使隨著時間和日誌的變化,日誌仍維護著同一個任期編號。此外,該策略使得新 Leader 只需要發送較少日誌條目。
raft 的讀寫都在 leader 節點中進行,它保證了讀的都是最新的值,它是符合強一致性的(線性一致性),raft 除了這個還在【客戶端交互】那塊也做了一些保證,詳情可以參考論文。但是 zookeeper 不同,zookeeper 寫在 leader,讀可以在 follower 進行,可能會讀到了舊值,它不符合強一致性(只考慮寫一致性,不考慮讀一致性),但是 zookeeper 去 follower 讀可以有效提升讀取的效率。
對比於 zab、raft,我們發現他們選舉、setData 都是需要過半機制才行,所以他們針對網路分區的處理方法都是一樣的。
一個集群的節點經過網路分區後,如一共有 A、B、C、D、E 5個節點,如果 A 是 leader,網路分區為 A、B、C 和 D、E,在A、B、C分區還是能正常提供服務的,而在 D、E 分區因為不能得到大多數成員確認(雖然分區了,但是因為配置的原因他們還是能知道所有的成員數量,比如 zk 集群啟動前需要配置所有成員地址,raft 也一樣),是不能進行選舉的,所以保證只會有一個 leader。
如果分區為 A、B 和 C、D、E ,A、B 分區雖然 A 還是 leader,但是卻不能提供事務服務(setData),C、D、E 分區能重新選出 leader,還是能正常向外提供服務。
1)我們所說的日誌(log)與狀態機(state machine)不是一回事,日誌指還沒有提交到狀態機中的數據。
2)新 leader 永遠不會通過計算副本數量提交舊日誌,他只能復制舊日誌都其他 follower 上,對於舊日誌的提交,只能是新 leader 接收新的寫請求寫新日誌,順帶著把舊日誌提交了。
❷ 在這上班兩個月了,老闆每次都讓我自己算工資,是為什麼,算好告訴他以後,還要我告訴他明細,具體的演算法
這意思就是讓你知道多勞多得,少勞少得,在這里工作每一分錢都要付出!讓你自己也要知道自己的價值!混日子,沒業績是拿不了多少錢的!老闆是個聰明人!
❸ 98年上班的鄉鎮事業幹部沒有職稱工資應該是多少,具體演算法
事業編,剛上班那就是普通人員,沒啥職務。如下詳解1、如果提拔成副科級領導職務的話,那就成了公務員了,具體沒有什麼硬性規定23問題合並回答,事業編制就是和單位簽訂聘用合同的人員。依據單位性質不同,工資由財政全供或者財政部分供給或者自收自支。公務員編制就是單位工作的正式人員。其工資由財政全供。參照公務員管理就是參照公務員法進行管理,公務員法同樣適用,和公務員有同等的待遇和晉升渠道。
❹ 工資如何核算正算還是倒算
設稅前為x,個稅為y
x-y=稅後工資
y=(x-2000)*適用稅率-速算扣除數
以下是個稅稅率表,直接代數就可以了
x-2000的差在500以內稅率5%速算扣除數0
500-200010%25
2000-500015%125
5000-2000020%375
❺ 基礎工資2000,二月份出勤18天,領導說算9天假工資演算法2000/28*27對不如不對應該怎麼算
按照勞動法肯定不能那樣算,如果應到的工月你實際工比較,基本工資不是你的總工資,真正的基本工資都要給你,考核和出勤可以按照你說的那種方法算。
,
❻ 詳解分布式共識(一致性)演算法Raft
所謂分布式共識(consensus),與 CAP理論 中的一致性(consistency)其實是異曲同工,就是在分布式系統中,所有節點對同一份數據的認知能夠達成一致。保證集群共識的演算法就叫共識演算法,它與一致性協議這個詞也經常互相通用。
當今最著名的共識演算法就是Paxos演算法。它由Leslie Lamport在1990年提出,很長時間以來都是一致性的事實標准。但是它有兩個不小的缺點:難以理解和證明,難以在實際工程中實現。Google Chubby的工程師就曾有以下的評論:
於是2014年,來自斯坦福的兩位大佬Diego Ongaro與John Ousterhout通過論文 《In Search of an Understandable Consensus Algorithm》 提出了一個新的共識演算法Raft。從題目就可以看出,Raft的特點就是容易理解,在此基礎上也容易實現,因此在real world中,它的應用也比Paxos要廣泛,比較有名的如etcd、Ku等。
Raft為了達到易懂易用的目標,主要做了兩件事:一是分解問題(decomposition),即將復雜的分布式共識問題拆分為 領導選舉 (leader election)、 日誌復制 (log replication)和 安全性 (safety)三個子問題,並分別解決;二是壓縮狀態空間(state space rection),相對於Paxos演算法而言施加了更合理的限制,減少因為系統狀態過多而產生的不確定性。
下面先簡要介紹共識演算法的基礎——復制狀態機,然後就來按順序研究Raft是如何解決三個子問題的。
在共識演算法中,所有伺服器節點都會包含一個有限狀態自動機,名為復制狀態機(replicated state machine)。每個節點都維護著一個復制日誌(replicated logs)的隊列,復制狀態機會按序輸入並執行該隊列中的請求,執行狀態轉換並輸出結果。可見,如果能保證各個節點中日誌的一致性,那麼所有節點狀態機的狀態轉換和輸出也就都一致。共識演算法就是為了保障這種一致性的,下圖示出簡單的復制狀態機及其相關架構。
根據分布式系統的 Quorum機制 與NRW演算法,集群中半數以上節點可用時,就能正確處理分布式事務,因此Raft集群幾乎都使用奇數節點,可以防止腦裂並避免浪費資源。採用ZAB協議的ZooKeeper集群也是如此。
在Raft集群中,任意節點同一時刻只能處於領導者(leader)、跟隨者(follower)、候選者(candidate)三種狀態之一。下圖示出節點狀態的轉移規則。
可見,集群建立時所有節點都是跟隨節點。如果在一定時間過後發現沒有領導節點,就會切換到候選狀態,發起選舉。得到多數票的候選者就會成為領導節點。如果候選節點或當前領導節點發現了更新的領導者,就會主動退回跟隨狀態。
領導節點全權負責管理復制日誌,也就是從客戶端接收請求,復制到跟隨節點,並告訴跟隨節點何時可以處理這些請求。如果領導節點故障或斷開連接,就會重新進行選舉。可見,領導節點的存在大大簡化了共識演算法的設計。
在上面的圖中出現了任期(term)這個詞。領導者並不是一直「在位」的,工作一段時間之後,就會選舉出新的領導者來接替它。
由上圖可見,藍色表示選舉時間段,綠色表示選舉出的領導者在位的時間段,這兩者合起來即稱作一個任期,其計數值是自增的。任期的值就可以在邏輯上充當時間戳,每個節點都會保存一份自己所見的最新任期值,稱為currentTerm。另外,如果因為票數相同,沒能選出領導,就會立即再發起新的選舉。
如果一個或多個跟隨節點在選舉超時(election timeout)內沒有收到領導節點的心跳(一個名為AppendEntries的RPC消息,本意是做日誌復制用途,但此時不攜帶日誌數據),就會發起選舉流程:
根據其他節點回復的消息,會出現如下三種結果:
獲得多數票的節點只要當選,就會立即給其他所有節點發送AppendEntries,避免再次選舉。另外,在同一任期內,每個節點只能投一票,並且先到先得(first-come-first-served),也就是會把票投給RequestVote消息第一個到達的那個節點。
至於上面的第三種情況,也就是所謂「split vote」現象,容易在很多跟隨者變成候選者時出現,因為沒有節點能得到多數票,選舉有可能無限繼續下去。所以,Raft設置的選舉超時並不是完全一樣的,而是有些許隨機性,來盡量使得投票能夠集中到那些較「快」的節點上。
領導節點選舉出來後,集群就可以開始處理客戶端請求了。前面已經說過,每個節點都維護著一個復制日誌的隊列,它們的格式如下圖所示。
可見,日誌由一個個按序排列的entry組成。每個entry內包含有請求的數據,還有該entry產生時的領導任期值。在論文中,每個節點上的日誌隊列用一個數組log[]表示。
當客戶端發來請求時,領導節點首先將其加入自己的日誌隊列,再並行地發送AppendEntries RPC消息給所有跟隨節點。領導節點收到來自多數跟隨者的回復之後,就認為該請求可以提交了(見圖中的commited entries)。然後,領導節點將請求應用(apply)到復制狀態機,並通知跟隨節點也這樣做。這兩步做完後,就不會再回滾。
這種從提交到應用的方式與最基礎的一致性協議——兩階段提交(2PC)有些相似,但Raft只需要多數節點的確認,並不需要全部節點都可用。
注意在上圖中,領導節點和4個跟隨節點的日誌並不完全相同,這可能是由於跟隨節點反應慢、網路狀況差等原因。領導節點會不斷地重試發送AppendEntries,直到所有節點上的日誌達到最終一致,而不實現強一致性。這就是CAP理論中在保證P的情況下,C與A無法兼得的體現。
日誌復制的過程仍然遺留了一個問題:如果領導或者跟隨節點發生異常情況而崩潰,如何保證日誌的最終一致性?它屬於下面的安全性問題中的一部分,稍後會解答它。
安全性是施加在領導選舉、日誌復制兩個解決方案上的約束,用於保證在異常情況下Raft演算法仍然有效,不能破壞一致性,也不能返回錯誤的結果。所有分布式演算法都應保障安全性,在其基礎上再保證活性(liveness)。
Raft協議的安全性保障有5種,分別是:選舉安全性(election safety)、領導者只追加(leader append-only)、日誌匹配(log matching)、領導者完全性(leader completeness)、狀態機安全性(state machine safety) 。下面分別來看。
選舉安全性是指每個任期內只允許選出最多一個領導。如果集群中有多於一個領導,就發生了腦裂(split brain)。根據「領導選舉」一節中的描述,Raft能夠保證選舉安全,因為:
在講解日誌復制時,我們可以明顯地看出,客戶端發出的請求都是插入領導者日誌隊列的尾部,沒有修改或刪除的操作。這樣可以使領導者的行為盡量簡單化,使之沒有任何不確定的行為,同時也作為下一節要說的日誌匹配的基礎。
日誌匹配的具體描述如下。
如果兩個節點的日誌隊列中,兩個entry具有相同的下標和任期值,那麼:
第一點自然由上一節的「領導者只追加」特性來保證,而第二點則由AppendEntries RPC消息的一個簡單機制來保證:每條AppendEntries都會包含最新entry之前那個entry的下標與任期值,如果跟隨節點在對應下標找不到對應任期的日誌,就會拒絕接受並告知領導節點。
有了日誌匹配特性,就可以解決日誌復制中那個遺留問題了。假設由於節點崩潰,跟隨節點的日誌出現了多種異常情況,如下圖。
注意圖中不是6個跟隨節點,而是6種可能的情況。比如a和b是丟失了entry,c和d是有多餘的未提交entry,e和f則是既有丟失又有冗餘。這時領導節點就會找到兩個日誌隊列中最近一條匹配的日誌點,將該點之後跟隨節點的所有日誌都刪除,然後將自己的這部分日誌復制給它。例如對於上圖中的情況e來說,最近一條匹配的日誌下標為5,那麼5之後的所有entry都會被刪除,被替換成領導者的日誌。
領導者完全性是指,如果有一條日誌在某個任期被提交了,那麼它一定會出現在所有任期更大的領導者日誌里。這也是由兩點來決定的:
根據這兩個描述,每次選舉出的領導節點一定包含有最新的日誌,因此只存在跟隨節點從領導節點更新日誌的情況,而不會反過來,這也使得一致性邏輯更加簡化,並且為下面的狀態機安全性提供保證。
狀態機安全性是說,如果一個節點已經向其復制狀態機應用了一條日誌中的請求,那麼對於其他節點的同一下標的日誌,不能應用不同的請求。這句話就很拗口了,因此我們來看一種意外的情況。
這里就有問題了,在時刻c的日誌與新領導者的日誌發生了沖突,此時狀態機是不安全的。
為了解決該問題,Raft不允許領導者在當選後提交「前任」的日誌,而是通過日誌匹配原則,在處理「現任」日誌時將之前的日誌一同提交。具體方法是:在領導者任期開始時,立刻提交一條空的日誌,所以上圖中時刻c的情況不會發生,而是像時刻e一樣先提交任期4的日誌,連帶提交任期2的日誌。就算此時S1再崩潰,S5也不會重新被選舉了。
如果想要更直觀地理解Raft,建議參考 這里 ,是一個用動畫來描述該演算法的網頁,形象生動。
❼ paxos演算法是什麼
Paxos演算法是萊斯利·蘭伯特(Leslie Lamport,就是LaTeX中的"La",此人現在在微軟研究院)於1990年提出的一種基於消息傳遞的一致性演算法。這個演算法被認為是類似演算法中最有效的。
蘭伯特提出的Paxos演算法包含2個部分:
一個是Basic Paxos演算法,描述的是多節點之間如何就某個值(提案Value)達成共識;
另一個是Multi-Paxos思想,描述的是執行多個Basic Paxos實例,就一系列值達成共識
可因為蘭伯特提到的Multi-Paxos思想,缺少代碼實現的必要細節(比如怎麼選舉領導者),所以在理解上比較難。Basic Paxos是Multi-Paxos思想的核心。
(7)領導演算法擴展閱讀
背景
Paxos演算法解決的問題是一個分布式系統如何就某個值(決議)達成一致。一個典型的場景是,在一個分布式資料庫系統中,如果各節點的初始狀態一致,每個節點執行相同的操作序列,那麼他們最後能得到一個一致的狀態。
為保證每個節點執行相同的命令序列,需要在每一條指令上執行一個「一致性演算法」以保證每個節點看到的指令一致。
一個通用的一致性演算法可以應用在許多場景中,是分布式計算中的重要問題。因此從20世紀80年代起對於一致性演算法的研究就沒有停止過。節點通信存在兩種模型:共享內存(Shared memory)和消息傳遞(Messages passing)。Paxos演算法就是一種基於消息傳遞模型的一致性演算法。
❽ 領導1男1女,員工6男2女,出差3人,1領導2員工,不能全是男的,有多少種演算法
一共有72種方法,全男的有21種,所以一共有51種
❾ 領導讓我統計一個指標,因計算方法有誤,導致出錯,出錯後領導找他更信任的人補救,我怎麼辦
首先領導讓你統計這個指標的時候,你就應該先問清楚,究竟要用什麼樣的方法計算,才會保證指標的正確性。現在你已經出錯了,領導找了一個他更信任的人來補救,你現在最重要的事情就是配合這個人,把這個工作先做好。
還有就是既然已經做錯了事情,那麼就要勇於承擔責任,向你的領導承認你的錯誤,並且向他表示你以後一定會更加仔細,更加認真的工作。年輕人出一些錯是很正常的,只要這些錯誤沒有給公司造成實質性的傷害就可以了。當然當你犯錯以後,你一定要吸取教訓,並且勇於承擔你應該承擔的責任。