爲什麼需要分佈式系統

前言

最近在學習MIT6.824的分佈式系統課程,正在看Raft的論文,Raft是一種共識算法(Consensus algorithms),共識算法是用來保證分佈式系統裏數據的一致性的算法,所以也可以說是一個一致性算法。

在學習這個課程的過程中,發現其實對分佈式系統這個概念很模糊,好像知道是什麼卻又好像說不出來,不禁思考起來,究竟什麼是分佈式系統?爲什麼我們需要分佈式系統?這個問題也許很簡單,但是還是想通過自己的語言去表達,加深印象,希望我能闡述清楚。

單機系統遇到的問題

爲什麼我們需要分佈式系統而不是單機系統呢?一個概念或者理論的出現,都是爲了解決問題,單機系統遇到的問題是什麼呢?分佈式系統要解決的問題主要是單機系統中系統容量不足及提高系統可用性。

提高系統容量

隨着業務越來越複雜,服務也會變得越來越複雜,單臺機器的CPU、內存已經無法滿足部署一個龐大系統的性能要求。當然可以通過提高系統配置暫時解決問題,但是不管如何提高系統的配置,單臺機器總會達到性能瓶頸的時候,所以需要多臺機器才能應對這些擴張的功能。通過水平(加機器)和垂直(拆分爲多個子系統)拆分系統,變成了一個分佈式架構。

解決單點故障

在單臺機器上部署服務,如果機器出現故障導致服務掛了,那麼整個系統就會崩潰了。因此就要提高系統的可用性,系統的高可用性意味着一羣服務器運行時與單臺機器運行時沒區別。這意味着要解決系統架構中的單點故障問題,通過引入分佈式架構來增加冗餘,從而提高系統的可用性,即使單臺機器掛了也能保證服務正常運作。

基於上面兩個原因,我們就需要分佈式系統來解決系統容量不足和系統高可用問題。

分佈式系統是什麼

看看維基百科上的定義:

A distributed system is a system whose components are located on different networked computers, which communicate and coordinate their actions by passing messages to one another.[1] The components interact with one another in order to achieve a common goal. Three significant characteristics of distributed systems are: concurrency of components, lack of a global clock, and independent failure of components.[1] Examples of distributed systems vary from SOA-based systems to massively multiplayer online games to peer-to-peer applications.

在計算機科學裏,分佈式系統是一個組件/軟件分佈在網絡中不同服務器,服務器之間通過傳遞信息來通信和協作的系統。

分佈式架構

舉一個例子,來看看一個分佈式系統架構:

如圖所示,A、B、C三臺機器,機器A部署了服務AA、BB,機器B部署了BB、CC,機器C部署了AA、CC,AA需要調用BB,BB需要調用CC,即AA與BB通信,BB與CC通信。

一個接口rpcA調用AA,AA調用BB,BB調用CC,調用路徑如圖(1->2->3),每一個調用所到達的機器都有可能爲服務部署的機器之一。

圖所表示的分佈式系統架構有很多細節沒有展示出來,但這是一個比較簡單的分佈式架構例子。

分佈式系統中,要實現調用服務能到達部署的機器之一,就要用到負載均衡,可以分發集中的流量。像例子中的rpcA接口,調用鏈路rpcA->AA->BB->CC,整個鏈路較長,可以把全部的調用都寫到rpcA接口中,但是如果某一步失敗了,整個接口就失敗了,因此可以將流程拆分到多個小的服務,微服務化,提高系統性能。

以上就是分佈式系統的介紹及分佈式系統誕生的原因,分佈式系統的性價比很高、處理能力強、可靠性高、也有很好的擴展性,能爲系統帶來很好的性能和可用性。但是,分佈式系統中還有很多不確定的問題存在。

分佈式系統遇到的問題

做了負載均衡和微服務,是不是就可以高枕無憂,安心等待下一步的擴容擴展服務?很遺憾,分佈式系統中還有很多的不確定性,比如應用架構引入了分佈式系統之後,還有可能帶來下面這些問題:

  • 系統的吞吐量會變大,但是響應時間會變長。

  • 某個非核心服務出現故障,爲了不影響主流程,要加入服務降級和熔斷策略

  • 同一個請求可能被服務集羣裏面的多臺機器處理,然後保證冪等性

這些問題都需要引入其他手段解決來提高系統的穩定性,而加入了這些技術之後,還會衍生出更多的子問題,這就需要我們不斷地用各式各樣的技術和手段來解決這些問題。這些問題會在後面文章再做介紹。

總結

分佈式系統領域裏,還有一大片浩瀚的海洋可以探索,上面的例子只是從分佈式應用角度介紹了這個概念,分佈式系統裏面還有分佈式計算、分佈式數據與存儲等等領域。每一個領域都值得深入探索,這是一條漫長的學習之路。

原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。

如果本文對你有幫助,順手點個在看吧,謝謝

更多精彩內容,請關注個人公衆號。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章