序
如果你近幾年曾經從事過軟體工程領域的工作,特別是在伺服器和後端系統的領域,你也可能有過被大量資料儲存和資料處理的術語轟炸過的經驗。NoSQL! Big Data!Web-scale! Sharding!最終一致性! CAP 定理!雲端服務! MapReduce!即時性!
過去十來年,我們在資料庫、分散式系統以及在其上建構應用程式的方式有許多引人注目的發展。推動這些發展的因素包括:
• Google、Microsoft、Amazon、Facebook、LinkedIn、Netflix 和Twitter等網路公司都需要處理大規模的資料和流量,迫使它們創造新工具來有效處理如此大量的資料和流量。
• 企業需要夠敏捷,測試假設的成本低,而且也必須透過縮短開發週期和靈活的資料模型來快速因應新的市場洞察。
• 自由和開放原始碼的文化非常成功,現在這些軟體在許多環境中都比商用或內部訂製的軟體還要受歡迎。
• CPU 時脈速度幾乎沒有成長,不過多核心處理器已儼然成為標準配備,而且網路速度也越來越快。這意味著,平行架構也會跟著成長。
• 即使你在一個小團隊工作,現在也可以建立跨多台機器甚至多個地理區域的系統,這多虧了像是Amazon Web Services這類基礎建設即服務(infrastructure as a service, IaaS)的幫忙。
• 現在大家對許多服務的預期都應該是高可用的;大家對於故障或維護而導致的停機時間也越來越要求了。
資料密集型應用(Data-intensive applications)利用了這些技術發展,正在進一步拓展可能性的疆界。如果資料是應用程式的主要挑戰(資料的數量、複雜性或變化速度),我們就可稱其為資料密集型的(data-intensive), 而不是計算密集型的(computeintensive),對於後者而言,CPU 的處理速度將會是瓶頸所在。
已經有工具和技術開始順應時勢,能夠支援資料密集型應用程式的儲存和資料處理。新型的資料庫系統(「NoSQL」)已經得到許多關注,但是訊息佇列、快取、搜尋索引、批次處理和串流處理框架以及零零總總的相關技術也同樣重要。許多應用程式都是採用這些方法的某種組合架構而成的。
一些流行用語(buzzwords)的出現正是對新興機會展現熱情的標誌,這是件了不起的事情。然而,身為軟體工程師和架構師,如果我們想要建構出好的應用程式,還需要對各種技術及其利弊有準確的理解才行。為此,我們必須得繼續挖掘比buzzwords 還要更深入的東西。
幸運的是,技術快速變化的背後存在一些歷久不衰的原則,無論你使用的是哪種工具,這些原則都一體適用。如果能夠理解這些原則,就可以知道每種工具的適用之處、如何充分利用它同時避免其缺陷。這就是本書的價值所在。
本書的目標是帶您一覽當今發展快速且多樣的資料處理與儲存技術。本書並非針對某一特定工具的入門書籍,也不是一本充滿枯燥理論的教科書。相反地,我們將著眼於一些成功的資料系統,以其作為範例:這些技術是許多流行應用程式的基礎,並且必須滿足生產環境所需要的可擴展性、性能和可靠性等等要求。
我們將深入這些系統的內部,梳理出其中關鍵的演算法,討論它們的原則以及必要的權衡。在這趟旅程中,我們也會嘗試找到思考資料系統的有用方法:不僅僅是瞭解它們如何工作,還能夠知道它們為什麼要這樣工作,以及我們需要提出哪些問題才能直指事情的核心。
讀完這本書,你就可以知道如何選擇合適的技術,並瞭解如何將各種工具結合起來形成一個良好的應用架構來當作基礎。對於從頭建構自己的資料庫儲存引擎,或許你全然沒有準備,但幸運的是,已經很少有這種自己再重新來過的必要了。然而,當你對系統底層開始具備良好的直覺,這樣就可以推斷它們的行為,協助你做出優秀的設計決策並跟蹤可能出現的任何問題。