數(shù)據(jù)密集型應(yīng)用系統(tǒng)設(shè)計(jì)
數(shù)據(jù)密集型應(yīng)用系統(tǒng)設(shè)計(jì)
鏈接:https://pan.baidu.com/s/1lSn8XJC80EEUd5QmfmQWiQ?pwd=66w2?
提取碼:66w2

前言
如果你是一位軟件行業(yè)從業(yè)者,尤其是從事服務(wù)器端或者后臺系統(tǒng)軟件開發(fā),相信近年來一定被層出不窮的商業(yè)名詞所包圍:NoSQL、Big Data、Web-scale、Sharding、Eventual consistency、ACID、CAP理論、云服務(wù)、MapReduce和Real-time等,所有這些其實(shí)都圍繞著如何構(gòu)建高效存儲與數(shù)據(jù)處理這一核心主題。
過去十年,在數(shù)據(jù)庫領(lǐng)域與分布式系統(tǒng)方面涌現(xiàn)了許多引人矚目的進(jìn)展,由此深刻地影響了如何構(gòu)建上層應(yīng)用系統(tǒng)。分析這些激動人心的變化背后,你會發(fā)現(xiàn)有以下幾個(gè)非常重要的驅(qū)動因素:
? 互聯(lián)網(wǎng)公司,包括Google、Yahoo! 、Amazon、Facebook、LinkedIn、Microsoft,以及Twitter等,它們每天都在面對海量數(shù)據(jù)和負(fù)載,迫使其不斷創(chuàng)新,并改進(jìn)支撐系統(tǒng)以更有效地處理這種量級的數(shù)據(jù)。
? 商業(yè)方面因素,如敏捷開發(fā)、測試驅(qū)動和對市場機(jī)會做出快速反應(yīng)等,都要求盡量縮短產(chǎn)品開發(fā)周期,因此系統(tǒng)中的數(shù)據(jù)模型也要足夠靈活以方便調(diào)整。
? 免費(fèi)及開源軟件現(xiàn)在已經(jīng)非常成功,在很多領(lǐng)域足以取代商業(yè)或者定制軟件。
? 硬件方面,CPU主頻增長日趨緩慢,而多核系統(tǒng)成為新常態(tài),網(wǎng)絡(luò)速度則依舊保持快速發(fā)展,這就意味著并行分布式系統(tǒng)將會成為業(yè)界主流。
? 如今一個(gè)不起眼的小公司,也完全有能力構(gòu)建起大型分布式系統(tǒng):跨機(jī)器甚至跨地域的數(shù)據(jù)中心,因?yàn)楝F(xiàn)在有了逐漸普及的IaaS云服務(wù)(例如AWS)。
? 很多服務(wù)現(xiàn)在都要求高可用。道理很簡單,系統(tǒng)失效或者維護(hù)時(shí)間越長,其損失代價(jià)越大,甚至大到無法承受。
正是由于這些技術(shù),“數(shù)據(jù)密集型應(yīng)用”(Data-Intensive Applications)把很多不可能變成了可能。那么什么算是“數(shù)據(jù)密集型”(data-intensive)呢?對于一個(gè)應(yīng)用系統(tǒng),如果“數(shù)據(jù)”是其成敗決定性因素,包括數(shù)據(jù)的規(guī)模、數(shù)據(jù)的復(fù)雜度或者數(shù)據(jù)產(chǎn)生與變化的速率等,我們就可以稱為“數(shù)據(jù)密集型應(yīng)用系統(tǒng)”;與之對應(yīng)的是計(jì)算密集型(Compute-Intensive),CPU主頻往往是后者最大的制約瓶頸。
目前已經(jīng)有足夠豐富的技術(shù)或者工具來輔助、幫助我們開發(fā)自己的數(shù)據(jù)密集型應(yīng)用,包括存儲、處理等方面,而這些技術(shù)本身也在快速演進(jìn)之中。例如很多人在關(guān)注新的NoSQL系統(tǒng),但實(shí)際上消息隊(duì)列、緩存、搜索引擎、批處理與流處理框架等相關(guān)技術(shù)也非常重要,事實(shí)上,很多應(yīng)用系統(tǒng)總是會集成組合上述多種技術(shù)。
開篇所羅列的那一堆商業(yè)味頗濃的名詞,某種程度上也彰顯了當(dāng)前大時(shí)代氛圍,機(jī)會多自是好事。然而,作為一名軟件工程師或者架構(gòu)師,仍需秉持嚴(yán)謹(jǐn)?shù)膽B(tài)度,深入理解繁雜詞匯背后系統(tǒng)設(shè)計(jì)所面臨的優(yōu)劣權(quán)衡,只有這樣才能為我所用,構(gòu)建好自己的系統(tǒng)。所以,拋開那些商業(yè)名詞,我們要的是深入的探索。
幸好,軟件千變?nèi)f化,終有若干理念貫穿其中。無論你用的什么數(shù)據(jù)系統(tǒng),如果可以掌握背后的設(shè)計(jì)理念,何種工具適用于何種場景,如何最佳使用,又有哪些陷阱(坑),諸如此類,自然會胸有成竹,而這也是本書寫作的初衷。
所以,本書旨在幫助大家更好地駕馭處理數(shù)據(jù)和存儲數(shù)據(jù)相關(guān)技術(shù)。它不是針對某個(gè)特定軟件的介紹手冊,也不是純理論的習(xí)題。我們會深入探討一些成功的數(shù)據(jù)系統(tǒng)案例,剖析其中的技術(shù)要點(diǎn);或許在很多流行的分布式系統(tǒng)里都有它們的身影,正是這些關(guān)鍵技術(shù)有效應(yīng)對了許多生產(chǎn)環(huán)境對擴(kuò)展性、性能和可靠性的苛刻要求。
我們將對這些典型系統(tǒng)深入展開討論,梳理其核心算法,探討其設(shè)計(jì)理念和背后的權(quán)衡之道。在此過程中,嘗試總結(jié)某些經(jīng)驗(yàn)法則來重新審視系統(tǒng)架構(gòu)。了解怎么工作自然重要,但更重要的是要思考它為什么這樣工作,正所謂“知其然,知其所以然”。
讀完本書之后,你應(yīng)該會對哪些技術(shù)適用于哪些場景,常見工具如何搭配來構(gòu)建應(yīng)用系統(tǒng)等有所得。或許你不會馬上就決定動手開發(fā)一個(gè)全新的數(shù)據(jù)庫引擎(這幾乎完全不需要),但是,關(guān)于系統(tǒng)的本質(zhì),相信你一定有新的認(rèn)識與判斷力:系統(tǒng)行為是否合理,架構(gòu)設(shè)計(jì)如果權(quán)衡,個(gè)中癥狀如何處理等,將會更加游刃有余。
本書適合哪些讀者?
首先你的應(yīng)用如果包含服務(wù)器端、后臺邏輯來存儲、處理數(shù)據(jù),或者你的應(yīng)用需要聯(lián)網(wǎng),例如Web程序、移動程序以及聯(lián)網(wǎng)的傳感器等,這本書將非常適合。
本書主要針對軟件工程師、軟件架構(gòu)師以及技術(shù)經(jīng)理等,特別是那些需要對系統(tǒng)架構(gòu)做出權(quán)衡決定的人,例如需要選擇一些工具和軟件來解決特定問題,或者如何最佳適用這些現(xiàn)有工具。退一步,如果不需要做這些決定,本書也可以幫助你更好地理解這些技術(shù)的優(yōu)缺點(diǎn)。
當(dāng)然你最好有一些Web程序或者網(wǎng)絡(luò)程序的經(jīng)驗(yàn),了解一些基本的關(guān)系型數(shù)據(jù)和SQL;雖然不是必須,但如果通曉NoSQL或相關(guān)系統(tǒng),那再好不過。如果有常見網(wǎng)絡(luò)協(xié)議如TCP、HTTP等基本知識也會幫助很大。選擇何種編程語言或者框架對于閱讀本書沒有太大影響。
如果以下若干條適用于你,可能會從本書中有所獲益:
? 需要學(xué)習(xí)了解系統(tǒng)擴(kuò)展性方面技術(shù),例如支撐百萬用戶級的Web和移動程序。
? 需要構(gòu)建高可用(減少宕機(jī)影響)和健壯運(yùn)行的系統(tǒng) 。
? 需要有效方法來提高長時(shí)間運(yùn)行系統(tǒng)的可維護(hù)性,應(yīng)對規(guī)模增長、技術(shù)和需求不斷發(fā)生變化等。
? 對系統(tǒng)如何工作有種天然的興趣或者探索精神,特別是大型Web和在線系統(tǒng)。本書會例舉若干典型數(shù)據(jù)庫和數(shù)據(jù)處理、分析系統(tǒng),對其設(shè)計(jì)亮點(diǎn)逐一展開分析,也是樂事一件。
當(dāng)我在介紹可擴(kuò)展的系統(tǒng)時(shí),有人會問:“我又不是Google或者Amazon,這些高大上的擴(kuò)展性太遙遠(yuǎn),老老實(shí)實(shí)用關(guān)系數(shù)據(jù)庫就得了?!痹谔囟ㄕZ境下這的確有道理,打造一個(gè)根本不需要的擴(kuò)展性系統(tǒng)是在浪費(fèi)精力,而且會喪失其他方面的靈活性,這其實(shí)是種過早的優(yōu)化。然而我要說,選擇何種工具也很有講究或者說極其重要,不同的技術(shù)各有優(yōu)劣,事實(shí)上正如本書將要揭示的,關(guān)系數(shù)據(jù)庫很重要,但它并非解決數(shù)據(jù)問題的終極方案。
本書涵蓋范圍
本書不會就如何安裝、配置特定軟件包或者API等做太多細(xì)節(jié)介紹,這方面已有足夠多的文檔。我們會著重探討不同的設(shè)計(jì)理念以及如何權(quán)衡,這些通常才是系統(tǒng)的核心,也會例舉實(shí)踐中不同的系統(tǒng)產(chǎn)品最終采用了哪些不同的理念。
本書的電子版已包含所有在線資源的鏈接,這些鏈接在書稿付梓之時(shí)都做了驗(yàn)證,然而大家都能理解,這些網(wǎng)絡(luò)鏈接可能在一段時(shí)間之后會失效。如果不巧碰到了失效的鏈接,或者閱讀的是紙質(zhì)版本,可以隨時(shí)用搜索引擎來查詢相關(guān)資料。對于學(xué)術(shù)論文,推薦用Google Scholar搜索文獻(xiàn)標(biāo)題來下載PDF版本,或者隨時(shí)訪問https://github.com/ept/ddia-references,我們維護(hù)了所有最新的鏈接。
本書主要關(guān)注數(shù)據(jù)處理系統(tǒng)架構(gòu)方面以及如何集成到數(shù)據(jù)密集型應(yīng)用系統(tǒng)中。而關(guān)于部署、運(yùn)營、安全、管理等相關(guān)方面,當(dāng)然也非常重要和足夠復(fù)雜,不過它們并非本書的重點(diǎn),也無意做些膚淺的、聊勝于無的介紹,我們認(rèn)為它們值得單獨(dú)成書。
書中所涵蓋的諸多技術(shù)總體都可以納入到“大數(shù)據(jù)”的范疇。然而,大數(shù)據(jù)這個(gè)商業(yè)詞匯有些過于濫用或者太模糊,不太適合在嚴(yán)謹(jǐn)?shù)墓こ填I(lǐng)域展開討論。本書傾向于使用更加明確的用語,例如單節(jié)點(diǎn)、分布式系統(tǒng),或者在線/交互式分析以及離線/批處理系統(tǒng)等。
本書更偏愛免費(fèi)及開源軟件(Free and Open Source Software,F(xiàn)OSS),主要是通過源碼閱讀、必要的修改,然后實(shí)地執(zhí)行可以幫助理解系統(tǒng)究竟是如何工作的,此外開放系統(tǒng)也能減少對特定供應(yīng)商的鎖定問題。當(dāng)然,我們并非局限于此,也會討論相關(guān)商業(yè)軟件,這包括閉源、軟件即服務(wù)(Software as a Service)或者一些只出現(xiàn)在文獻(xiàn)里但并未公開發(fā)行的一些公司內(nèi)部軟件等。
本書內(nèi)容安排
全書分為三大部分:
1. 第一部分,主要討論有關(guān)增強(qiáng)數(shù)據(jù)密集型應(yīng)用系統(tǒng)所需的若干基本原則。首先開篇第1章即瞄準(zhǔn)目標(biāo):可靠性、可擴(kuò)展性與可維護(hù)性,如何認(rèn)識這些問題以及如何達(dá)成目標(biāo)。第2章我們比較了多種不同的數(shù)據(jù)模型和查詢語言,討論各自的適用場景。接下來第3章主要針對存儲引擎,即數(shù)據(jù)庫是如何安排磁盤結(jié)構(gòu)從而提高檢索效率。第4章轉(zhuǎn)向數(shù)據(jù)編碼(序列化)方面,包括常見模式的演化歷程。
2. 第二部分,我們將從單機(jī)的數(shù)據(jù)存儲轉(zhuǎn)向跨機(jī)器的分布式系統(tǒng),這是擴(kuò)展性的重要一步,但隨之而來的是各種挑戰(zhàn)。所以將依次討論數(shù)據(jù)遠(yuǎn)程復(fù)制(第5章)、數(shù)據(jù)分區(qū)(第6章)以及事務(wù)(第7章)。接下來的第8章包括分布式系統(tǒng)的更多細(xì)節(jié),以及分布式環(huán)境如何達(dá)成一致性與共識(第9章)。
3. 第三部分,主要針對產(chǎn)生派生數(shù)據(jù)的系統(tǒng),所謂派生數(shù)據(jù)主要指在異構(gòu)系統(tǒng)中,如果無法用一個(gè)數(shù)據(jù)源來解決所有問題,那么一種自然的方式就是集成多個(gè)不同的數(shù)據(jù)庫、緩存模塊以及索引模塊等。首先第10章以批處理開始來處理派生數(shù)據(jù),緊接著第11章采用流式處理。第12章總結(jié)之前介紹的多種技術(shù),并分析討論未來構(gòu)建可靠、可擴(kuò)展和可維護(hù)應(yīng)用系統(tǒng)可能的新方向或方法。
參考資料與進(jìn)一步閱讀
書中所討論的很多內(nèi)容可能在其他地方以某種方式有所呈現(xiàn),包括會議演講、學(xué)術(shù)論文、博客、源代碼、Bug追蹤系統(tǒng)、郵件列表,或是工程師間的交流。本書試圖匯集其中最重要的精華呈現(xiàn)給讀者,同時(shí)也附上相關(guān)原始出處的鏈接。每章最后列出的參考索引是一個(gè)很好的資源,可以幫助更深入地去了解某一方面,而且這些內(nèi)容絕大多數(shù)都可以在線訪問。
O’Reilly Safari
Safari(之前的Safari Books Online)是一個(gè)針對企業(yè)、政府、教育工作者以及個(gè)人的會員制培訓(xùn)和參考平臺。
訂閱者可以訪問來自超過250個(gè)出版社的大量書籍、培訓(xùn)視頻、學(xué)習(xí)路徑、交互式教程,以及精選的播放列表,這些出版社包括 O’Reilly Media、Harvard Business Review、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Adobe、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、AdobePress、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett等。
更多信息請?jiān)L問http://orieilly.com/safari。
聯(lián)系我們
請將關(guān)于本書的意見和問題通過以下地址提供給出版商:
美國:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國:
北京市西城區(qū)西直門南大街2號成銘大廈C座807室(100035)
奧萊利技術(shù)咨詢(北京)有限公司
針對這本書,我們還建有一個(gè)網(wǎng)頁,列出了有關(guān)勘誤、示例和其他信息??梢酝ㄟ^以下地址訪問這個(gè)頁面: http://bit.ly/designing-data-intensive-apps。
有關(guān)本書技術(shù)方面的問題和評論,請聯(lián)系bookquestions@oreilly.com。
若想了解O’Reilly圖書、培訓(xùn)課程、會議和新聞的更多信息,請?jiān)L問我們的網(wǎng)站,地址是:http://www.oreilly.com,http://www.oreilly.com.cn。
我們的Facebook: http://facebook.com/oreilly。
我們的Twitter: http://twitter.com/oreillymedia。
我們的YouTube: http://www.youtube.com/oreillymedia。
致謝
本書融合了學(xué)術(shù)研究和工程實(shí)踐的很多經(jīng)驗(yàn),是大量他人思想、知識的融合與系統(tǒng)化。在計(jì)算機(jī)領(lǐng)域,人們往往會被新的東西所吸引,但我認(rèn)為前人有很多優(yōu)秀的工作和積累依然值得深入學(xué)習(xí)。本書有超過800篇參考文獻(xiàn),包括論文、博客文章、演講、產(chǎn)品文檔等,對我來說他們都是本書非常寶貴的學(xué)習(xí)資源。 在此,我衷心感謝原作者們無私的知識分享。
我也從很多交流對話中領(lǐng)悟頗多,感謝這些花費(fèi)了大量時(shí)間與我討論想法、耐心解釋的朋友們。特別是要感謝Joe Adler、Ross Anderson、Peter Bailis、Márton、Balassi、Alastair Beresford、Mark Callaghan、Mat Clayton、Patrick Collison、Sean Cribbs、Shirshanka Das、Niklas Ekstr?m、Stephan Ewen、Alan Fekete、Gyula Fóra、Camille Fournier、Andres Freund、John Garbutt、Seth Gilbert、Tom Haggett、Pat Helland、Joe Hellerstein、Jakob Homan、Heidi Howard、John Hugg、Julian Hyde、Conrad Irwin、Evan Jones、Flavio Junqueira、Jessica Kerr、Kyle Kingsbury、Jay Kreps、Carl Lerche、Nicolas Liochon、Steve Loughran、Lee Mallabone、Nathan Marz、 Caitie McCaffrey、Josie McLellan、Christopher Meiklejohn、Ian Meyers、Neha Narkhede、Neha Narula、Cathy O’Neil、Onora O’Neil、Ludovic Orban、Zoran Perkov、Julia Powles、Chris Riccomini、Henry Robinson、David Rosenthal、Jennifer Rullmann、Matthew Sackman、Martin Scholl、Amit Sela、Gwen Shapira、Greg Spurrier、Sam Stokes、Ben Stopford、Tom Stuart、Diana Vasile、Rahul Vohra、Pete Warden和Brett Wooldridge。
還有些朋友認(rèn)真閱讀了本書草稿并提供了反饋,這對本書的最終成形幫助很大,在此也衷心感謝,他們是Raul Agepati、Tyler Akidau、Mattias Andersson、Sasha Baranov、Veena Basavaraj、David Beyer、Jim Brikman、Paul Carey、Raul Castro Fernandez、Joseph Chow、Derek Elkins、Sam Elliott、Alexander Gallego、Mark Grover、Stu Halloway、Heidi Howard、Nicola Kleppmann、Stefan Kruppa、Bjorn Madsen、Sander Mak、Stefan Podkowinski、Phil Potter、Hamid Ramazani、Sam Stokes和Ben Summers。當(dāng)然,對于本書的任何錯(cuò)誤或者問題,由我本人承擔(dān)全部責(zé)任。
非常感謝編輯Marie Beaugureau、Mike Loukides、Ann Spencer和O’Reilly的所有團(tuán)隊(duì),他們?nèi)棠椭揖徛膶懽鬟M(jìn)度以及各種要求,為這本書付出了很多心血。同時(shí)感謝Rachel Head,為本書潤色不少。我要感謝Alastair Beresford、Susan Goodhue、Neha Narkhede和Kevin Scott,盡管我還有其他的工作安排,但他們給了我非常大的寫作時(shí)間和自由。
特別感謝Shabbir Diwan和Edie Freedman,他們?yōu)槊空屡渖狭思?xì)致的前導(dǎo)地圖。這個(gè)想法非常棒,用創(chuàng)造性的地圖方式來展示內(nèi)容脈絡(luò),最終效果非常漂亮和酷炫!
最后,感謝我的家人與朋友,沒有他們的支持,我肯定無法熬過這漫長的四年寫作過程。你們是我的摯愛!