最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

「主流技術(shù)」分布式詳解:什么是分布式系統(tǒng)?如何學(xué)習(xí)分布式系統(tǒng)?

2023-03-18 10:26 作者:董嘉dongjia  | 我要投稿

什么是分布式系統(tǒng)

分布式系統(tǒng)是由一組通過網(wǎng)絡(luò)進(jìn)行通信、為了完成共同的任務(wù)而協(xié)調(diào)工作的計算機節(jié)點組成的系統(tǒng)。分布式系統(tǒng)的出現(xiàn)是為了用廉價的、普通的機器完成單個計算機無法完成的計算、存儲任務(wù)。其目的是利用更多的機器,處理更多的數(shù)據(jù)。

首先需要明確的是,只有當(dāng)單個節(jié)點的處理能力無法滿足日益增長的計算、存儲任務(wù)的時候,且硬件的提升(加內(nèi)存、加磁盤、使用更好的CPU)高昂到得不償失的時候,應(yīng)用程序也不能進(jìn)一步優(yōu)化的時候,我們才需要考慮分布式系統(tǒng)。因為,分布式系統(tǒng)要解決的問題本身就是和單機系統(tǒng)一樣的,而由于分布式系統(tǒng)多節(jié)點、通過網(wǎng)絡(luò)通信的拓?fù)浣Y(jié)構(gòu),會引入很多單機系統(tǒng)沒有的問題,為了解決這些問題又會引入更多的機制、協(xié)議,帶來更多的問題。。。

在很多文章中,主要講分布式系統(tǒng)分為分布式計算(computation)與分布式存儲(storage)。計算與存儲是相輔相成的,計算需要數(shù)據(jù),要么來自實時數(shù)據(jù)(流數(shù)據(jù)),要么來自存儲的數(shù)據(jù);而計算的結(jié)果也是需要存儲的。在操作系統(tǒng)中,對計算與存儲有非常詳盡的討論,分布式系統(tǒng)只不過將這些理論推廣到多個節(jié)點罷了。

那么分布式系統(tǒng)怎么將任務(wù)分發(fā)到這些計算機節(jié)點呢,很簡單的思想,分而治之,即分片(partition)。對于計算,那么就是對計算任務(wù)進(jìn)行切換,每個節(jié)點算一些,最終匯總就行了,這就是MapReduce的思想;對于存儲,更好理解一下,每個節(jié)點存一部分?jǐn)?shù)據(jù)就行了。當(dāng)數(shù)據(jù)規(guī)模變大的時候,Partition是唯一的選擇,同時也會帶來一些好處:

(1)提升性能和并發(fā),操作被分發(fā)到不同的分片,相互獨立

(2)提升系統(tǒng)的可用性,即使部分分片不能用,其他分片不會受到影響

理想的情況下,有分片就行了,但事實的情況卻不大理想。原因在于,分布式系統(tǒng)中有大量的節(jié)點,且通過網(wǎng)絡(luò)通信。單個節(jié)點的故障(進(jìn)程crash、斷電、磁盤損壞)是個小概率事件,但整個系統(tǒng)的故障率會隨節(jié)點的增加而指數(shù)級增加,網(wǎng)絡(luò)通信也可能出現(xiàn)斷網(wǎng)、高延遲的情況。在這種一定會出現(xiàn)的“異常”情況下,分布式系統(tǒng)還是需要繼續(xù)穩(wěn)定的對外提供服務(wù),即需要較強的容錯性。最簡單的辦法,就是冗余或者復(fù)制集(Replication),即多個節(jié)點負(fù)責(zé)同一個任務(wù),最為常見的就是分布式存儲中,多個節(jié)點復(fù)雜存儲同一份數(shù)據(jù),以此增強可用性與可靠性。同時,Replication也會帶來性能的提升,比如數(shù)據(jù)的locality可以減少用戶的等待時間。

下面這種來自Distributed systems for fun and profit 的圖形象生動說明了Partition與Replication是如何協(xié)作的。


