我們爲什麼需要分佈式系統?

分佈式系統解決了什麼問題?

簡單來說,分佈式系統的出現,主要是爲了解決單體系統的不足。

  • 分佈式系統解決了單機性能瓶頸導致的成本問題。由於摩爾定律失效,廉價PC機的性能瓶頸無法繼續突破,雖然小型機和大型機能夠實現更高的單機性能,但是成本太高。
  • 分佈式系統解決了用戶量和數據量爆炸性地增大導致的成本問題。
  • 分佈式系統滿足了業務高可用的需求。
  • 分佈式系統解決了大規模軟件系統的迭代效率和成本問題。

總之,在互聯網時代,單機系統無法解決成本、效率和高可用問題,這樣就促成了分佈式系統的誕生。

分佈式系統如何解決成本、效率和高可用問題?

分佈式系統是指由一組通過網絡進行通信,爲了完成共同的任務,而協調工作的計算機節點組成的系統。它是通過多工作節點,來解決單機系統面臨的成本、效率和高可用問題。

如果一項技術能夠平民化,那麼它一定是在成本、效率和穩定性方面都有非常突出的表現。我們可以把分佈式系統看作單機系統的平民化和物美價廉的版本。

分佈式系統帶來什麼新問題?

分佈式系統可以解決單體系統的不足,但有利就會有弊,分佈式系統也帶來了內部工作節點的協調問題,主要體現在分佈式系統內部組件、實例之間,通過異步網絡進行通信和協調的問題上。

分佈式計算帶來的協調問題

主要包括以下幾方面:

  • 怎麼找到服務? 在分佈式系統內部,會有不同的服務,服務A怎麼找到服務B,是需要解決的問題,我們一版使用服務註冊與發現的機制來解決。
  • 怎麼找到服務實例?在找到服務後,當前的請求需要轉發到服務的哪一個實例呢?一般來說,如果同一個服務的實例是完全對等的(無狀態的),那麼按照負載均衡的策略來處理就足夠了,如果同一個服務的實例是不對等的(有狀態的),那麼就需要通過路由服務來確定將當前請求轉發到哪一個服務實例上。
  • 怎麼管理配置? 在分佈式系統內部,會有不同的服務,每個服務會有多個實例,並且還可能會自動擴縮容,在這種情況下,通過配置文件的方式來管理配置是低效、易出錯的,我們一般是通過一箇中心化的存儲來統一管理系統的配置,即配置中心。
  • 怎麼進行協同? 在分佈式系統中,不同的功能模塊已經拆分成不同的服務,並且一般運行在不同的機器上,這時就需要引入分佈式事務來處理複雜業務。
  • 怎麼確保請求只執行一次? 在分佈式系統中,各個模塊之間通過網絡進行連接,如果出現網絡抖動等情況,會導致模塊之間的調用失效,而調用失敗就可能觸發重試策略,使得程序可能出現沒有執行或者多次執行的情況。我們一般採用重試加冪等設計來確保請求只會被執行一次。
  • 怎麼避免雪崩? 系統雪崩是指由於正反饋循環導致不斷擴大規則的故障。一次雪崩通過是由於整個系統中,一個很小的部分出現故障而引發,進而導致系統的其他部分也出現故障。避免雪崩的策略主要有兩個思路:1)快速失敗和降級機制,2)彈性擴容機制。
  • 怎麼監控告警和故障恢復? 我們需要完善分佈式系統的監控,分佈式追蹤Trace,模擬故障的混沌工程以及相關的告警等機制,我們還需要做好故障恢復預案,確保在故障發生的時候,能夠快速恢復故障。

分佈式存儲帶來的協調問題

主要包括以下幾方面:

  • 在CAP及其相關理論與權衡,我們需要理解ACID、BASE和CAP這三個理論。
  • 我們怎麼做數據分片,我們需要解決怎麼將數據按照一定的規則,分別存儲到不同的機器上面,目前主要採用Hash和Region分片的策略。
  • 我們怎麼做數據複製,目前的主要方案有中心化方案和去中心化方案。
  • 我們怎麼做分佈式事務。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章