《數據密集型應用》讀書筆記

花了大概半個月的時間,將《設計數據密集型應用》看了一遍,不愧是豆瓣10.0的好書。

作者在一本書裏面,講解了MySQL, Redis, Solr, Mongodb, Elasticsearch, Kafka, Hive, Hbase, Spark, Flink, Mapreduce, Neo4j, Titan, InfiniteGraph等幾乎所有數據存儲,數據處理的組件。在一本書裏面,囊括幾乎所有類型的數據庫,隊列,NoSQL, 批處理,流式處理組件, 頗有“指點江山,激昂文字,糞土當年萬戶侯”的感覺。

本書講解了從文檔數據模型到關係數據模型到圖數據模型的變遷及面臨的問題; 講解了分佈式系統的核心問題; 介紹了批處理到流式處理能夠應付的業務場景。當然由於本書囊括的技術點過於宏大,沒法一一介紹各個組件的詳細特性及功能點,更多地是站在一個宏觀的層面介紹各個組件的特性及能夠覆蓋的業務場景。

本書讓我印象深刻的有如下幾個點:

1 數據模型

本書介紹了文檔型數據庫,關係型數據庫,圖數據庫。 文檔型數據庫的schemaless, 典型的就是Mongodb和Elasticsearch; 關係型數據庫不必說了,應用最廣泛的MySQL; 圖數據庫用得比較少,Neo4j算是典型了。 通過從文檔到圖,從無關聯到處處關聯。讓Mongodb, Elasticsearch, MySQL, Neo4j在我的知識體系中不再是孤立的點,而是有內在聯繫的知識鏈條。

2 shell版的數據庫

作者通過一個基於shell實現的數據庫,講解索引。 從Hash索引到樹索引, 從B tree到 LSM tree。Hash索引無法解決區間查詢的問題, 二叉樹面對硬盤索引讀取性能問題, B Tree的寫入性能問題...  估計讀完本書後,我一度陷入困惑,應該是希望更深入探索索引細節的想法和原定計劃的衝突。

3 shell版的mapreduce

作者通過組合cat, awk, sort, uniq, head 幾個簡單的命令分析日誌,讓後講解mapreduce。 這個切入點相當經典, 比mapreduce的word-count有意思多了。

4 分佈式系統的一致性

作者講解了分佈式系統存在的問題,主要是一致性問題。 然後引出選舉算法的核心: 共識。相當精闢。 可惜分佈式算法的細節我一向敬而遠之,覺得這個坑有點深,不急着入坑。

閃光點太多了,也許瞭解了一些系統的細節後,再看本書,收穫會更有所不同。

作者的脈絡很清晰:

一個系統必須要面對如下的3個問題: 可靠性,可擴展性,可維護性。 然後基於這3個核心點,講解數據密集型應用是如何實現這3個目標的。

從數據模型層面,抽象一個統一的存取方式,比如SQL。
基於設計的模型,實現各種索引,保障系統的性能。
網絡傳輸層面,設計各種數據編碼,平衡易用性和性能的矛盾。

當單個節點無法滿足業務併發的需求時,通過副本擴展系統。 這裏一致性的問題就已然出現了。
當單個節點無法滿足業務存儲的需求時,通過分片擴展系統,解決存儲瓶頸,無論是容量還是性能瓶頸。
通過事務機制保證原子性,解決數據不一致的問題。
列舉了分佈式系統的種種麻煩及解決問題的算法。

最後介紹了衍生數據,講解批處理和流式處理。

作者相當於給數據處理組件畫了一幅全景圖。如此多的數據組件,開發系統做架構選型也將是個極大的考驗。好在能理解各個組件的異同,學習能夠觸類旁通,舉一反三也是不錯的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章