中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
終于有一本可以讓初學(xué)者全面了解分布式系統(tǒng)設(shè)計的書啦

今天,對于在IT行業(yè)從事技術(shù)工作的人,無論是工程師、架構(gòu)師還是管理者,也無論從事的工作是否與分布式相關(guān),都應(yīng)該了解分布式技術(shù),因為總有一天,你會遇到它、接觸它、使用它、理解它、完善它。

然而,分布式技術(shù)涉及的方面(存儲、計算、框架、中間件等)是如此之多,且迄今為止尚未見到一本書對其進(jìn)行概括和梳理,要想對分布式技術(shù)有全面的了解,特別是對初學(xué)者而言,何其難哉!

如今初學(xué)者再不用學(xué)習(xí)分布式技術(shù)而發(fā)愁了,剛好有這樣一本適用初學(xué)者的《分布式系統(tǒng)設(shè)計實踐》出版,作者李慶旭 。

本書試圖對近年來涌現(xiàn)出的各種主流分布式技術(shù)做一個簡要介紹,以使不太熟悉這個領(lǐng)域的讀者能了解其概貌、原理和根源。

本書共分為以下6部分。

第一部分對典型的分布式系統(tǒng)的組成及其中每個組件的功能進(jìn)行簡要介紹,以使讀者對分布式系統(tǒng)有一個總體了解。第二部分介紹分布式系統(tǒng)的前端經(jīng)常使用的Web框架、反向代理及負(fù)載均衡技術(shù)。

第三部分對分布式系統(tǒng)中經(jīng)常使用的各種中間件技術(shù)逐一進(jìn)行介紹,包括分布式同步服務(wù)中間件、關(guān)系型數(shù)據(jù)庫訪問中間件、分布式服務(wù)調(diào)用中間件、分布式消息服務(wù)中間件和分布式跟蹤服務(wù)中間件。

第四部分介紹分布式文件系統(tǒng)、各種NoSQL數(shù)據(jù)庫技術(shù)(基于鍵值對的NoSQL技術(shù)、基于列的NoSQL技術(shù)、基于文檔的NoSQL技術(shù)、基于圖的NoSQL技術(shù))和NewSQL數(shù)據(jù)庫系統(tǒng)。

第五部分對業(yè)界在構(gòu)建大型分布式系統(tǒng)的過程中的主要經(jīng)驗加以總結(jié),使后來者避免重蹈覆轍。

第六部分介紹業(yè)界幾個知名的大型分布式系統(tǒng)的主要設(shè)計思想和架構(gòu),包括谷歌搜索系統(tǒng)、淘寶網(wǎng)、阿里云和領(lǐng)英的社交應(yīng)用。此外,還會探討和思考分布式系統(tǒng)實現(xiàn)中的一些問題。

主體目錄

  • 第一部分 分布式系統(tǒng)概述 免費

  • 第1章 分布式系統(tǒng)概述 免費

  • 第二部分 分布式系統(tǒng)的前端構(gòu)造技術(shù) 免費

  • 第2章 Web框架的實現(xiàn)原理

  • 第3章 反向代理與負(fù)載均衡

  • 第三部分 分布式中間件

  • 第4章 分布式同步服務(wù)中間件

  • 第5章 關(guān)系型數(shù)據(jù)庫訪問中間件

  • 第6章 分布式服務(wù)調(diào)用中間件

  • 第7章 分布式消息服務(wù)中間件

  • 第8章 分布式跟蹤服務(wù)中間件

  • 第四部分 分布式存儲技術(shù)

  • 第9章 分布式文件系統(tǒng)

  • 第10章 基于鍵值對的NoSQL數(shù)據(jù)庫

  • 第11章 基于列的NoSQL數(shù)據(jù)庫

  • 第12章 基于文檔的NoSQL數(shù)據(jù)庫

  • 第13章 其他NoSQL數(shù)據(jù)庫

  • 第14章 NewSQL數(shù)據(jù)庫

  • 第五部分 分布式系統(tǒng)的構(gòu)建思想

  • 第15章 云化

  • 第16章 分布式系統(tǒng)的構(gòu)建思想

  • 第六部分 大型分布式系統(tǒng)案例研究及分析

  • 第17章 大型分布式系統(tǒng)案例研究

  • 第18章 關(guān)于分布式系統(tǒng)設(shè)計的思考

