本文摘自:華為云社區(qū)
作者:華為加拿大研究院軟件專家 Jet老師
小引
分布式系統(tǒng)是一個(gè)古老而寬泛的話題,而近幾年因?yàn)?“大數(shù)據(jù)” 概念的興起,又煥發(fā)出了新的青春與活力。本文將會(huì)通過(guò)對(duì)如下幾個(gè)問(wèn)題展開談一下分布式系統(tǒng):
什么是分布式系統(tǒng)?
為什么要用分布式系統(tǒng)?
分布式系統(tǒng)設(shè)計(jì)推演
CAP定理是什么?
分布式系統(tǒng)如何進(jìn)行分布?
分布式應(yīng)用通常使用的架構(gòu)類型哪些?
分布式系統(tǒng)的優(yōu)缺點(diǎn)有哪些?
1. 什么是分布式系統(tǒng)?
簡(jiǎn)單的來(lái)說(shuō),一個(gè)分布式系統(tǒng)是一組計(jì)算機(jī)系統(tǒng)一起工作,在終端用戶看來(lái),就像一臺(tái)計(jì)算機(jī)在工作一樣。
這組一起工作的計(jì)算機(jī),擁有共享的狀態(tài),他們同時(shí)運(yùn)行,獨(dú)立機(jī)器的故障不會(huì)影響整個(gè)系統(tǒng)的正常運(yùn)行。
我們現(xiàn)在舉個(gè)例子,傳統(tǒng)的數(shù)據(jù)庫(kù)是存儲(chǔ)在一臺(tái)機(jī)器的文件系統(tǒng)上的。每當(dāng)我們?nèi)〕龌蛘卟迦?a target="_blank">信息的時(shí)候,我們直接和那臺(tái)機(jī)器進(jìn)行交互。那么現(xiàn)在我們把這個(gè)傳統(tǒng)的數(shù)據(jù)庫(kù)設(shè)計(jì)成分布式數(shù)據(jù)庫(kù)。假設(shè)我們使用了三臺(tái)機(jī)器來(lái)構(gòu)建這臺(tái)分布式數(shù)據(jù)庫(kù),我們追求的結(jié)果是,在機(jī)器1上插入一條記錄,需要在機(jī)器3上可以返回那條記錄,當(dāng)然了,機(jī)器1和2也要能夠返回這條記錄。
2. 為什么要用分布式系統(tǒng)?
管理分布式系統(tǒng)是一個(gè)非常復(fù)雜的話題,里面充滿了陷阱和地雷。部署維護(hù)和調(diào)試分布式系統(tǒng)也是非常頭疼的一件事情,那為什么還要去做呢?
分布式系統(tǒng)最大的好處就是能夠讓你橫向的擴(kuò)展系統(tǒng)。
以前面提到的單一數(shù)據(jù)庫(kù)為例,能夠處理更多流量的唯一方式就是升級(jí)數(shù)據(jù)庫(kù)運(yùn)行的硬件,這就是縱向擴(kuò)展。而縱向擴(kuò)展的是有局限性的。當(dāng)?shù)搅艘欢ǔ潭纫院螅覀儠?huì)發(fā)現(xiàn)即使最好的硬件,也不能夠滿足當(dāng)前流量的需求。 橫向擴(kuò)展是指通過(guò)增加更多的機(jī)器來(lái)提升整個(gè)系統(tǒng)的性能,而不是靠升級(jí)單臺(tái)計(jì)算機(jī)的硬件。從價(jià)格上來(lái)說(shuō),橫向擴(kuò)展相比縱向擴(kuò)展更容易控制。 最根本的問(wèn)題是縱向擴(kuò)展有很強(qiáng)的局限性,達(dá)到最新硬件的能力以后,還是無(wú)法滿足中等或者大型工作負(fù)載的技術(shù)要求。橫向擴(kuò)展則沒(méi)有這個(gè)限制,它沒(méi)有上限,每當(dāng)性能下降的時(shí)候,你就需要增加一臺(tái)機(jī)器,這樣理論上講可以達(dá)到無(wú)限大的工作負(fù)載支持。 除此之外,在容錯(cuò)和低延遲上也有很多優(yōu)勢(shì)。容錯(cuò)性是指你的分布式系統(tǒng)的某個(gè)節(jié)點(diǎn)出現(xiàn)錯(cuò)誤以后,并不會(huì)導(dǎo)致整個(gè)系統(tǒng)的癱瘓。而單機(jī)系統(tǒng)出錯(cuò)以后,可能會(huì)導(dǎo)致整個(gè)系統(tǒng)的崩潰。低延遲是通過(guò)在不同的物理位置部署不同的機(jī)器,通過(guò)就近獲取的原則降低訪問(wèn)的延遲時(shí)間。
上面討論了分布式系統(tǒng)的種種好處,但是我們必須要清楚設(shè)計(jì)和運(yùn)行分布式系統(tǒng)并非易事。
3. 分布式系統(tǒng)設(shè)計(jì)推演
我們先講一個(gè)場(chǎng)景,我們現(xiàn)有的網(wǎng)絡(luò)應(yīng)用變得越來(lái)越流行,服務(wù)的人數(shù)也越來(lái)越多,導(dǎo)致我們的應(yīng)用程序每秒收到的請(qǐng)求,遠(yuǎn)遠(yuǎn)超過(guò)能夠正常處理的數(shù)量。這會(huì)導(dǎo)致應(yīng)用程序性能下降明顯,用戶也會(huì)注意到這一點(diǎn)。
那我們下面就來(lái)擴(kuò)展一下我們的應(yīng)用程序來(lái)滿足更高的要求。一般來(lái)說(shuō)我們讀取信息的頻率要遠(yuǎn)遠(yuǎn)超過(guò)插入或者修改的頻率。
下面我們使用主從復(fù)制策略來(lái)實(shí)現(xiàn)擴(kuò)展系統(tǒng)。我們可以創(chuàng)建兩個(gè)新的數(shù)據(jù)庫(kù)服務(wù)器,他們與主服務(wù)器同步。用戶業(yè)務(wù)對(duì)這兩個(gè)新的數(shù)據(jù)庫(kù)只能讀取。每次當(dāng)向主數(shù)據(jù)庫(kù)插入和修改信息時(shí),都會(huì)異步的通知副本數(shù)據(jù)庫(kù)進(jìn)行更新變化。
在這一步上我們已經(jīng)有了三倍于原來(lái)系統(tǒng)讀取數(shù)據(jù)的性能支持。但是這里有一個(gè)問(wèn)題,在數(shù)據(jù)庫(kù)事務(wù)的設(shè)計(jì)當(dāng)中,我們遵循ACID原則。但是在我們同時(shí)對(duì)其他兩個(gè)數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)更新的時(shí)候,我們有一個(gè)時(shí)間窗口失去了一致性原則。如果在這個(gè)時(shí)間窗口內(nèi)對(duì)兩個(gè)新的數(shù)據(jù)庫(kù)進(jìn)行查詢,可能查不到數(shù)據(jù)。這個(gè)時(shí)候如果同步這三個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù),就會(huì)影響寫操作的性能。這是我們?cè)谠O(shè)計(jì)分布式系統(tǒng)的時(shí)候,不得不承受的一些代價(jià)。
上面的主從復(fù)制策略解決了用戶讀取性能方面的需求,但是當(dāng)數(shù)據(jù)量達(dá)到一定程度,一臺(tái)機(jī)子上無(wú)法存放的時(shí)候,我們需要擴(kuò)展寫操作性能。要解決這樣的問(wèn)題,我們可以使用分區(qū)技術(shù)。分區(qū)技術(shù)是指根據(jù)特定的算法,比如用戶名a到z作為不同的分區(qū),分別指向不同的數(shù)據(jù)庫(kù)寫入,每個(gè)寫入數(shù)據(jù)庫(kù)會(huì)有若干讀取的從數(shù)據(jù)庫(kù)進(jìn)行同步提升讀取性能。
當(dāng)然,這樣使得整套系統(tǒng)變得更加復(fù)雜。最重要的難點(diǎn)是分區(qū)算法。你們?cè)囅胍幌拢绻鹀開頭的用戶名比其他開頭的用戶名要多很多,這會(huì)導(dǎo)致c區(qū)的數(shù)據(jù)量非常龐大,相應(yīng)地,對(duì)于c區(qū)的請(qǐng)求也會(huì)遠(yuǎn)遠(yuǎn)大于其他區(qū)。此時(shí)c區(qū)成為熱點(diǎn)。要避免熱點(diǎn),需要對(duì)c區(qū)進(jìn)行拆分。此時(shí)要進(jìn)行共享數(shù)據(jù)就會(huì)變得非常昂貴,甚至可能導(dǎo)致停機(jī)。
如果一切都很理想,那我們就擁有了 n倍的寫入流量,n是分區(qū)的數(shù)目。
當(dāng)然這里也存在一個(gè)陷阱,我們進(jìn)行數(shù)據(jù)分區(qū)以后,導(dǎo)致除了分區(qū)鍵以外的查詢都變得非常低效,尤其是對(duì)于sql語(yǔ)句如join查詢就變得非常之糟糕,導(dǎo)致一些復(fù)雜的查詢根本無(wú)法使用。
這里有一個(gè)思考題:如何選擇更好的分區(qū)策略算法?
4. CAP定理是什么?
這個(gè)定理是指一個(gè)分布式系統(tǒng)不能同時(shí)具有一致性,可用性和分區(qū)容忍性。
一致性Consistency:依次讀寫的是什么就是什么。
可用性Availability:整個(gè)系統(tǒng)不會(huì)崩潰, 每個(gè)非故障節(jié)點(diǎn)總會(huì)有一個(gè)相應(yīng)。
分區(qū)容忍Partition tolerant:盡管有分區(qū),系統(tǒng)仍能繼續(xù)運(yùn)行并保持其一致性和可用性。
對(duì)于任何分布式系統(tǒng)來(lái)說(shuō),分區(qū)容忍是一個(gè)給定的條件,如果沒(méi)有這一點(diǎn),就不可能做到一致性和可用性。試想如果兩個(gè)節(jié)點(diǎn)鏈接斷掉了,他們?nèi)绾文軌蜃龅郊瓤捎糜忠恢?
最后你只能選擇在網(wǎng)絡(luò)分區(qū)情況下,你的系統(tǒng)要么強(qiáng)一致,要么高可用。
實(shí)踐表明大多數(shù)應(yīng)用程序更看重可用性。這個(gè)考量的主要原因是在不得不同步機(jī)器里實(shí)現(xiàn)強(qiáng)于一致性是時(shí),網(wǎng)絡(luò)延遲會(huì)成為一個(gè)問(wèn)題。這類因素使得應(yīng)用程序通常會(huì)選擇提供高可用性的解決方案。
此時(shí)采用的是最弱的一致性模型來(lái)解決的,這種模型保證了如果沒(méi)有對(duì)某個(gè)項(xiàng)目進(jìn)行新的更新,最終對(duì)該項(xiàng)目的所有訪問(wèn)都會(huì)返回最新的值。這些系統(tǒng)提供了BASE屬性,這是相對(duì)于傳統(tǒng)數(shù)據(jù)庫(kù)的ACID來(lái)講的。
也就是( Basically available)基本上是可用的,系統(tǒng)總會(huì)返回一個(gè)響應(yīng)。
( Soft state)軟狀態(tài), 系統(tǒng)可以隨著時(shí)間的推移而變化,甚至在沒(méi)有輸入的情況下也可以變化, 如保持最終的一致性的同步。 ( Eventual consistency)最終的一致性, 在沒(méi)有輸入的情況下,數(shù)據(jù)遲早會(huì)傳播到每一個(gè)節(jié)點(diǎn)上,從而變得一致。
追求高可用的分布式數(shù)據(jù)庫(kù)例子有Cassandra;看重強(qiáng)一致性的數(shù)據(jù)庫(kù),有HBase, Redis, Zookeeper。
5. 分布式系統(tǒng)如何進(jìn)行分布?
我們來(lái)看一下分布系統(tǒng)進(jìn)行分布的常用方式:
5.1哈希
以哈希方式把不同的值進(jìn)行哈希運(yùn)算,映射到不同的機(jī)器或者節(jié)點(diǎn)上。這種方式在擴(kuò)展的時(shí)候比較困難,因?yàn)閿?shù)據(jù)分散在多個(gè)機(jī)器上很容易出現(xiàn)分布不均的情況,常見(jiàn)的哈希對(duì)象有ip,url,id等。
5.2 數(shù)據(jù)范圍
按數(shù)據(jù)范圍分布,比如ID在1~100的在機(jī)器a上,ID在100~200的在機(jī)器b上,諸如此類。這種分布方法數(shù)據(jù)比較均勻。如果某個(gè)節(jié)點(diǎn)處理能力有限,可以直接分裂這個(gè)節(jié)點(diǎn)。維護(hù)數(shù)據(jù)分布的這些原數(shù)據(jù),如果量非常大的話,可能會(huì)出現(xiàn)單點(diǎn)瓶頸。因此一定要嚴(yán)格控制元數(shù)據(jù)量。
5.3 數(shù)據(jù)量
按數(shù)據(jù)量來(lái)分布數(shù)據(jù),是以較為固定的大小將數(shù)據(jù)劃分為若干的數(shù)據(jù)塊,再把不同的數(shù)據(jù)塊分布到不同的服務(wù)器上。以數(shù)據(jù)量來(lái)進(jìn)行分布的這些數(shù)據(jù),也需要被記錄下來(lái)作為元數(shù)據(jù)來(lái)管理。當(dāng)集群規(guī)模很大時(shí),元數(shù)據(jù)的量也會(huì)變大。
5.4副本與數(shù)據(jù)分布
這種方式是指把數(shù)據(jù)給分散到多個(gè)服務(wù)器上。如果其中一臺(tái)出現(xiàn)問(wèn)題,請(qǐng)求就會(huì)被轉(zhuǎn)到其他服務(wù)器上。其原理是多個(gè)機(jī)器互為副本,這是比較理想的實(shí)現(xiàn)負(fù)載分壓的方式。
5.5一致性哈希
一致性哈希。通過(guò)哈希域構(gòu)造哈希環(huán),在增加機(jī)器時(shí),變動(dòng)的是其附近的節(jié)點(diǎn),分?jǐn)偟氖歉浇?jié)點(diǎn)的壓力,其元數(shù)據(jù)的維護(hù)和按數(shù)量分布的維護(hù)方式一致。
我們現(xiàn)在來(lái)看一下使用以上方式進(jìn)行分布的例子:GFS, HDFS:按數(shù)據(jù)量分布。 Map reduce:按GFS數(shù)據(jù)分布做本地化。 BigTable, HBase按數(shù)據(jù)范圍分布。 Pnuts:按哈希方式或者數(shù)據(jù)范圍分布。 Dynamo, Cassndra:按一致性哈希分布。 Mola, Armor, BigPipe:按哈希方式分布。 Doris:按哈希方式和按數(shù)據(jù)量分布進(jìn)行組合。
6. 分布式應(yīng)用通常使用的架構(gòu)類型哪些?
6.1 客戶端服務(wù)器
在這個(gè)類型中,分布式系統(tǒng)架構(gòu)有一個(gè)服務(wù)器作為共享資源。比如打印機(jī)數(shù)據(jù)庫(kù)或者網(wǎng)絡(luò)服務(wù)器。它有多個(gè)客戶機(jī),這些客戶機(jī)決定何時(shí)使用共享資源,如何使用和顯示改變數(shù)據(jù),并將其送回服務(wù)器,像git這樣的代碼倉(cāng),這是一個(gè)很好的例子。
6.2 三層架構(gòu)
這種架構(gòu)把系統(tǒng)分為表現(xiàn)層,邏輯層和數(shù)據(jù)層,這簡(jiǎn)化了應(yīng)用程序的部署,大部分早期的網(wǎng)絡(luò)應(yīng)用都是三層的。
6.3 多層架構(gòu)
上面的三層架構(gòu)是多層架構(gòu)的一種特殊形式。一般會(huì)把上面的三層進(jìn)行更詳細(xì)的劃分,比如說(shuō)以業(yè)務(wù)的形式進(jìn)行分層。
6.4 點(diǎn)對(duì)點(diǎn)架構(gòu)
在這種架構(gòu)中,沒(méi)有專門的機(jī)器提供服務(wù)或管理網(wǎng)絡(luò)資源。而是將責(zé)任統(tǒng)一分配給所有的機(jī)器,成為對(duì)等機(jī),對(duì)等機(jī)既可以作為客戶機(jī),也可以作為服務(wù)器。這種架構(gòu)的例子,包括bittorrent和區(qū)塊鏈。
6.5 以數(shù)據(jù)庫(kù)為中心
這種架構(gòu)是指用一個(gè)共享的數(shù)據(jù)庫(kù),使分布式的各個(gè)節(jié)點(diǎn)在不需要任何形式直接通信的情況下,進(jìn)行協(xié)同工作的架構(gòu)。
7. 分布式系統(tǒng)的優(yōu)缺點(diǎn)有哪些?
7.1分布式系統(tǒng)的優(yōu)點(diǎn)
1. 分布式系統(tǒng)中的所有節(jié)點(diǎn)都是相互連接的。所以節(jié)點(diǎn)可以很容易地與其他節(jié)點(diǎn)共享數(shù)據(jù)。 2. 更多的節(jié)點(diǎn)可以很容易地添加到分布式系統(tǒng)中,即可以根據(jù)需要進(jìn)行擴(kuò)展。 3. 一個(gè)節(jié)點(diǎn)的故障不會(huì)導(dǎo)致整個(gè)分布式系統(tǒng)的失敗。其他節(jié)點(diǎn)仍然可以相互通信。 4. 硬件資源可以與多個(gè)節(jié)點(diǎn)共享,而不是只限于一個(gè)節(jié)點(diǎn)。
7.2分布式系統(tǒng)的缺點(diǎn)
1. 在分布式系統(tǒng)中很難提供足夠的安全,因?yàn)楣?jié)點(diǎn)以及連接都需要安全。 2. 一些消息和數(shù)據(jù)在從一個(gè)節(jié)點(diǎn)轉(zhuǎn)移到另一個(gè)節(jié)點(diǎn)時(shí),可能會(huì)在網(wǎng)絡(luò)中丟失。 3. 與單用戶系統(tǒng)相比,連接到分布式系統(tǒng)的數(shù)據(jù)庫(kù)是相當(dāng)復(fù)雜和難以處理的。 4. 如果分布式系統(tǒng)的所有節(jié)點(diǎn)都試圖同時(shí)發(fā)送數(shù)據(jù),網(wǎng)絡(luò)中可能會(huì)出現(xiàn)過(guò)載現(xiàn)象。
小結(jié)
最后談一下分布式系統(tǒng)與集群的關(guān)聯(lián)。我的觀點(diǎn)是這兩者并不是對(duì)立的。因?yàn)榉植际较到y(tǒng)是通過(guò)多個(gè)節(jié)點(diǎn)的集群來(lái)完成一個(gè)任務(wù),讓外界看起來(lái)是跟一套系統(tǒng)作為一個(gè)整體打交道。
一套分布式系統(tǒng)可以有多個(gè)集群,這些集群可以業(yè)務(wù)進(jìn)行劃分,也可以物理區(qū)域進(jìn)行劃分。每一個(gè)集群可以作為這個(gè)分布式系統(tǒng)的一個(gè)節(jié)點(diǎn)。這些集群節(jié)點(diǎn)組成的分布式系統(tǒng),又可以作為單個(gè)的節(jié)點(diǎn)與其他的節(jié)點(diǎn)組成一個(gè)集群。
原文標(biāo)題:開發(fā)分布式系統(tǒng),這7個(gè)要點(diǎn)你掌握了嗎?
文章出處:【微信公眾號(hào):華為開發(fā)者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
分布式系統(tǒng)
+關(guān)注
關(guān)注
0文章
146瀏覽量
19346
原文標(biāo)題:開發(fā)分布式系統(tǒng),這7個(gè)要點(diǎn)你掌握了嗎?
文章出處:【微信號(hào):Huawei_Developer,微信公眾號(hào):華為開發(fā)者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
分布式云化數(shù)據(jù)庫(kù)有哪些類型
基于ptp的分布式系統(tǒng)設(shè)計(jì)
安科瑞Acrel-1000DP分布式光伏監(jiān)控系統(tǒng)在8.3MWp分布式光伏發(fā)電中的應(yīng)用
AFE4410和AFE4420都支持多個(gè)外接PD,這些分布式PD位置是可以隨便放置的嗎?
分布式光伏發(fā)電系統(tǒng)的應(yīng)用

分布式輸電線路故障定位中的分布式是指什么

安科瑞分布式光伏系統(tǒng)在某重工企業(yè)18MW分布式光伏中應(yīng)用

分布式光纖測(cè)溫系統(tǒng)DTS
分布式SCADA系統(tǒng)的特點(diǎn)的組成
分布式光伏發(fā)電有哪些優(yōu)點(diǎn)?分布式光伏發(fā)電有哪些應(yīng)用形式?
分布式能源是什么意思?分布式能源有什么優(yōu)勢(shì)?
分布式光伏監(jiān)控系統(tǒng)解決方案

HarmonyOS實(shí)戰(zhàn)案例:【分布式賬本】

評(píng)論