最近常常遇到許多高並發的問題,也就看了一下分散式系統 (Distributed Systems)的內部運作,畢竟這已經是現代架構的常態會使用的東西,這裡就記錄一下我看到的與整理下來的資訊
什麼是分散式系統 (Distributed Systems)
分散式系統是支援分散式處理的軟體系統,是由通訊網路互聯的多處理機體系結構上執行任務的系統。包括分散式作業系統、分散式程式設計語言及其編譯系統、分散式檔案系統分散式資料庫系統等,當然這些也是分散式的關鍵技術。
為什麼需要? 什麼場景可以使用?
以我自己遇到的問題來說,也就是遇到高並發的問題,高並發簡單來說就是在同時或者極短的時間內,有大量的請求打到服務端,而服務端需要在不會減速且不會有丟失資料的能力下,回覆給每一個使用者。
能夠一瞬間支撐如此大量的請求,這時候就需要分散式系統的設計將流量平均分給每台機器或者每個獨立的邏輯處理,能夠簡單快速的垂直或水平的拆分業務系統,讓其變成一個分散式的架構。
有什麼優缺點?
網路上有許多詳細列出他的優缺點我這邊不一項項列出,就列出我認爲比較重要的點:
- 快速,快速,快速
- 分散式系統因為切割出了多台機器或者多台維服務,因此可以並行處理,想想一百個人做事總比一個人做來得快麻
- 高可用性
- 因為工作負載都是分散在多台機器上,一台機器掛點並不會影響到其他機器,且因為有高度的擴展性,真的有機器掛了可以馬上擴充上新的機器做頂替
- 易擴充
- 延續上面的優點,因為高度的擴展性,所以在機器不夠或者需要增加容量時,可以很簡單的做到
缺點這邊就直接指向我遇到的困難,各台機器資料一致性的問題。
一致性問題
講到一致性就必須先提起分散式事務的理論
CAP理論
CAP 是指在一個分散式系統下, 包含三個要素:Consistency(一致性)、Availability(可用性)、Partition tolerance(分割槽容錯性),並且三者不可得兼。
C:Consistency,一致性,所有資料變動都是同步的。
A:Availability,可用性,即在可以接受的時間範圍內正確地響應使用者請求。
P:Partition tolerance,分割槽容錯性,即某節點或網路分割槽故障時,系統仍能夠提供滿足一致性和可用性的服務。
由於分割槽容忍性是可伸縮的最基本要求,放棄分割槽容忍性等於放棄可伸縮,所以分割槽容忍性是必選項,大部分的分散式系統都是在C和A之間做選擇。
而對於我的情況來說,我也必須要保證服務的可用性,因此我選擇了PA模式而C的一致性則使用弱一致性或者是最終一致性來解決問題
Base理論
因此延伸出了此理論來支持一致性
BASE 理論主要是解決 CAP 理論中分散式系統的可用性和一致性不可兼得的問題。BASE 理論包含以下三個要素:
BA:Basically Available,基本可用。
S:Soft State,軟狀態,狀態可以有一段時間不同步。
E:Eventually Consistent,最終一致,最終資料是一致的就可以了,而不是時時保持強一致
實踐
因主要問題在於資料的同步,因此實踐的部分則是使用了演算法解決
共識演算法 (Consensus Algorithm),而參考的就是Raft演算法
Raft 演算法
Raft more understandable than Paxos and also provides a better foundation for building practical systems
Raft就是簡單易懂化了Paxos的演算法,變得更淺顯易懂
Raft協議中,一個節點任一個時刻處於以下三個狀態:
- leader
- follower
- candidate
而詳細運作方面可以參考下面的動畫連結
http://thesecretlivesofdata.com/raft/
reference
- http://thesecretlivesofdata.com/raft/ raft動畫
- https://www.itread01.com/content/1545011956.html raft演算法
- https://medium.com/mold-project/consistency-e3e0fe41358d distributed system data consistency