適合讀者群

本書適合業(yè)界的架構(gòu)師、工程師、項目經(jīng)理,以及大中專院校的高年級本科生和研究生使用和參考。

樣章試讀:

第1章  分布式系統(tǒng)概述

1999年8月6日,CNN報道了一起eBay網(wǎng)站的事故:從7:30開始,整個網(wǎng)站崩潰,一直持續(xù)了9個多小時。下午5:30后,技術(shù)人員開始進(jìn)行系統(tǒng)恢復(fù),但搜索功能依然不能使用。

2011年4月21日至22日,亞馬遜EC2(Elastic Computer Cloud)服務(wù)出現(xiàn)大面積事故,導(dǎo)致數(shù)以千計的初創(chuàng)公司受到影響,而且造成大約11小時的歷史數(shù)據(jù)永久性丟失。

2013年4月27日,《大掌門》游戲的開發(fā)商玩蟹科技CEO葉凱在微博上吐槽,“我們在阿里云上用了20多臺機器。半年時間,出現(xiàn)過1次所有機器全部斷電,2次多個硬盤突然只讀,3次硬盤I/O突然變滿……”。

2013年12月28日,春運第一天,鐵道部首次推出了網(wǎng)上訂票系統(tǒng),但很快就出現(xiàn)許多用戶無法訪問、響應(yīng)緩慢甚至串號等事故。

2017年9月17日,谷歌的網(wǎng)盤服務(wù)Drive出現(xiàn)故障,成千上萬用戶受到影響。

上面的這幾起事故,當(dāng)時都鬧得沸沸揚揚,不僅給受影響的用戶帶來了很大的損失,也極大地影響了廠商的形象。事實上,幾乎每一家互聯(lián)網(wǎng)公司的后臺系統(tǒng)都曾經(jīng)不止一次地經(jīng)歷過這樣或那樣的尷尬時刻??梢赃@樣說,幾乎每一家互聯(lián)網(wǎng)公司的后臺架構(gòu)都是在發(fā)現(xiàn)問題、解決問題的循環(huán)中發(fā)展起來的。

即便是執(zhí)分布式系統(tǒng)技術(shù)牛耳的谷歌,在2017年9月,也出現(xiàn)過分布式系統(tǒng)的故障。可見,開發(fā)并維護(hù)一個成功的分布式系統(tǒng)是多么不易!

最早得到廣泛應(yīng)用的分布式系統(tǒng)是誕生于20世紀(jì)70年代的以太網(wǎng)。盡管分布式系統(tǒng)存在的歷史已經(jīng)有近半個世紀(jì),然而其大規(guī)模的發(fā)展和應(yīng)用則是2000年以后的事情。

21世紀(jì)以來,隨著雅虎、谷歌、亞馬遜、eBay、Facebook、Twitter等眾多互聯(lián)網(wǎng)公司的崛起,其用戶量以及要處理的數(shù)據(jù)量迅速增長,遠(yuǎn)遠(yuǎn)超過了傳統(tǒng)的計算機系統(tǒng)能夠處理的范圍,因此,以谷歌為代表的互聯(lián)網(wǎng)公司提出了許多新技術(shù)(如HDFS、Bigtable、MapReduce等)。以BAT為代表的中國互聯(lián)網(wǎng)公司,也在21世紀(jì)整體崛起,在初期借鑒美國公司技術(shù)的基礎(chǔ)上,他們也自行開發(fā)了許多新的技術(shù)(如淘寶的管理海量小文件的分布式存儲系統(tǒng)TFS、阿里巴巴開源的分布式調(diào)用框架Dubbo、阿里巴巴開源的數(shù)據(jù)庫中間件Cobar等)。

