SpringCloudAlibaba微服務實戰教程系列
-------------------------目錄-------------------------------------
第一部分:分布式架構理論
一、分布式與集群區別
二、傳統架構的弊端:
三、分布式系統面臨的問題
四、分布式中的一致性理論(CAP與BASE理論)
五、一致性協議:2PC協議
六、一致性協議:3PC協議
七、分布式一致性:Paxos算法
八、分布式一致性:Raft算法
第二部分:分布式系統設計策略
心跳機制、高可用、容錯性、負載均衡
-----------------------------------------------------------------
第一部分:分布式架構理論
一、分布式與集群區別
分布式:是多個人在一起做不同的事情;
集群:是多個在一起做同樣的事情;
二、傳統架構的弊端:
互聯網發展單機處理所有的業務弊端比較明顯,比如修改下單業務的邏輯,用戶登錄的功能沒有修改也需要重啟項目,同時團隊開發同一個項目溝通協作的成本也會隨着業務的發展而增多。
1、升級單機處理能力的性價比越來越低。
2、單機處理能力存在瓶頸。
3、穩定性和可用性這兩個標准很難達到。
三、分布式系統面臨的問題
1、通信異常
主要包括消息丟失與消息延時:網絡本來不可靠每次通信都可能存在網絡不可用的風險,最終導致分布式系統無法順利的進行網絡通信,另一種是分布式節點正常執行也會出現單機延時處理,從而影響整個業務處理的消息丟失和消息延遲
2、網絡分區
網絡之間出現網絡不通,但是各個子節點網絡正常通信,導致真個系統網絡環境被分隔獨立的區域,在分布式中就會存在局部小集群,對與數理的事務處理分布式一致性挑戰比較大
3、節點故障
節點故障是分布式系統比較常見的問題,制的是組成分布式系統的服務器節點出現宕機或者僵死
4、三態
分布式系統每次請求響應存在三態:成功、失敗、超時
超時有兩種情況:
1、網絡原因請求發出后對方沒有收到,
2、請求接收方收到請求,業務處理成功,返回失敗
四、分布式中的一致性理論
首先分布式中處理數據的一致性,保證一致性使用的是多副本存儲,副本存儲就是多份拷貝;
一致性分類:強一致性、弱一致性、單調弱一致性、最終一致性。
1、分布式理論:CAP理論
CAP理論含義:一個分布式系統中不可能同時滿足一致性(C:Consistency)、可用性(A:Availability)、分區容錯性(P:Partition tolerance)三個基本需求,最多只能同時滿足其中兩個。
一致性(C):分布式系統中的一致性是所有節點的數據一致,或者說所有的副本數據一致,強一致性
可用性(A):系統一直可用
分區容錯性(P):系統在遇到節點或者網絡分區故障的時候,還可以通過一致性和可用性的服務。
CAP理論具體應用:
Redis :屬於 cp 模型。Redis-cluster 屬於 ap 模型Redis-cluster
Zookeeper:屬於cp模型。
MongoDB :屬於cp模型。
Eureka:屬於ap模型。
2、分布式理論:BASE理論
五、一致性協議:2PC協議
什么事2PC:2PC就是分布式一致性協議,Two-Phase commit的縮寫,就是兩階段提交協議,將整個事務流程分為連個階段:准備階段和提交階段,2是兩個階段,p准備階段,c是提交階段。
例如:事務的提交(如下圖),
第一階段事務管理者向兩個資源發起准備請求,兩個資源返回准備完成,
第二階段:資源記錄日志undo/redo,事務管理者向兩個資源發起提交請求,兩個資源發起ack確認。
如果事務異常,那么第二階段事務管理這會發起事務回滾請求,都是資源返回ack確認。
優點: 原理簡單,實現方便
確定:- 同步阻塞
- 單點問題
- 數據不一致(第一個資源提交,第二個資源超時)
六、一致性協議:3PC協議
3PC是2PC的改進版,把二階段提交協議的“提交事務請求”過程一分為二。形成了CanCommit、PreCommit、DoCommit三個階段。
第一階段CanCommit:1、事務詢問參與者,2、各參與者返回是否支持事務
第二階段PreCommit:1、向各個參與者發送預提交處理,2、參與者記錄日志undo/redo,各參與者返回ack響應:同時等待提交commit或終止abort請求。
如果其中一個參與者下返回no或者超時,接下來協調者會發送alber終止請求
第三階段Docommit:1、向各個參與者發起提交請求,2、參與者提交事務完成后返回ack確認,
如果參與者中間事務中斷或者超時,協調者發起abort請求,執行第二階段的undo日志。
3PC詳細文章:https://blog.csdn.net/yulong1026/article/details/81002618
七、分布式一致性:Paxos算法
1、Paxos 算中中必須認識的三個角色
- Proposer:議案發起者(提議者)。提案者提倡客戶請求,試圖說服Acceptor對此達成一致,並在發生突時充當協調者以推動協議向前發展
- Acceptor:決策者,可以批准議案。Acceptor可以接受(accept)提案;如果某個提案被選(chosen),那么該提案里的value就被選定了
- Learner:最終決策的學習者(接受者)。
2、Proposer生成提案
首先Proposer在生成提案之前,需要先學習已經被選定或者可能被選定的value,然后以該value作為自己提出的議案的value,沒有value被選中的時候才可以自己決定value值,學習value是通過一個prepare請求實現的。
第一步:proposer選擇新提案編號N,然后向半數以上的Acceptor發送請求,要求每個acceptor做出下面的響應
a、Acceptor向Propose承諾保證不再接受任何編號小於N的提案。
b、如果Acceptor已經接受過提案,那么就想proposer反饋已經接受過編號小於N的,但是值是最大編號的提案值。
我們將這請求稱為編號為N的prepare請求
第二步:
3、Acceptor接受提案
Paxos算法推導過程:https://my.oschina.net/u/150175/blog/2992187
Paxos算法在線演示:http://thesecretlivesofdata.com/raft/
八、分布式一致性:Raft算法
Raft將系統中的角色分為領導者(Leader)、跟從者(Follower)和候選者(Candidate):
-
Leader:接受客戶端請求,並向Follower同步請求日志,當日志同步到大多數節點上后告訴Follower提交日志。
-
Follower:接受並持久化Leader同步的日志,在Leader告之日志可以提交之后,提交日志。
-
Candidate:Leader選舉過程中的臨時角色。
https://blog.csdn.net/daaikuaichuan/article/details/98627822
第二部分:分布式系統設計策略
一、心跳檢測
二、高可用性


