分布式技術(shù):從原理到應(yīng)用全面解析分布式技術(shù)的魅力與未來之分布式起源
在如今互聯(lián)網(wǎng)技術(shù)高速發(fā)展的背景下,分布式技術(shù)已經(jīng)是各種技術(shù)革命的先驅(qū),它早已不再局限于傳統(tǒng)的互聯(lián)網(wǎng)等應(yīng)用場景。諸如IoT物聯(lián)網(wǎng)、Mobile移動(dòng)計(jì)算、AI人工智能、Blockchain區(qū)塊鏈、Cloud云計(jì)算、Data大數(shù)據(jù)、Edge邊緣計(jì)算,無不都是以分布式技術(shù)為基石。在互聯(lián)網(wǎng)這個(gè)領(lǐng)域,分布式技術(shù)更加是各大型互聯(lián)網(wǎng)公司和大型項(xiàng)目必然具備的技能。毫不夸張地說,沒有分布式技術(shù)就沒有如今的互聯(lián)網(wǎng),也就沒有諸如阿里巴巴、騰訊這樣的巨無霸互聯(lián)網(wǎng)公司。
雖然各大互聯(lián)網(wǎng)公司都有或多或少的裁員計(jì)劃,但是分布式技術(shù)人才卻依然是各大公司爭奪的焦點(diǎn),因?yàn)槟膫€(gè)公司更好的掌握了分布式技術(shù),哪個(gè)公司就更容易在新一輪技術(shù)浪潮中獲得主動(dòng)。
接下來就通過分布式技術(shù)的起源來說明什么是分布式技術(shù)
單兵模式:單機(jī)模式
1946年情人節(jié)發(fā)布的ENIAC是世界上的第一臺(tái)通用計(jì)算機(jī),它占地170平米重達(dá)30噸,每秒可進(jìn)行5000次加法或者400次乘法運(yùn)算,標(biāo)志著單機(jī)模式的開始。
所謂單機(jī)模式是指,所有應(yīng)用程序和數(shù)據(jù)均部署在一臺(tái)電腦或服務(wù)器上,由一臺(tái)計(jì)算機(jī)完成所有的處理。
以火車票系統(tǒng)為例,包括用戶管理、火車票管理和訂單管理等模塊,每個(gè)模塊都包含自己的數(shù)據(jù),單機(jī)模式下,所有的模塊和數(shù)據(jù)均會(huì)部署在同一臺(tái)計(jì)算機(jī)上,整個(gè)系統(tǒng)所有的功能都部署在一臺(tái)計(jì)算機(jī)上。
如下圖,藍(lán)色虛線代表一臺(tái)計(jì)算機(jī)。
圖片
這種模式的好處是功能、代碼和數(shù)據(jù)集中,便于維護(hù)、管理和執(zhí)行。
這種模式的缺點(diǎn)是對(duì)于大型系統(tǒng)來說,牽一發(fā)而動(dòng)全身,一個(gè)簡單功能的修改,就要以短時(shí)間停止整個(gè)系統(tǒng)的代價(jià)來進(jìn)行升級(jí)系統(tǒng)。
再就是隨著系統(tǒng)的不斷更新迭代,系統(tǒng)會(huì)越來越龐大,這對(duì)單個(gè)計(jì)算機(jī)的處理能力有極高的要求,單個(gè)計(jì)算機(jī)的處理能力取決于CPU和內(nèi)存等,但硬件的發(fā)展速度和性能是有限的,而且升級(jí)硬件的性價(jià)比也是我們要考慮的,由此決定了CPU和內(nèi)存等硬件的性能將成為單機(jī)模式的瓶頸。
然而所有的功能及數(shù)據(jù)都部署在一臺(tái)計(jì)算機(jī)上面,那么系統(tǒng)能否正常運(yùn)行就依賴于這臺(tái)計(jì)算機(jī)是否健壯,計(jì)算機(jī)一旦宕機(jī),那么整個(gè)系統(tǒng)將癱瘓,不可用。
歸納一下,單機(jī)模式的主要問題是:性能受限、升級(jí)困難、存在單點(diǎn)失效問題。
多兵模式:數(shù)據(jù)分布式
單兵模式是就像是一個(gè)士兵執(zhí)行多項(xiàng)任務(wù),當(dāng)任務(wù)越來越多的時(shí)候,一個(gè)士兵累死也完不成目標(biāo),那就多個(gè)士兵一起分做這些任務(wù)。
為解決單機(jī)模式的問題,并行計(jì)算得到了發(fā)展,進(jìn)而出現(xiàn)了數(shù)據(jù)并行(也叫作數(shù)據(jù)分布式)模式。
在這個(gè)模式下,數(shù)據(jù)并行強(qiáng)調(diào)對(duì)數(shù)據(jù)進(jìn)行拆分,并且應(yīng)用程序并行運(yùn)行,也就是將相同應(yīng)用程序部署在多臺(tái)計(jì)算機(jī)上。要達(dá)到這個(gè)目的,我們必須首先把單機(jī)模式中的應(yīng)用程序和數(shù)據(jù)分離,然后再實(shí)現(xiàn)對(duì)數(shù)據(jù)的拆分。這里所說的任務(wù)就是提交的請(qǐng)求。
以鐵路售票系統(tǒng)為例,整個(gè)系統(tǒng)包含用戶管理模塊,火車票管理模塊,訂單模塊。
第一步,將應(yīng)用與數(shù)據(jù)分離,分別部署到不同的服務(wù)器上:
第二步,對(duì)數(shù)據(jù)進(jìn)行拆分,比如把同一類型的數(shù)據(jù)拆分到兩個(gè)甚至更多的數(shù)據(jù)庫中,這樣應(yīng)用服務(wù)器上的任務(wù)就可以針對(duì)不同數(shù)據(jù)并行執(zhí)行了。
對(duì)于鐵路售票系統(tǒng)來說,根據(jù)線路將用戶、火車票和訂單數(shù)據(jù)拆分到不同的數(shù)據(jù)庫中,部署到不同的服務(wù)器上,比如京藏線的數(shù)據(jù)放在數(shù)據(jù)庫服務(wù)器1上的數(shù)據(jù)庫中,滬深線的數(shù)據(jù)放在數(shù)據(jù)庫服務(wù)器2上的數(shù)據(jù)庫中。
圖片
這種模式的好處表現(xiàn)為以下兩點(diǎn):
- 可以將大量的任務(wù)分門別類的分配給多臺(tái)應(yīng)用服務(wù)器,每個(gè)應(yīng)用服務(wù)器對(duì)應(yīng)的數(shù)據(jù)也是獨(dú)立的,提高了數(shù)據(jù)訪問效率。這樣一來,相同的時(shí)間內(nèi)可以讓大量的任務(wù)并行處理,相比于單機(jī)模式,相同的時(shí)間內(nèi)能完成更多的任務(wù)量。
- 計(jì)算機(jī)成本方面,因?yàn)槎嗯_(tái)部署,每臺(tái)計(jì)算機(jī)分?jǐn)側(cè)蝿?wù)數(shù),實(shí)際每臺(tái)計(jì)算機(jī)處理的任務(wù)數(shù)不是很多,對(duì)計(jì)算機(jī)的配置要求不是很高,因此成本方面短期內(nèi)可能會(huì)略高于單機(jī)模式,但從長遠(yuǎn)來看,必然是低于單機(jī)模式的。
這種模式的缺點(diǎn)表現(xiàn)為以下兩點(diǎn):
- 數(shù)據(jù)分布式模式的運(yùn)維復(fù)雜度相比于單機(jī)模式高很多:
首先每臺(tái)應(yīng)用服務(wù)器分?jǐn)側(cè)蝿?wù)數(shù),那么哪些任務(wù)由哪臺(tái)應(yīng)用服務(wù)器處理這個(gè)問題需要有方案解決,一般是通過負(fù)載均衡器分發(fā)任務(wù),那是實(shí)現(xiàn)負(fù)載均衡器無疑提高了系統(tǒng)的復(fù)雜性。
其次隨著業(yè)務(wù)發(fā)展,分?jǐn)偟矫颗_(tái)應(yīng)用服務(wù)器的任務(wù)數(shù)變的很大的時(shí)候,應(yīng)用服務(wù)器頻繁對(duì)數(shù)據(jù)庫進(jìn)行訪問,很容易達(dá)到數(shù)據(jù)庫io瓶頸,此時(shí)就需要有方案解決數(shù)據(jù)庫io問題,一般采用的是數(shù)據(jù)庫讀寫分離,在進(jìn)行讀寫分離的時(shí)候又要特別注意主庫和從庫的數(shù)據(jù)一致性問題,這無疑提高了整個(gè)系統(tǒng)的復(fù)雜性。
再就是業(yè)務(wù)中往往會(huì)使得一批數(shù)據(jù)成為熱點(diǎn)數(shù)據(jù),此時(shí)會(huì)導(dǎo)致數(shù)據(jù)庫訪問頻繁,即便是讀寫分離也無法抗住這瞬間爆發(fā)的請(qǐng)求量,這個(gè)時(shí)候不得不引入緩存機(jī)制,將數(shù)據(jù)緩存到內(nèi)存,但是內(nèi)存是有限的,這就要求緩存機(jī)制必須具備緩存失效,緩存預(yù)熱等功能,這無疑增加了系統(tǒng)的復(fù)雜性。
不難看出數(shù)據(jù)分布式模式本來就是任務(wù)數(shù)增多后的產(chǎn)物,那系統(tǒng)的復(fù)雜性也理所應(yīng)當(dāng)會(huì)升高,這無可厚非,好在目前市場上對(duì)以上的問題都有成熟的解決方案。
2.數(shù)據(jù)分布式模式實(shí)現(xiàn)了多請(qǐng)求并行處理,但是并沒有從根本上解決單個(gè)請(qǐng)求的性能問題,比方說一個(gè)請(qǐng)求在單機(jī)模式下需要幾天甚至更長的時(shí)間來完成,數(shù)據(jù)分布式模式下并沒有減少這個(gè)請(qǐng)求的完成時(shí)間。
由此可見,數(shù)據(jù)并行模式的主要問題是:對(duì)提升單個(gè)任務(wù)的執(zhí)行性能及降低時(shí)延無效。
多兵種模式:任務(wù)分布式
多兵模式將大量的任務(wù)進(jìn)行分?jǐn)偺幚?,每個(gè)大兵將任務(wù)從頭到尾處理完成,這樣保證了整體任務(wù)的處理效率,但是卻無法提高單個(gè)任務(wù)的處理效率。假設(shè)多兵模式是將同個(gè)兵種10名士兵組成一個(gè)團(tuán)體來完成任務(wù),那么多兵種模式就是將多個(gè)兵種的士兵一共10名組成一個(gè)團(tuán)體來完成任務(wù),在這個(gè)團(tuán)體中可能每個(gè)兵種有一個(gè)或者兩個(gè)或者三個(gè)士兵,在執(zhí)行任務(wù)的時(shí)候多個(gè)不同兵種的士兵共同完成一個(gè)任務(wù)。多兵種模式就是將任務(wù)進(jìn)行拆分,提高單個(gè)任務(wù)的效率
任務(wù)分布式指的是,將單個(gè)復(fù)雜的任務(wù)拆分為多個(gè)子任務(wù),從而使得多個(gè)子任務(wù)可以在不同的計(jì)算機(jī)上并行執(zhí)行。 任務(wù)分布式模式強(qiáng)調(diào)的是對(duì)任務(wù)進(jìn)行拆分。就是將一個(gè)復(fù)雜的業(yè)務(wù)中的一條任務(wù)拆分成幾個(gè)子任務(wù),這些子任務(wù)中有個(gè)是需要串行執(zhí)行,有的則可以并行執(zhí)行,而那些可以并行執(zhí)行的子任務(wù)就是提升整個(gè)任務(wù)效率的關(guān)鍵。
我們?nèi)砸澡F路售票系統(tǒng)為例,當(dāng)購買火車票的時(shí)候,整個(gè)購買業(yè)務(wù)流程為:查詢用戶,查詢火車票,下單購買。任務(wù)拆分前,這個(gè)業(yè)務(wù)流程是串行的,耗時(shí)為這三個(gè)操作的時(shí)間和,任務(wù)分布式模式下的做法是將用戶管理、火車票管理、訂單管理拆分成多個(gè)子系統(tǒng)分別運(yùn)行在不同的計(jì)算機(jī)或服務(wù)器上。這樣一來,查詢用戶和查詢火車票的子任務(wù)是可以同時(shí)進(jìn)行的,總耗時(shí)不再是兩者之和,而是兩者中最大的那個(gè)耗時(shí),如下圖所示:
圖片
上面說的火車票的例子比較很籠統(tǒng)的,我們?cè)倌靡粋€(gè)電商的項(xiàng)目來說明下:
比如我們要買一個(gè)商品,商品頁面做了什么呢?商品頁面需要展示商品列表,推薦列表,商品類別展示,商家信息等等,在單機(jī)模式下,這些信息都將是一臺(tái)計(jì)算機(jī)完成查詢的,那么這些操作將是串行的,無疑查詢時(shí)間是很長的,你或許會(huì)說利用多線程可以將不同的查詢并行操作,這樣也是可以減少耗時(shí),但是你要知道不管有多少個(gè)線程并行,單臺(tái)計(jì)算機(jī)上的多線程并行其實(shí)都是cpu交替運(yùn)行(這里不考慮多cpu多核),說白了無非是在充分壓榨cpu的基礎(chǔ)上依然保持串行查詢。任務(wù)分布式模式下就會(huì)將推薦系統(tǒng)分離出來單獨(dú)部署在一臺(tái)服務(wù)器,將商品系統(tǒng)分離出來單獨(dú)部署一臺(tái)服務(wù)器,商家系統(tǒng)分離出來單獨(dú)部署一臺(tái)服務(wù)器,這樣在查詢商品列表的時(shí)候,商品系統(tǒng)可以利用多線程的方式并行調(diào)用推薦系統(tǒng)和商家系統(tǒng)分別查詢推薦列表和商家信息。這樣才能真正的實(shí)現(xiàn)并行查詢。
任務(wù)分布式的思想其實(shí)是任務(wù)拆分,但是拆分后的任務(wù)并不要求一定可以保持并行,對(duì)于一個(gè)復(fù)雜的任務(wù),如果拆分出來的任務(wù)都必須保持串行才符合業(yè)務(wù),那么拆分依然是有意義的,因?yàn)閷⒁粋€(gè)大的系統(tǒng)拆分成多個(gè)小的系統(tǒng)后,當(dāng)某個(gè)小功能需要升級(jí)時(shí),只需要升級(jí)那個(gè)對(duì)應(yīng)的小的子系統(tǒng)即可,避免了牽一發(fā)而動(dòng)全身,而且代碼分開維護(hù)也會(huì)降低開發(fā)成本,這也是分而治之的上乘思想。
**多兵種模式在提供了更好的性能、擴(kuò)展性、可維護(hù)性的同時(shí),也帶來了設(shè)計(jì)上的復(fù)雜性問題 **
分布式是什么?
說了半天分布式發(fā)展歷程,那到底什么是分布式呢?
顧名思義,其實(shí)就是分開部署的方式,所謂分開是指龐大的數(shù)據(jù)體系分成小的可以獨(dú)立的數(shù)據(jù)體系,復(fù)雜的系統(tǒng)拆分成功能單一的小的子系統(tǒng),拆分后的獨(dú)立體系各自部署在獨(dú)立的計(jì)算機(jī)上運(yùn)行。換個(gè)說法就是將相同或相關(guān)的程序運(yùn)行在多臺(tái)計(jì)算機(jī)上,從而實(shí)現(xiàn)特定目標(biāo)的一種計(jì)算方式。
從這個(gè)定義來看,數(shù)據(jù)并行、任務(wù)并行其實(shí)都可以算作是分布式的一種形態(tài)。從這些計(jì)算方式的演變中不難看出,產(chǎn)生分布式的最主要驅(qū)動(dòng)力量,是我們對(duì)于性能、可用性及可擴(kuò)展性的不懈追求。
實(shí)現(xiàn)分布式涉及到哪些內(nèi)容呢?
我們上面只是對(duì)概念的闡述,其實(shí)實(shí)現(xiàn)分布式還是比較復(fù)雜的,會(huì)涉及到很多技術(shù),但是仔細(xì)總結(jié)還是有章可循的,下圖基本可以概括分布式技術(shù)全部了吧。
圖片
這張圖是按照業(yè)務(wù)的架構(gòu)層次線,自底向上按照資源、通信、數(shù)據(jù)與計(jì)算的維度,梳理出了4個(gè)橫向技術(shù)層次:
- 分布式資源池化
- 分布式通信
- 分布式數(shù)據(jù)存儲(chǔ)與管理
- 分布式計(jì)算
這樣的劃分符合業(yè)務(wù)架構(gòu)設(shè)計(jì)的一般規(guī)律,即“在一定資源上,進(jìn)行一定通信,通過一定計(jì)算,完成一定數(shù)據(jù)的加工和處理,從而對(duì)外提供特定的服務(wù)”。
其實(shí)上面的這句話是分布式技術(shù)的基礎(chǔ):既然是分布式系統(tǒng),那么計(jì)算機(jī)(應(yīng)用程序)之間一定要通信,每個(gè)計(jì)算機(jī)(應(yīng)用程序)一定會(huì)有數(shù)據(jù)存儲(chǔ),也一定會(huì)有業(yè)務(wù)邏輯處理(計(jì)算),還有不同的業(yè)務(wù)子系統(tǒng)對(duì)計(jì)算機(jī)配置的以來程度也不一樣。
那么,通信是哪臺(tái)計(jì)算機(jī)(應(yīng)用程序)對(duì)哪臺(tái)計(jì)算機(jī)(應(yīng)用程序)通信,存儲(chǔ)是如何存儲(chǔ),如果是多臺(tái)計(jì)算機(jī)(應(yīng)用程序)可以提供計(jì)算,那么由哪臺(tái)計(jì)算機(jī)(應(yīng)用程序)最終提供計(jì)算,如果多個(gè)計(jì)算機(jī)(應(yīng)用程序)同時(shí)修改共享資源,那么如何保證不會(huì)出現(xiàn)數(shù)據(jù)一致性問題,如果計(jì)算機(jī)(應(yīng)用程序)宕機(jī),又該如何處理,這些問題的需要一個(gè)組織者,這個(gè)組織者進(jìn)行協(xié)同,調(diào)度,追蹤這些計(jì)算機(jī)(應(yīng)用程序),保證系統(tǒng)的高可用,數(shù)據(jù)一致性,同時(shí)還要兼顧性能和擴(kuò)展性。