把這兩天看的兩章一塊兒說一下。html
第五章,先是講snapshots就是快照,具體就是Chandy-Lamport算法,快照就是把一個分佈式系統以不少斷點(marker)爲間隔記錄下系統的狀態,包括單個進程本身的狀態以及不一樣進程之間的狀態,保存這些可能能夠用來進行錯誤處理之類的事情。算法
算法具體流程是啥呢,就是由某個進程向其餘進程發送marker,其餘進程接收並視狀況回信,而後紀錄本身的系統狀態...具體內容能夠看這裏https://zhuanlan.zhihu.com/p/53482103分佈式
而後是multicast,其實以前提過這個,中文叫組播,就是一個進程對系統內的一組進程傳遞消息,對應「廣播」(broadcast),也就是對全部成員都發送消息。有幾種類型的multicast算法,好比fifo,casual什麼的,casual就是知足lamport時間戳那種因果一致性的要求的。這一篇講的能夠看一下,比較形象https://www.cnblogs.com/hzmark/p/consistency_model.html,還有這個講得更清楚些https://blog.csdn.net/aigoogle/article/details/43271185。性能
最後是講consensus,咱們熟悉的paxos啊raft啊都是指這個問題,consensus就是指對於一個分佈式系統中的全部進程,要以某種方式保證它們產生同一個結果。這被證實是不可能的,不過經過paxos之類的算法能夠盡最大可能的保證一致性。像failure dection和leader election這類問題實際上是和consensus問題等價的。google
paxos能夠提供完整的safety和較大程度的liveness。對於一個系統來講safety的意思大致是,不會有壞事發生,好比各進程決策不一致。liveness意思就是最終必定會有好事發生,好比最後必定會選出一個leader。而後三哥很是簡略的講了下paxos的內容,由於實在過於簡略因此沒啥可說的,後面raft的時候再總結吧。.net
第六章,先是leader elcetion。分佈式系統裏須要一個leader,用做讀寫之類的操做,也能夠把調度放在leader機器裏面。因此就須要各進程選出一個leader,而後講了一個ring leader election的算法,其實很簡單,就是各進程組成一個環,而後沿着換互相交換某種屬性,最後能獲得一個最強的,那麼最強的天然就當領導了。具體內容這裏能夠看看http://www.javashuo.com/article/p-twswmitg-ee.html。講了兩個工業中用到的選舉算法,chubby和zookeeper,講的都很簡略,前面那個連接也有講。htm
而後講 Mutual Exclusion,就是進程互斥,爲何要進程互斥呢,就跟單系統的狀況同樣,由於不一樣的進程可能想要執行同一件事情,那麼同步執行的時候可能出問題。這個單系統的進程互斥咱們很熟悉了,就加鎖就完事了,分佈式系統的話其實也差很少,同樣很簡明,一個最簡單的算法就是選舉出一個leader,由這個leader持有一個token,而後每一個進程若是運行某段代碼的話就要像leader索要token,只有有token的程序才能執行這一段。blog
另外一個算法是ringed Mutual Exclusion,就是並無leader,全部進程組成圓桌輪流持有token,每一個人接到token後都檢查一下本身想不想執行,不想的話就日後傳。感受這兩種算法就是自由和平等之間的區別(。。)token
Ricart-Agrawala's Algorithm相對複雜一些,它沒有token而是利用了lamport timstamp,性能比前兩種好一些可是很佔帶寬,由於這個算法中每兩個進程之間都要通訊確認狀態。有一種Maekawa's Algorithm在此基礎上改善了帶寬,可是具體什麼原理我懶得聽了...進程
固然,現實中用的Mutual Exclusion都不是上面那幾種,因此瞭解瞭解就好...