Partition和Replication是解決分布式系統(tǒng)問題的一記組合拳,很多具體的問題都可以用這個思路去解決。但這并不是銀彈,往往是為了解決一個問題,會引入更多的問題,比如為了可用性與可靠性保證,引用了冗余(復(fù)制集)。有了冗余,各個副本間的一致性問題就變得很頭疼,一致性在系統(tǒng)的角度和用戶的角度又有不同的等級劃分。如果要保證強一致性,那么會影響可用性與性能,在一些應(yīng)用(比如電商、搜索)是難以接受的。如果是最終一致性,那么就需要處理數(shù)據(jù)沖突的情況。CAP、FLP這些理論告訴我們,在分布式系統(tǒng)中,沒有最佳的選擇,都是需要權(quán)衡,做出最合適的選擇。

分布式系統(tǒng)挑戰(zhàn)

分布式系統(tǒng)需要大量機器協(xié)作,面臨諸多的挑戰(zhàn):

第一,異構(gòu)的機器與網(wǎng)絡(luò):

分布式系統(tǒng)中的機器,配置不一樣,其上運行的服務(wù)也可能由不同的語言、架構(gòu)實現(xiàn),因此處理能力也不一樣;節(jié)點間通過網(wǎng)絡(luò)連接,而不同網(wǎng)絡(luò)運營商提供的網(wǎng)絡(luò)的帶寬、延時、丟包率又不一樣。怎么保證大家齊頭并進(jìn),共同完成目標(biāo),這四個不小的挑戰(zhàn)。

第二,普遍的節(jié)點故障:

雖然單個節(jié)點的故障概率較低,但節(jié)點數(shù)目達(dá)到一定規(guī)模,出故障的概率就變高了。分布式系統(tǒng)需要保證故障發(fā)生的時候,系統(tǒng)仍然是可用的,這就需要監(jiān)控節(jié)點的狀態(tài),在節(jié)點故障的情況下將該節(jié)點負(fù)責(zé)的計算、存儲任務(wù)轉(zhuǎn)移到其他節(jié)點

第三,不可靠的網(wǎng)絡(luò):

節(jié)點間通過網(wǎng)絡(luò)通信,而網(wǎng)絡(luò)是不可靠的??赡艿木W(wǎng)絡(luò)問題包括:網(wǎng)絡(luò)分割、延時、丟包、亂序。

相比單機過程調(diào)用,網(wǎng)絡(luò)通信最讓人頭疼的是超時:節(jié)點A向節(jié)點B發(fā)出請求,在約定的時間內(nèi)沒有收到節(jié)點B的響應(yīng),那么B是否處理了請求,這個是不確定的,這個不確定會帶來諸多問題,最簡單的,是否要重試請求,節(jié)點B會不會多次處理同一個請求。

總而言之,分布式的挑戰(zhàn)來自不確定性,不確定計算機什么時候crash、斷電,不確定磁盤什么時候損壞,不確定每次網(wǎng)絡(luò)通信要延遲多久,也不確定通信對端是否處理了發(fā)送的消息。而分布式的規(guī)模放大了這個不確定性,不確定性是令人討厭的,所以有諸多的分布式理論、協(xié)議來保證在這種不確定性的情況下,系統(tǒng)還能繼續(xù)正常工作。

而且,很多在實際系統(tǒng)中出現(xiàn)的問題,來源于設(shè)計時的盲目樂觀,覺得這個、那個應(yīng)該不會出問題。
Fallacies_of_distributed_computing很有意思,介紹了分布式系統(tǒng)新手可能的錯誤的假設(shè):

The network is reliable.
Latency is zero.
Bandwidth is infinite.
The network is secure.
Topology doesn't change.
There is one administrator.
Transport cost is zero.
The network is homogeneous.

劉杰在《分布式系統(tǒng)原理介紹》中指出,處理這些異常的最佳原則是:在設(shè)計、推導(dǎo)、驗證分布式系統(tǒng)的協(xié)議、流程時,最重要的工作之一就是思考在執(zhí)行流程的每個步驟時一旦發(fā)生各種異常的情況下系統(tǒng)的處理方式及造成的影響。

分布式系統(tǒng)特性與衡量標(biāo)準(zhǔn)