為了解決分布式系統(tǒng)中的各種各樣的問題,各大互聯(lián)網(wǎng)公司開發(fā)了各種各樣的技術(shù),當(dāng)然,這也促進(jìn)了當(dāng)今分布式系統(tǒng)技術(shù)領(lǐng)域的飛速發(fā)展。為了存儲大量的網(wǎng)站索引,谷歌設(shè)計了GFS分布式文件存儲系統(tǒng)和基于列存儲的Bigtable NoSQL數(shù)據(jù)庫系統(tǒng);為了計算PageRank算法中的頁面rank值,谷歌又設(shè)計了MapReduce分布式計算系統(tǒng);為了方便其分布式系統(tǒng)中不同主機間的協(xié)調(diào),谷歌還設(shè)計了Chubby分布式鎖系統(tǒng);為了解決不同語言實現(xiàn)的組件間的通信問題,F(xiàn)acebook設(shè)計了Thrift;為了解決大量消息的快速傳遞問題,領(lǐng)英設(shè)計了Kafka……這個列表可以很長很長。

為了“壓榨”分布式系統(tǒng)中每個組件的性能,人們已經(jīng)不再僅僅滿足于在程序庫(如網(wǎng)絡(luò)編程庫Netty、內(nèi)存管理庫TCMalloc等)、程序框架(如Spring)等“略顯淺薄”的地方提高,而是已經(jīng)滲透到了硬件(如谷歌為其計算中心專門設(shè)計了計算機)、網(wǎng)絡(luò)(如SDN)、操作系統(tǒng)(如各大互聯(lián)網(wǎng)公司定制的Linux內(nèi)核)、語言(如谷歌設(shè)計的Go語言)、數(shù)據(jù)庫系統(tǒng)(如各種NoSQL系統(tǒng))、算法(如人工智能領(lǐng)域的突飛猛進(jìn))等各種計算機基礎(chǔ)領(lǐng)域。

毫無疑問,我們處于計算機技術(shù)發(fā)展最為迅猛的時代。在這個如火如荼的時代里,許多塵封多年的計算機技術(shù)(如人工智能、分布式系統(tǒng)、移動計算、虛擬計算等),一改往日不溫不火的模樣,在互聯(lián)網(wǎng)這片廣袤的土地上如日中天,發(fā)展迅速。

今天的計算機領(lǐng)域,已經(jīng)與20年前大為不同。20年前,只需要對操作系統(tǒng)、數(shù)據(jù)庫、網(wǎng)絡(luò)、編譯等領(lǐng)域有深刻的理解,再熟練掌握幾門計算機語言,了解一些常見的軟件架構(gòu)(客戶服務(wù)器架構(gòu)、管道架構(gòu)、分層架構(gòu)等)和軟件工程(主要是瀑布模型)的知識,基本上就能勝任大多數(shù)軟件開發(fā)工作了。而今天,僅了解這些基礎(chǔ)知識已經(jīng)遠(yuǎn)遠(yuǎn)不夠,因為在近20年內(nèi),人類創(chuàng)造了太多的新技術(shù),而這些新技術(shù)又大都起源并服務(wù)于分布式計算領(lǐng)域。

1.1 分布式系統(tǒng)的組成

一個大型的分布式系統(tǒng)雖然非常復(fù)雜,但其設(shè)計目標(biāo)卻往往是非常簡單的,例如,京東和淘寶這樣的電商,其設(shè)計目標(biāo)是賣東西;谷歌和百度這樣的搜索引擎,其設(shè)計目標(biāo)是幫助大家在網(wǎng)上找相關(guān)的內(nèi)容;Facebook和微信這樣的社交應(yīng)用,其設(shè)計目標(biāo)是方便大家相互聯(lián)系并分享自己生活中的點點滴滴。

如前文所述,之所以需要有分布式系統(tǒng),最根本的原因還是單機的計算和存儲能力不能滿足系統(tǒng)的需要。但要把成百上千臺計算機組織成一個有機的系統(tǒng),絕非易事。在人類社會中,其實也一樣,找到1000個人容易,但要把這1000個人組織成一只能戰(zhàn)斗的軍隊可就沒那么簡單了。

