白話解析分佈式系統,小白也能看懂

白話解析分佈式系統,小白也能看懂
西方詩歌有云,無人是孤島,你我心相繫。今天,這句話同樣適用於計算機。我們身邊的服務器,個人電腦以及數據存儲一直都在彼此通信。其實,我們每天使用的(和在開發的)應用和服務也都是構成完整系統的計算元素,彼此進行着交互,儘管很多時候我們感知不到。

對這些系統及其運行原理的研究屬於分佈式計算的一部分,而分佈式計算又是分佈式系統的核心所在。一方面,我們可以把分佈式系統看作計算機科學的擴展或繼續,它通常涉及問題解決、任務離散分解以及數據的處理、存儲等。

但另一方面,分佈式系統又完全不像計算機科學,因爲分佈式計算幾乎不考慮計算機本身的運行方式。在處理單機問題時,我們可能覺得一切都很簡單,但是如果涉及到多臺計算機,這將會變成一個非常棘手的問題。

萬物始於一
爲了更好的理解分佈式系統,我們最好換一個角度,一個完全相反的視角,那就是看一下哪些不是分佈式系統。事先聲明,即便是非分佈式系統,其概念也存在很多爭論。理論上,我們可以用很多方式來定義一個分佈式系統的否集,因爲分佈式系統的定義很大程度上依賴於它是的組成元素。

對於非分佈式系統,我們首先會想到的是單一系統,一個完全不與其他系統通訊並且只依靠自己的系統。

白話解析分佈式系統,小白也能看懂
什麼不是分佈式系統

(圖譯:不與其它系統交互的單一處理器或計算機就是非分佈式系統)

白話解析分佈式系統,小白也能看懂

我們電腦上的一個獨立運行的處理器就是一個單一系統。如果一個處理器並不與其他處理器通信,那自然也就不能把它歸到其它系統中。我們也可以把這個概念放大到計算機範疇,如果把它斷網,則也可以認爲是單一系統。但是也有研究做了相反的驗證(論文:你的電腦早已經是分佈式系統了,爲什麼你的系統還不是?)

分佈式這個詞,意思是分散、離散,將某些東西分散到某一個空間裏。如果我們只是考慮字面意思,那麼我們可以很自然的將只依靠自己的單一系統歸爲非分佈式系統,畢竟只有一臺機器在工作,我們不能將這個單系統再細分。

那在這種情形下,究竟什麼纔算是分佈式系統呢?當然,如果我們考慮到現實中電腦的交互方式,我們就會意識到,大多數的電腦其實都屬於分佈式系統的範疇。電腦只有在很少的情形下單獨運行,我們幾乎總是在用自己的電腦來訪問外部的程序或服務。

如果你玩過多玩家在線遊戲,預定過一張機票,轉發了一個貓咪的動畫,或者觀看了一部 Netflix 上的節目,又或者在 Amazon 上買了一件連體衣,所有的這一切其實都是通過分佈式系統完成的。
其實,你幾乎每天都在操作一個最大的分佈式系統,那就是互聯網。而分佈式系統卻不一定很大。實際上,大型化根本就算不上分佈式的本質特徵。

白話解析分佈式系統,小白也能看懂

分佈式系統定義

(圖譯:分佈式系統是指由既能同其他交互又能自主運行的個體所組成的系統)

某種程度上,分佈式系統只不過是相互交流的多個個體,這些個體同時又在執行自己的一些操作。這樣的系統可以簡單如你房子裏智能傳感器或無線接口,或是一個能連接你筆記本電腦的無線鍵盤或鼠標。

只要系統裏的處理器具有自主性,可以執行自己的功能操作,然後又可以同系統中其它的處理器交互,那我們就可以說這個系統是分佈式的。

相互支持的節點
到這裏,相信大家已經對分佈式系統比較熟悉了。讓我們更進一步,來看一下它的主要組成,也就是系統裏的個體們。

你可能已經留意到,我使用了電腦,處理器甚至是機器來代指分佈式系統的個體。具體用什麼術語來描述這個分佈式系統還要取決於系統本身。如果系統是一大堆分佈式服務器,那麼這個個體就是服務器,如果這個系統是指互相交流的處理器,那個體們就是處理器了。

爲了避免術語使用上出入過大,我們需要採用一些更寬泛的專業名字。我們可以將分佈式系統裏的單獨個體通稱爲節點。

白話解析分佈式系統,小白也能看懂

分佈式系統中節點的定義 (圖譯:分佈式系統中的單個個體成爲節點)

如果你覺得節點似曾相識,並讓你想起了圖論,那你的直覺還是挺厲害的,這兩者之間確實是有聯繫的。如果我們把計算機網絡當成分佈式系統(他們其實也是),那麼我們就可以把網絡裏不同節點的連接看成一個圖。

我們知道分佈式系統和其規模並沒有直接聯繫,而不同規模的系統中的節點本質上也不相同。節點既可以是一個硬件設施(傳感器),也可以是一款軟件(客戶端或服務端)。節點本身也不需要在同一個地方,因此係統是分佈式的,他們可以分佈在相距很遠的地方。

節點新視角
儘管分佈式系統的節點同圖論中的節點非常相似,但分佈式系統的節點還要相對麻煩一些,在處理非分佈式系統的單一系統時,我們也需要對節點做一些假設。面對分佈式計算,幾乎我們能遇到的所有的障礙最後都歸結到了一點:節點間的通訊。

節點中的操作 (圖譯:分佈式系統中,節點裏的操作很快,但節點間的通訊很慢)

分佈式系統中的節點具有自治的特點,他們可以運行自己的操作而不需要依賴外部環境。換句話說,分佈式系統中的某個節點可以獨立運行,而不需要其他節點。節點可以非常快速地運行自己的任務。
白話解析分佈式系統,小白也能看懂
節點裏的操作很快,但是節點間的通訊卻很慢
我們都知道,系統裏的節點可以放置到不同地點,他們依靠系統以及網絡來實現相互間的通訊,當然這也是一個完全不同的話題,我們不在這裏展開。我們要求節點裏的操作必須快速,但是我們對節點間的通訊卻不作這樣的要求。實際上,這種通訊通常非常緩慢,而且也不可靠,這也是分佈式計算中最大的問題。

白話解析分佈式系統,小白也能看懂

節點裏的操作總是被順序執行

節點裏的任務不僅要求快速,而且要求順序執行。我們可能一開始並沒有想太多,畢竟事情總是有先後順序的,但在分佈式系統中情形就不一定了。

儘管節點內的操作需要順序執行,但是節點接入到系統的那一刻,事情就變得複雜了。一旦我們把一個單節點接入分佈式系統,所有節點的操作就有可能被亂序執行。

部分原因是系統中的每個節點都是根據自己的時鐘進行操作的。

白話解析分佈式系統,小白也能看懂

節點操作依賴其內部時鐘

如果我們考慮分佈式系統裏的是不同的節點:傳感器、處理器、服務端或者數據庫,那麼結果會很清楚。但是,我們也可以猜猜這在分佈式系統中是如何成爲潛在問題的?這其實是分佈式計算裏的另一大問題,我會在本系列的後續文章中予以介紹。

我們一旦把某個節點放入分佈式系統,那麼它可能就沒那麼令人喜愛了。但這何嘗不是學習的樂趣呢,我們需要改變自己看待系統的方式,重新認識系統是如何作爲整體來運行的,以及思考不同節點如何共同協作來快速完成任務,這的確是一個學習新知識的好方式。

歡迎工作一到五年的Java工程師朋友們加入Java架構師:697558955

羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!

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