透明性:使用分布式系統(tǒng)的用戶并不關(guān)心系統(tǒng)是怎么實現(xiàn)的,也不關(guān)心讀到的數(shù)據(jù)來自哪個節(jié)點,對用戶而言,分布式系統(tǒng)的最高境界是用戶根本感知不到這是一個分布式系統(tǒng),在《Distributed Systems Principles and Paradigms》一書中,作者是這么說的:

A distributed system is a collection of independent computers that appears to its users as a single coherent system.

可擴(kuò)展性:分布式系統(tǒng)的根本目標(biāo)就是為了處理單個計算機無法處理的任務(wù),當(dāng)任務(wù)增加的時候,分布式系統(tǒng)的處理能力需要隨之增加。簡單來說,要比較方便的通過增加機器來應(yīng)對數(shù)據(jù)量的增長,同時,當(dāng)任務(wù)規(guī)模縮減的時候,可以撤掉一些多余的機器,達(dá)到動態(tài)伸縮的效果

可用性與可靠性:一般來說,分布式系統(tǒng)是需要長時間甚至7*24小時提供服務(wù)的??捎眯允侵赶到y(tǒng)在各種情況對外提供服務(wù)的能力,簡單來說,可以通過不可用時間與正常服務(wù)時間的必知來衡量;而可靠性而是指計算結(jié)果正確、存儲的數(shù)據(jù)不丟失。

高性能:不管是單機還是分布式系統(tǒng),大家都非常關(guān)注性能。不同的系統(tǒng)對性能的衡量指標(biāo)是不同的,最常見的:高并發(fā),單位時間內(nèi)處理的任務(wù)越多越好;低延遲:每個任務(wù)的平均時間越少越好。這個其實跟操作系統(tǒng)CPU的調(diào)度策略很像

一致性:分布式系統(tǒng)為了提高可用性可靠性,一般會引入冗余(復(fù)制集)。那么如何保證這些節(jié)點上的狀態(tài)一致,這就是分布式系統(tǒng)不得不面對的一致性問題。一致性有很多等級,一致性越強,對用戶越友好,但會制約系統(tǒng)的可用性;一致性等級越低,用戶就需要兼容數(shù)據(jù)不一致的情況,但系統(tǒng)的可用性、并發(fā)性很高很多。

組件、理論、協(xié)議

假設(shè)這是一個對外提供服務(wù)的大型分布式系統(tǒng),用戶連接到系統(tǒng),做一些操作,產(chǎn)生一些需要存儲的數(shù)據(jù),那么在這個過程中,會遇到哪些組件、理論與協(xié)議呢

用一個請求串起來

用戶使用Web、APP、SDK,通過HTTP、TCP連接到系統(tǒng)。在分布式系統(tǒng)中,為了高并發(fā)、高可用,一般都是多個節(jié)點提供相同的服務(wù)。那么,第一個問題就是具體選擇哪個節(jié)點來提供服務(wù),這個就是負(fù)載均衡(load balance)。負(fù)載均衡的思想很簡單,但使用非常廣泛,在分布式系統(tǒng)、大型網(wǎng)站的方方面面都有使用,或者說,只要涉及到多個節(jié)點提供同質(zhì)的服務(wù),就需要負(fù)載均衡。

通過負(fù)載均衡找到一個節(jié)點,接下來就是真正處理用戶的請求,請求有可能簡單,也有可能很復(fù)雜。簡單的請求,比如讀取數(shù)據(jù),那么很可能是有緩存的,即分布式緩存,如果緩存沒有命中,那么需要去數(shù)據(jù)庫拉取數(shù)據(jù)。對于復(fù)雜的請求,可能會調(diào)用到系統(tǒng)中其他的服務(wù)。

承上,假設(shè)服務(wù)A需要調(diào)用服務(wù)B的服務(wù),首先兩個節(jié)點需要通信,網(wǎng)絡(luò)通信都是建立在TCP/IP協(xié)議的基礎(chǔ)上,但是,每個應(yīng)用都手寫socket是一件冗雜、低效的事情,因此需要應(yīng)用層的封裝,因此有了HTTP、FTP等各種應(yīng)用層協(xié)議。當(dāng)系統(tǒng)愈加復(fù)雜,提供大量的http接口也是一件困難的事情。因此,有了更進(jìn)一步的抽象,那就是RPC(remote produce call),是的遠(yuǎn)程調(diào)用就跟本地過程調(diào)用一樣方便,屏蔽了網(wǎng)絡(luò)通信等諸多細(xì)節(jié),增加新的接口也更加方便。