一個典型的分布式系統(tǒng)如圖1-1所示。

  • 分布式系統(tǒng)大都有一個Web前端,用戶可以通過瀏覽器隨時隨地訪問,當(dāng)然,前端也可以是運行在Windows/Linux上的桌面程序或者運行在手機上的應(yīng)用。

  • 分布式系統(tǒng)還要有后端支撐。分布式系統(tǒng)的后端大都是基于Linux的集群[1]。之所以采用Linux,一是因為開源操作系統(tǒng)成本低,二是因為開源軟件可以定制。

  • 就像人類社會需要有一定的組織和管理一樣,為了組成一個集群,在單機的操作系統(tǒng)之上,還需要集群管理系統(tǒng)。在集群管理系統(tǒng)中,一個非常重要的組件是分布式協(xié)調(diào)組件,用來協(xié)調(diào)不同機器之間的工作。這些協(xié)調(diào)系統(tǒng)大都基于一些著名的分布式一致性協(xié)議(如Paxos、Raft等)。有些超大型的后端還擁有專門的集群操作系統(tǒng),這些系統(tǒng)不僅有分布式協(xié)調(diào)功能,還有資源的分配與管理功能。

  • 為了滿足大規(guī)模數(shù)據(jù)的存儲需要[2],需要有能夠存儲海量數(shù)據(jù)的后端存儲系統(tǒng)。

  • 為了滿足大規(guī)模數(shù)據(jù)的計算需要[3],還需要有能夠分析海量數(shù)據(jù)的后端計算系統(tǒng)。

圖1-1 一個典型的分布式系統(tǒng)

  • 在分布式系統(tǒng)中,有很多共性的功能,例如能夠支持分庫分表的數(shù)據(jù)庫訪問中間件、用來異步化的消息中間件、用來開發(fā)不同組件的分布式系統(tǒng)調(diào)用中間件、用來監(jiān)控各個組件狀態(tài)的分布式跟蹤中間件等。事實上,前面所列舉的每一種中間件,也都是一個復(fù)雜的分布式系統(tǒng)。

本章下面的內(nèi)容先就后端最重要的分布式協(xié)調(diào)組件、后端存儲系統(tǒng)和后端計算系統(tǒng)做一個概要的介紹。

1.2 分布式協(xié)調(diào)組件

分布式系統(tǒng)之所以存在,最根本的原因是數(shù)據(jù)量或計算量超過了單機的處理能力,因此不得不求助于水平擴展[4],而為了協(xié)調(diào)多個節(jié)點的動作,則不得不引入分布式協(xié)調(diào)組件。

在單機操作系統(tǒng)中,幾個相互合作的進(jìn)程(如生產(chǎn)者/消費者模型中的生產(chǎn)者進(jìn)程和消費者進(jìn)程),如果需要進(jìn)行協(xié)調(diào),就得借助于一些進(jìn)程間通信機制,如共享內(nèi)存、信號量、事件等。分布式協(xié)調(diào)組件提供的功能,本質(zhì)上就是分布式環(huán)境中的進(jìn)程間通信機制。

也許,有人會覺得這有何難,用一個數(shù)據(jù)庫不就解決了嗎?如代碼清單1-1所示,將分布式鎖信息保存在一張數(shù)據(jù)庫表中(假如表名叫LOCK_TABLE),增加一個鎖就是向LOCK_TABLE表中添加一新行(假如該行ID為MYCLOCK1),要獲得該鎖,只需要將MYCLOCK1行的某個字段(如LOCK_STATUS)置為1;要釋放該鎖,只需要將此字段置為0。利用數(shù)據(jù)庫本身的事務(wù)支持,這個問題不就解決了嗎?

代碼清單1-1 利用數(shù)據(jù)庫實現(xiàn)分布式鎖

