分佈式系統介紹
標籤(空格分隔): 讀書筆記nginx
內容整理來自 <大型網站系統與java中間件>
算法
分佈式系統介紹
定義:
- 組件分佈在網絡計算機上
組件之間僅僅經過消息傳遞來通訊並協調行動數據庫
分佈式系統的意義:
- 升級單機處理能力的性價比
根據摩爾定律來講,若是把時間固定下來,所須要的處理器性能越高,付出的成本就越高,性價比就越低。並且單機處理器始終有瓶頸
- 單機處理能力存在瓶頸
單機處理器的瓶頸只能經過多機來解決
穩定性和可用性
若是採用單機系統,若是這臺機器一切正常,則一切ok,若是這臺機器壞了。整個應用就訪問不了了。若是要作容災備份等方案,就須要考慮分佈式系統了。服務器
負載均衡
- 硬件負載均衡
如f5等,大多比較昂貴。
軟件負載均衡
如lvs,nginx等。免費,可控性強網絡
![](http://static.javashuo.com/static/loading.gif)
總結:
1:增長網絡開銷與延遲,不過基本上影響很小,能夠不在考慮因素以內
2:負載均衡硬件/軟件出現問題,那麼整個網絡都會受到影響,因此須要考慮代理服務器的雙機熱備問題。並且在切換過程當中,未完成的請求仍是會受到影響。總的來講,是一種很是方便及適用的保證高可用的一種方式。負載均衡
- 採用名稱服務的直聯方式的請求調用
一樣是完成一次請求調用,與上面f5/lvs等最大的區別在於請求發起方與請求處理方不通過代理服務器也沒有代理服務器,他們雙方是直接鏈接的,不過外部有一個「名稱服務」的角色,它的做用是收集與提供請求處理的服務器的地址信息,起到的是一個地址交換的做用,原來在代理(lvs/f5)上作的工做被拆分到了名稱服務和發起請求的機器上了。打個比方,就像之前的114同樣,咱們不知道A家的電話號碼,能夠打114查一下就知道了。這個名稱服務就是起到了相似的做用。
- 採用規則服務器控制路由的請求調用
與名稱服務的方式很像,只是採用了規則服務器替換名稱服務。也同樣是直聯而不用經過代理服務器。這裏的區別主要是規則服務器自己不和請求處理的機器進行交互,只負責把規則提供給發起請求的服務器。
![](http://static.javashuo.com/static/loading.gif)
總結:
1.假如這個名稱服務/規則服務器暫時壞掉了,咱們也有很多的辦法能夠保證請求的正常處理。
2.發起請求方與處理請求方是直連的方式,減小了中間路徑及帶寬的消耗。
3.代碼升級較複雜分佈式
分佈式系統難點
- 缺少全局時鐘
- 面對故障獨立性
單機系統上,若是是機器或者程序的問題,整個程序就不能用了,在分佈式環境中,因爲分佈式系統由多個節點組成,所有壞掉的機率很小很小,可是會常常出現一部分節點/模塊有問題,另外一部分正常運行。對於這種現象叫作故障獨立性,必需要找到解決故障獨立性的辦法。
- 單點故障
在整個分佈式系統中,若是某個功能只有在某臺單機在支撐,那麼這個節點稱爲單點,其發生的故障稱爲單點故障。咱們要在分佈式系統中儘可能避免出現單點,儘可能保證全部的功能都是由集羣完成的。若是不能把單機實現爲集羣。那麼解決要作好下面兩點
- 給單點作好備份,可以在出問題時進行恢復,而且儘可能作到自動恢復。下降恢復全部時間
- 下降單點故障影響範圍
下面就是一個單點的例子,當交易數據庫出現故障時,整個系統就會癱瘓。
![](http://static.javashuo.com/static/loading.gif)
因此爲了解決這個單點的問題,咱們能夠添加另一個數據庫,與數據庫一保持相同的數據。
性能
4.事務
單機的事務很方便的就能控制,而在分佈式環境中,事務是比較重要也比較難解決的一個問題。主要是經過兩段提交(2pc)/最終一致/BASE/CAP/Paxos等來實現的。關於這些算法,能夠看一下下面的這些鏈接:
分佈式一致性算法:
http://www.hollischuang.com/archives/693
http://www.hollischuang.com/archives/663
兩階段提交協議/三階段提交協議:http://www.hollischuang.com/archives/681
BASE:http://www.hollischuang.com/archives/672
CAP:http://www.hollischuang.com/archives/666網站