一個請求可能包含諸多操作,即在服務(wù)A上做一些操作,然后在服務(wù)B上做另一些操作。比如簡化版的網(wǎng)絡(luò)購物,在訂單服務(wù)上發(fā)貨,在賬戶服務(wù)上扣款。這兩個操作需要保證原子性,要么都成功,要么都不操作。這就涉及到分布式事務(wù)的問題,分布式事務(wù)是從應(yīng)用層面保證一致性:某種守恒關(guān)系。

上面說道一個請求包含多個操作,其實就是涉及到多個服務(wù),分布式系統(tǒng)中有大量的服務(wù),每個服務(wù)又是多個節(jié)點組成。那么一個服務(wù)怎么找到另一個服務(wù)(的某個節(jié)點呢)?通信是需要地址的,怎么獲取這個地址,最簡單的辦法就是配置文件寫死,或者寫入到數(shù)據(jù)庫,但這些方法在節(jié)點數(shù)據(jù)巨大、節(jié)點動態(tài)增刪的時候都不大方便,這個時候就需要服務(wù)注冊與發(fā)現(xiàn):提供服務(wù)的節(jié)點向一個協(xié)調(diào)中心注冊自己的地址,使用服務(wù)的節(jié)點去協(xié)調(diào)中心拉取地址。

從上可以看見,協(xié)調(diào)中心提供了中心化的服務(wù):以一組節(jié)點提供類似單點的服務(wù),使用非常廣泛,比如命令服務(wù)、分布式鎖。協(xié)調(diào)中心最出名的就是chubby,zookeeper。

回到用戶請求這個點,請求操作會產(chǎn)生一些數(shù)據(jù)、日志,通常為信息,其他一些系統(tǒng)可能會對這些消息感興趣,比如個性化推薦、監(jiān)控等,這里就抽象出了兩個概念,消息的生產(chǎn)者與消費者。那么生產(chǎn)者怎么講消息發(fā)送給消費者呢,RPC并不是一個很好的選擇,因為RPC肯定得指定消息發(fā)給誰,但實際的情況是生產(chǎn)者并不清楚、也不關(guān)心誰會消費這個消息,這個時候消息隊列就出馬了。簡單來說,生產(chǎn)者只用往消息隊列里面發(fā)就行了,隊列會將消息按主題(topic)分發(fā)給關(guān)注這個主題的消費者。消息隊列起到了異步處理、應(yīng)用解耦的作用。

上面提到,用戶操作會產(chǎn)生一些數(shù)據(jù),這些數(shù)據(jù)忠實記錄了用戶的操作習(xí)慣、喜好,是各行各業(yè)最寶貴的財富。比如各種推薦、廣告投放、自動識別。這就催生了分布式計算平臺,比如Hadoop,Storm等,用來處理這些海量的數(shù)據(jù)。

最后,用戶的操作完成之后,用戶的數(shù)據(jù)需要持久化,但數(shù)據(jù)量很大,大到按個節(jié)點無法存儲,那么這個時候就需要分布式存儲:將數(shù)據(jù)進(jìn)行劃分放在不同的節(jié)點上,同時,為了防止數(shù)據(jù)的丟失,每一份數(shù)據(jù)會保存多分。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫是單點存儲,為了在應(yīng)用層透明的情況下分庫分表,會引用額外的代理層。而對于NoSql,一般天然支持分布式。

一個簡化的架構(gòu)圖

下面用一個不大精確的架構(gòu)圖,盡量還原分布式系統(tǒng)的組成部分(不過只能體現(xiàn)出技術(shù),不好體現(xiàn)出理論)


概念與實現(xiàn)

那么對于上面的各種技術(shù)與理論,業(yè)界有哪些實現(xiàn)呢,下面進(jìn)行簡單羅列。

當(dāng)然,下面的這些實現(xiàn),小部分我用過,知其所以然;大部分聽說過,知其然;還有一部分之前聞所未聞,分類也不一定正確,只是從其他文章抄過來的。羅列在這里,以便日后或深或淺的學(xué)習(xí)。

  • 負(fù)載均衡:

Nginx:高性能、高并發(fā)的web服務(wù)器;功能包括負(fù)載均衡、反向代理、靜態(tài)內(nèi)容緩存、訪問控制;工作在應(yīng)用層

LVS: Linux virtual server,基于集群技術(shù)和Linux操作系統(tǒng)實現(xiàn)一個高性能、高可用的服務(wù)器;工作在網(wǎng)絡(luò)層

  • webserver:

Java:Tomcat,Apache,Jboss

Python:gunicorn、uwsgi、twisted、webpy、tornado

  • service:

SOA、微服務(wù)、spring boot,django

  • 容器:

docker,kubernetes

  • cache:

memcache、redis等

  • 協(xié)調(diào)中心:

zookeeper、etcd等

zookeeper使用了Paxos協(xié)議Paxos是強一致性,高可用的去中心化分布式。zookeeper的使用場景非常廣泛,之后細(xì)講。

  • rpc框架:

grpc、dubbo、brpc

dubbo是阿里開源的Java語言開發(fā)的高性能RPC框架,在阿里系的諸多架構(gòu)中,都使用了dubbo + spring boot

  • 消息隊列:

kafka、rabbitMQ、rocketMQ、QSP

消息隊列的應(yīng)用場景:異步處理、應(yīng)用解耦、流量削鋒和消息通訊

  • 實時數(shù)據(jù)平臺:

storm、akka

  • 離線數(shù)據(jù)平臺:

hadoop、spark

PS: apark、akka、kafka都是scala語言寫的,看到這個語言還是很牛逼的

  • dbproxy:

cobar也是阿里開源的,在阿里系中使用也非常廣泛,是關(guān)系型數(shù)據(jù)庫的sharding + replica 代理

  • db:

mysql、oracle、MongoDB、HBase

  • 搜索:

elasticsearch、solr

  • 日志:

rsyslog、elk、flume

總結(jié)

寫這篇文章,我曾在網(wǎng)絡(luò)上搜索過“如何學(xué)習(xí)分布式系統(tǒng)”,但實話說,沒有很認(rèn)同的答案。也許,這確實是一個難以回答的問題。于是,我想自己寫出一個答案,但寫完這篇文章,感覺自己的回答也很混亂,也沒有說清楚,不過對我自己還是有一些指導(dǎo)意義的,比如,理清了分布式系統(tǒng)中會遇到的各種技術(shù)、理論、協(xié)議,以及通過一個例子展示他們是如何協(xié)作的,接下來就是各個擊破了。

網(wǎng)上的諸多回答,上來就是看各種論文,google三大件、paxos什么的,個人覺得不是很實用。更好的過程,是先有一個整體的把握,然后自己思考會有什么問題,帶著問題去尋求答案,在尋求答案的時候再去看論文。

另外,也有很多人提到,掌握好計算機基礎(chǔ)知識,如操作系統(tǒng)、計算機網(wǎng)絡(luò),對學(xué)習(xí)分布式系統(tǒng)是大有裨益的,這一點我很贊同。分布式系統(tǒng)解決問題的思路是早就有的,很多都是前人研究透的問題,思想都是相同的。比如函數(shù)式編程中的map reduce之于Hadoop的MapReduce,比如磁盤存儲的raid之于Partition與Replication,比如IPC之于消息隊列。


「主流技術(shù)」分布式詳解:什么是分布式系統(tǒng)?如何學(xué)習(xí)分布式系統(tǒng)?的評論 (共 條)

分享到微博請遵守國家法律
平利县| 嵊州市| 朔州市| 安达市| 庆云县| 遂川县| 巴彦县| 教育| 临城县| 南宁市| 霞浦县| 乌海市| 安达市| 珠海市| 绥棱县| 琼海市| 开化县| 瓦房店市| 漳平市| 塘沽区| 漾濞| 通海县| 宿州市| 大埔区| 罗山县| 尉犁县| 商水县| 融水| 鹿邑县| 郁南县| 田林县| 涿鹿县| 策勒县| 莱州市| 富源县| 平泉县| 遵义县| 迁安市| 来宾市| 盐池县| 额尔古纳市|