1. ' 獲得鎖2. START TRANSACTION;3. UPDATE LOCK_TABLE4. SET LOCK_STATUS = 1, LOCK_OWNER='process1'5. WHERE ID='MYCLOCK1' AND LOCK_STATUS=0;6. COMMIT;7. 調(diào)用者檢查LOCK_OWNER字段是否為'process1',即可獲知是否加鎖成功8. ' 釋放鎖9. START TRANSACTION;10. UPDATE LOCK_TABLE11. SET LOCK_STATUS = 0, LOCK_OWNER=''12. WHERE ID='MYCLOCK1' AND LOCK_STATUS=1 AND LOCK_OWNER='process1';13. COMMIT;

然而,事情遠(yuǎn)沒有那么簡單。在分布式環(huán)境中,節(jié)點/網(wǎng)絡(luò)故障為常態(tài),如果采用代碼清單1-1所示的方案,假如數(shù)據(jù)庫所在的節(jié)點宕機了,整個系統(tǒng)就會陷入混亂。因此,這種有單點故障的方案肯定是不可取的。

分布式協(xié)調(diào)組件對外提供的是一種分布式同步服務(wù)。為了獲得健壯性,一個協(xié)調(diào)組件內(nèi)部也是由多個節(jié)點組成的,節(jié)點[5]之間通過一些分布式一致性協(xié)議(如Paxos、Raft)來協(xié)調(diào)彼此的狀態(tài)。如果一個節(jié)點崩潰了,其他節(jié)點就自動接管過來,繼續(xù)對外提供服務(wù),好像什么都沒有發(fā)生過一樣。

另外,為了應(yīng)用程序的方便,分布式協(xié)調(diào)組件經(jīng)常還會允許在其上存放少量的信息(如主服務(wù)器的名稱),這些信息也是由分布式一致性協(xié)議來維護(hù)其一致性的。

1.3 分布式存儲系統(tǒng)

與單機系統(tǒng)類似,分布式系統(tǒng)的存儲也分為兩個層次:第一個層次是文件級的,即分布式文件系統(tǒng),如GFS(Google File System)、HDFS(Hadoop Distributed File System)、TFS(Taobao File System)等;第二個層次是在文件系統(tǒng)之上的進(jìn)一步抽象,即數(shù)據(jù)庫系統(tǒng)。不過,分布式系統(tǒng)下的數(shù)據(jù)庫遠(yuǎn)比單機的關(guān)系型數(shù)據(jù)庫復(fù)雜,因為數(shù)據(jù)被存儲在多個節(jié)點上,如何保證其一致性就成了關(guān)鍵,所以,分布式系統(tǒng)下的數(shù)據(jù)庫采用的大都是最終一致性[6],而非滿足ACID[7]屬性的強一致性。

由于對一致性支持的不同,傳統(tǒng)的ACID理論就不再適用了,于是,Eric Brewer提出了一種新的CAP[8]理論。CAP理論聽起來高大上,但實際上并沒有那么復(fù)雜。它的意思是,在分布式系統(tǒng)里,沒有辦法同時達(dá)到一致性、可用性和網(wǎng)絡(luò)分區(qū)可容忍性,只能在三者中擇其二。

不過,要注意CAP中的C和A與ACID中的C和A的含義是不同的(如表1-1所示),網(wǎng)絡(luò)分區(qū)可容忍性的含義較為晦澀,是指一個分布式系統(tǒng)中是否允許出現(xiàn)多個網(wǎng)絡(luò)分區(qū)。換言之,如果網(wǎng)絡(luò)斷了,一個系統(tǒng)中的多個節(jié)點被分成了多個孤島,這允許嗎?如果允許,就滿足網(wǎng)絡(luò)分區(qū)可容忍性,否則就不滿足。

表1-1 CAP與ACID中的C和A的不同

對于CAP理論,其實很好理解。我們可以想一想,如果需要滿足網(wǎng)絡(luò)分區(qū)可容忍性,即允許孤島的存在,那么當(dāng)孤島產(chǎn)生時,只能要么繼續(xù)提供服務(wù)(即滿足可用性),要么停止服務(wù)(即滿足一致性),其他的情況也類似。然而,在分布式系統(tǒng)中,由于孤島的不可避免性,因此實際的系統(tǒng)只能在一致性和可用性中選擇其一,即只能是滿足一致性和網(wǎng)絡(luò)分區(qū)可容忍性或者滿足可用性和網(wǎng)絡(luò)分區(qū)可容忍性的系統(tǒng)。