三、容錯性
1、緩存穿透
描述: 緩存穿透是指緩存和數據庫中都沒有的數據,而用戶不斷發起請求,如發起為id為“-1”的數據或id為特別大不存在的數據。這時的用戶很可能是攻擊者,攻擊會導致數據庫壓力過大。
解決方案:接口層增加校驗,如用戶鑒權校驗,id做基礎校驗,id<=0的直接攔截;從緩存取不到的數據,在數據庫中也沒有取到,這時也可以將key-value對寫為key-null,緩存有效時間可以設置短點,如30秒(設置太長會導致正常情況也沒法使用)。這樣可以防止攻擊用戶反復用同一個id暴力攻擊
2、緩存擊穿
描述: 緩存擊穿是指緩存中沒有但數據庫中有的數據(一般是緩存時間到期),這時由於並發用戶特別多,同時讀緩存沒讀到數據,又同時去數據庫去取數據,引起數據庫壓力瞬間增大,造成過大壓力
解決方案:設置熱點數據永遠不過期。加互斥鎖:
四、緩存雪崩
描述: 緩存雪崩是指緩存中數據大批量到過期時間,而查詢數據量巨大,引起數據庫壓力過大甚至down機。和緩存擊穿不同的是, 緩存擊穿指並發查同一條數據,緩存雪崩是不同數據都過期了,很多數據都查不到從而查數據庫。
解決方案:緩存數據的過期時間設置隨機,防止同一時間大量數據過期現象發生。如果緩存數據庫是分布式部署,將熱點數據均勻分布在不同搞得緩存數據庫中。設置熱點數據永遠不過期。
四、負載均衡
負載有硬件負載與軟件負載,負載算法:輪詢、權重、ip_hash、最少鏈接等