分佈式系統的通俗易懂解釋

網上找了些資料,看完覺得明白了很多~~~

著作權歸作者所有。
商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
作者:林建入
鏈接:http://www.zhihu.com/question/22764869/answer/56011081
來源:知乎

一、三個步驟完成華麗轉身——任意軟件變爲“分佈式”

分佈式——一個高大上的名詞,是計算機軟件設計中人民羣衆喜聞樂見的“逼格滿滿”、“不明覺厲”的幾個名詞之一。但很可惜,這玩意兒一點也不復雜,甚至有些“簡單”。不信?你只要遵循下述步驟即可將任何一個軟件拆分爲“分佈式”的:

1,將你的整個軟件視爲一個系統(不管它有多複雜)

2,將整個系統分割爲一系列的 Process(進程), 每個 Process 完成一定的功能

3,將這些 Process 分散到不同的機器上。分散後,選擇若干種(沒錯一種可能不夠)通信協議把他們連接起來**
蹬***

蹬蹬蹬~大功告成。哈哈別打我,這真的是很嚴肅的通用型三步驟大殺器,對付任何軟件,是任何軟件都可以的。接下來我當然要解釋清楚爲什麼。

二、跳出誤區——分佈式不等於並行計算

人們常常把分佈式系統自然而然的和並行計算聯繫起來。然而這並不正確。實際上,分佈式系統並不一定是並行的,舉個簡單的例子就能理解——

某軟件,功能如下:

提示用戶輸入兩個數 A 和 B
在內部,對 A 和 B 執行某數學運算,獲得 C
輸出 C

很簡單吧?這三個步驟是無法並行的。它們需要被依次執行。但是這個軟件依然可以被改爲分佈式的,方法就是用前面提到的方法,把步驟 2 的計算過程獨立爲一個 Process 移動到另外一臺計算機上完成。

如果我們從整個系統流程的觀點來看,並沒有什麼並行。整個過程都是順序執行的。只不過執行時出現了“跨設備”的現象而已。可見,分佈式本身就只如其字面意思所指,指的僅僅是從結構角度的分散而已。

當然啊,現實世界中,我們更多的時候鍾情於分佈式,還是因爲它與並行之間可以相互配合。例如實現既是分佈同時也是並行的系統。

好了,理解這一點之後就不難解釋爲什麼我會說前文提到的三步驟是萬用大法了。接下來我們繼續討論分佈式本身。

三、拆分+連接是分佈式系統的本質

所謂分佈式,無非就是”將一個系統拆分成多個子系統並散佈到不同設備“的過程而已。

本質上而言,實現一個分佈式系統,最核心的部分無非有兩點:

如何拆分——可以有很多方式,核心依據一是業務需求,二是成本限制。這是實踐中構建分佈式系統時最主要的設計依據。
如何連接——光把系統拆開成 Process 還不夠,關鍵是拆開後的 Process 之間還要能通信,因此涉及通信協議設計的問題,需要考慮的因素很多,好消息是這部分其實成熟方案很多

四、爲什麼你要使用分佈式?

分佈式系統並非靈丹妙藥,解決問題的關鍵還是看你對問題本身的瞭解。通常我們需要使用分佈式的常見理由是:

爲了性能擴展——系統負載高,單臺機器無法承載,希望通過使用多臺機器來提高系統的負載能力
爲了增強可靠性——軟件不是完美的,網絡不是完美的,甚至機器本身也不可能是完美的,隨時可能會出錯,爲了避免故障,需要將業務分散開保留一定的冗餘度

在以提供 Service 爲主的服務端軟件開發過程中常常遇到這些問題。

五、一些分佈式方案能解決你的問題,另一些卻不能,要學會的其實是選擇

籠統的討論分佈式沒有太大的意義,就如我剛纔所談的,實際上分佈式很容易實現。真正難的地方在於如何選擇正確的分佈方案。

例如,當你想要建立一個分佈式的數據管理系統的時候,你就必須得面對“一致性”問題。如果你對數據一致性要求很高,你就不得不容忍一些缺陷例如規模伸縮困難;而如果你放棄它,你可以輕鬆伸縮規模,但你必須解決好由此帶來的一系列數據不一致導致的問題。(CAP 問題)

於是你會意識到,有許多種分佈方案,爲了正確解決你的問題,你需要對每一個方案都進行了解,並評估,選擇不同的方案有時候區別不大,有時候卻會深刻的影響整個系統中其他部分的工作方式,甚至影響用戶界面中用戶操作時的流程。這是我們學習分佈式系統的重點所在。

六、分佈式學習入門——基礎知識要點

如我前面所講,分佈式入門不難。主要包含如下知識點:

Process(進程)。在分佈式系統中,進程是基本單元
通信協議。Process 間需要相互配合才能完成工作,因此通信協議是最基本要解決的問題。這部分其實挺複雜,牽涉面光,不過核心還是抓住兩方面,一是存在哪些需求,二是各個協議如何滿足這些需求
命名法。兩個 Process 要通信,必須相互知道對方的名字,名字可以是數字,也可以是結構化的字符串。例如衆所周知域名系統就是一種命名方案,但是方案還有很多,各有特點
協作。上面都在談 Process 之間的通信,可是爲什麼要通信?因爲要協作。協作是個複雜的主題,其中最基本最基本的一個問題就是同步問題。而聊同步問題必然要聊“鎖”……知識點就這麼展開了

上面幾點是最基礎的知識。瞭解了這些其實就算入門了。可是如何進階呢?那麼必然要開始學習下面的問題:

一致性。數據存儲時,最基本的問題。其實也是實際設計系統時常常需要反覆考慮的問題
容錯。冗餘是容錯的基礎,但並不是全部,分佈式本身爲實現容錯提供了一些便利,這也是實際設計系統時常常需要考慮的問題

好了,如果這些你都學的差不多了,那咱們“紙上談兵”也就告一段落了。接下來進入實戰演練。

七、實戰演練?其實你已經開發過分佈式系統了

你有沒有開發過簡單的增刪改查軟件?這類軟件通常都需要搭配一個獨立的數據庫管理系統共同完成功能。實際上,只要你開發過這麼簡單的軟件,那麼你就已經開發過分佈式系統了。

“什麼,基於數據庫管理系統開發出來的軟件就可以算分佈式呀?我做了很多這類軟件,怎麼我從來沒聽過這種說法?

真的,我沒開玩笑。還記得我們前面提到的嗎,什麼是分佈式?不就是一個大系統拆分成多個小系統分散到不同的設備上嗎。回想一下,當你寫一個簡單的增刪改查軟件時,只要用到數據庫管理系統,是不是具有如下特點:

整個系統中,你寫的代碼跑在 A 進程裏,而數據庫管理系統則跑在另外一個進程 B 裏
A 進程與 B 進程通過某種通信協議連接
既可以使 A 進程與 B 進程運行在同一臺機器上,也可以將它們分開運行於不同的機器上,並且系統依然可以照常運行

你看,這不就是分佈式系統的特點嗎?

“啊,原來如此,可是我印象裏一說分佈式的話,應該會講「集羣」啊啥的吧,這麼簡單的也算?”

關於「集羣」的問題我們之後會談到,它也是分佈式系統的一個應用,但談集羣的時候,我們談的往往是更具體的東西。但咱們看問題,需要抓住本質。別看麻雀小,五臟卻俱全。

不過,你已經熟悉的東西,我們在這裏就不再展開了,我們不妨關注其他一些更有趣的話題。

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