采用最終一致性的數(shù)據(jù)庫系統(tǒng),統(tǒng)稱為NoSQL(Not only SQL)系統(tǒng)。根據(jù)數(shù)據(jù)模型的不同,NoSQL系統(tǒng)又分為以下幾大類:

  • 基于鍵值對的(如Memcached、Redis等);

  • 基于列存儲的(如谷歌的Bigtable、Apache HBase、Apache Cassandra等);

  • 基于文檔的(如MongoDB、CouchDB等);

  • 基于圖的(如Neo4j、OrientDB等)。

近幾年,還涌現(xiàn)出一類稱為NewSQL的系統(tǒng)(如谷歌的Megastore、谷歌的Spanner、阿里巴巴的OceanBase和PingCAP TiDB),號稱既滿足關(guān)系型數(shù)據(jù)庫的ACID屬性,又可以如NoSQL系統(tǒng)那般水平伸縮。然而,這些系統(tǒng)本質(zhì)上還是滿足最終一致性的NoSQL系統(tǒng),只不過,它們將可用性和一致性處理得非常好,在外界看來,似乎同時滿足了可用性和一致性,實則只是在實現(xiàn)上做了“手腳”,將不一致性“隱藏”起來,并將其“默默”地消化掉。

例如,谷歌Megastore將同一數(shù)據(jù)的不同分區(qū)存放在不同的數(shù)據(jù)中心中,在每個數(shù)據(jù)中心內(nèi)部,屬于同一個分區(qū)的數(shù)據(jù)存放在同一個Bigtable中。借助于Bigtable對單行數(shù)據(jù)讀寫的事務(wù)支持,Megastore支持同一個分區(qū)內(nèi)的ACID屬性,但對于跨分區(qū)(即跨數(shù)據(jù)中心)的事務(wù),則通過兩階段提交實現(xiàn),因此,也是最終一致的。

再如阿里巴巴的OceanBase,它將數(shù)據(jù)分為兩部分,一部分是較早的數(shù)據(jù)(稱為基準(zhǔn)數(shù)據(jù)),另一部分是最新的數(shù)據(jù)(稱為增量數(shù)據(jù)),基準(zhǔn)數(shù)據(jù)與增量數(shù)據(jù)分開存儲,讀寫請求都由一個專門的合并服務(wù)器(Merge Server)來處理。合并服務(wù)器解析用戶的SQL請求,然后生成相應(yīng)的命令發(fā)給存儲基準(zhǔn)數(shù)據(jù)和增量數(shù)據(jù)的服務(wù)器,再合并它們返回的結(jié)果;此外,后臺還定期將增量數(shù)據(jù)合并到基準(zhǔn)數(shù)據(jù)中[9]。OceanBase定期將更新服務(wù)器(Update Server)上的增量數(shù)據(jù)合并到各個數(shù)據(jù)塊服務(wù)器(Chunk Server)中。因此,OceanBase也是最終一致的,但通過合并服務(wù)器把暫時的不一致隱藏起來了。

因此,本質(zhì)上,只有兩種數(shù)據(jù)庫系統(tǒng),即滿足ACID屬性的RDBMS和滿足最終一致性的NoSQL系統(tǒng)。所謂的NewSQL,只不過是披著SQL系統(tǒng)外衣(即SQL支持和ACID屬性)的NoSQL系統(tǒng)而已。

1.4 分布式計算系統(tǒng)

分布式存儲系統(tǒng)只解決了大數(shù)據(jù)的存儲問題,并沒有解決大數(shù)據(jù)的計算問題。當(dāng)計算量遠(yuǎn)遠(yuǎn)超過了單機的處理能力后,該怎么辦呢?一種方式是各自開發(fā)專屬的分布式計算框架,但這些計算框架很難做到通用和共享。因此,在不同公司或同一公司的不同團隊中,存在著各種各樣的分布式計算框架,造成了很大的浪費,而且框架的質(zhì)量也良莠不齊。

1.4.1 批處理分布式計算系統(tǒng)

谷歌公司于2004年發(fā)表的MapReduce論文幾近完美地解決了這個問題。MapReduce通過下面兩個看似簡單卻包含了深刻智慧的函數(shù),輕而易舉地解決了一大類大數(shù)據(jù)計算問題。

map (<K1, V1>) → list(<K2, V2>)[10]

reduce (<K2, list(V2)>) → list(V3)[11]

如圖1-2所示,使用MapReduce解決問題的步驟如下。

(1)需要將輸入表示成一系列的鍵值對<K1, V1>。

(2)定義一個map函數(shù),其輸入是上一步的一個鍵值對<K1, V1>,其輸出則是另一種鍵值對<K2, V2>的列表。

圖1-2 MapReduce工作原理

(3)運行時,MapReduce框架會對每一個輸入的鍵值對<K1, V1>調(diào)用map函數(shù)(執(zhí)行map函數(shù)的機器稱為Mapper),并生成一系列另一種鍵值對<K2, V2>。然后,MapReduce框架會根據(jù)K2進(jìn)行分區(qū)(partition),即根據(jù)K2的值,將<K2, V2>對在多個稱為Reducer(即執(zhí)行reduce函數(shù)的機器)的機器間進(jìn)行分發(fā)。

(4)還需要定義一個reduce函數(shù),該函數(shù)的輸入是一系列K2和與其對應(yīng)的V2值的列表,輸出是另一種值V3的列表。

(5)運行時,MapReduce框架會調(diào)用reduce函數(shù),由reduce函數(shù)來對同一個K2的V2的列表進(jìn)行聚合。

MapReduce本質(zhì)上是一種“分而治之”的策略,只不過數(shù)據(jù)規(guī)模很大而已。它首先把全部輸入分成多個部分,每部分啟動一個Mapper;然后,等所有Mapper都執(zhí)行完后,將Mapper的輸出根據(jù)K2做分區(qū),對每個分區(qū)啟動一個Reducer,由Reducer進(jìn)行聚合。

MapReduce看似簡單,卻能夠解決一大類問題。MapReduce能夠解決的問題具有下列特征。

  • 需要一次性處理大批的數(shù)據(jù),而且在處理前數(shù)據(jù)已經(jīng)就緒,即所謂的批處理系統(tǒng)。

  • 數(shù)據(jù)集能夠被拆分,而且可以獨立進(jìn)行計算,不同的數(shù)據(jù)集之間沒有依賴。例如,谷歌的PageRank算法的迭代實現(xiàn),每一次迭代時,可以把數(shù)據(jù)分為不同的分區(qū),不同分區(qū)之間沒有依賴,因此就可以利用MapReduce實現(xiàn)。但斐波那契數(shù)列的計算問題則不然,其后面值的計算必須要等前面的值計算出來后方可開始,因此就不能利用MapReduce實現(xiàn)。

  • 計算對實時性要求不高。這是因為MapReduce計算的過程非常耗時。

1.4.2 流處理分布式計算系統(tǒng)

對于那些不斷有新數(shù)據(jù)進(jìn)來,而且對實時性要求很高的計算(如實時的日志分析、實時的股票推薦系統(tǒng)等),MapReduce就不適用了。于是,流處理系統(tǒng)應(yīng)運而生。

根據(jù)對新數(shù)據(jù)的處理方式,流處理系統(tǒng)分為以下兩大類。

  • 微批處理(micro-batch processing)系統(tǒng):當(dāng)新數(shù)據(jù)到達(dá)時,并不立即進(jìn)行處理,而是等待一小段時間,然后將這一小段時間內(nèi)到達(dá)的數(shù)據(jù)成批處理。這類系統(tǒng)的例子有Apache Spark。

  • 真正的流處理(true stream processing)系統(tǒng):當(dāng)一條新數(shù)據(jù)到達(dá)后,立刻進(jìn)行處理。這類系統(tǒng)的例子有Apache Storm、Apache Samza和Kafka Streams(只是一個客戶端庫)。

1.4.3 混合系統(tǒng)

在分布式計算領(lǐng)域,還有一種混合了批處理和流處理的系統(tǒng),這類系統(tǒng)的一個例子是電商的智能推薦系統(tǒng),其既需要批處理的功能(為了確保響應(yīng)速度,預(yù)先將大量的計算通過批處理系統(tǒng)完成),也需要流處理的功能(根據(jù)用戶的最新行為,對推薦系統(tǒng)進(jìn)行實時調(diào)整)。

對于這類系統(tǒng),有一種很流行的架構(gòu),即Lamda架構(gòu)(如圖1-3所示),其思想是用一個批處理系統(tǒng)(如MapReduce)來進(jìn)行批處理計算,再用一個實時處理系統(tǒng)(如Apache Spark/Storm)來進(jìn)行實時計算,最后用一個合并系統(tǒng)將二者的計算結(jié)果結(jié)合起來并生成最終的結(jié)果。

圖1-3 Lamda架構(gòu)

對于混合系統(tǒng)的實現(xiàn),有篇非常有趣的文章值得一讀,“Questioning the Lambda Architecture”一文中提到了Lamda架構(gòu)的一個很大的缺點,即處理邏輯需要在批處理系統(tǒng)和流處理系統(tǒng)中實現(xiàn)兩遍。該文提到了一種新的混合系統(tǒng)實現(xiàn)方式,即利用Kafka可以保存歷史消息的特性,根據(jù)業(yè)務(wù)的需要,在Kafka中保存一定時間段內(nèi)的歷史數(shù)據(jù),當(dāng)需要進(jìn)行批處理時,則訪問Kafka中保存的歷史數(shù)據(jù),當(dāng)需要實時處理時,則消費Kafka中的最新消息。如此這般,處理邏輯就只需要實現(xiàn)一套了。感興趣的讀者,可以讀一讀此文。

1.5 分布式系統(tǒng)中節(jié)點之間的關(guān)系

一個人類社會的組織,要想實現(xiàn)其組織功能,組織內(nèi)的人需要按照某種方式被組織起來,例如,有的人負(fù)責(zé)管理,有的人負(fù)責(zé)執(zhí)行,等等。由許多節(jié)點組成的分布式系統(tǒng)也一樣,系統(tǒng)中的節(jié)點也需要被有機地組織起來,才能實現(xiàn)想要完成的功能。也就是說,有些節(jié)點需要承擔(dān)這樣的角色,而另一些節(jié)點則需要承擔(dān)另外的角色。根據(jù)所承擔(dān)角色的不同,節(jié)點之間的關(guān)系不外乎下面兩種。

  • 主從式(master-slave)關(guān)系:主節(jié)點集大權(quán)于一身,所有重要的信息都存儲在主節(jié)點上,所有重要的決定也都由主節(jié)點做出。這類系統(tǒng)的例子有谷歌的GFS和Bigtable等,以及受其架構(gòu)影響而開發(fā)的其他系統(tǒng)(如HDFS、HBase、淘寶TFS、京東JFS、百度BFS、百度Tera等)。

  • 對等式(peer-to-peer)關(guān)系:這類系統(tǒng)中的節(jié)點之間的關(guān)系是平等的,沒有中心節(jié)點,而是采用設(shè)置好的選舉與協(xié)調(diào)規(guī)則來處理節(jié)點之間的協(xié)調(diào)問題,這類系統(tǒng)的典型代表是亞馬遜的Dynamo,以及受其架構(gòu)影響而開發(fā)的其他系統(tǒng)(如Cassandra、Riak等)。

相對而言,主從式系統(tǒng)實現(xiàn)起來要簡單些,而對等式系統(tǒng)實現(xiàn)起來則困難些。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
分布式架構(gòu)--基本思想?yún)R總
NoSQL你知多少?
HBase vs Cassandra: 我們遷移系統(tǒng)的原因 ? 我有分寸
解讀NoSQL技術(shù)代表之作Dynamo
獨家|一文讀懂非關(guān)系型數(shù)據(jù)庫(NoSQL)
分布式系統(tǒng)架構(gòu)常識:CAP理論。
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服