花了大概半個月的時間,將《設計數據密集型應用》看了一遍,不愧是豆瓣10.0的好書。算法
做者在一本書裏面,講解了MySQL, Redis, Solr, Mongodb, Elasticsearch, Kafka, Hive, Hbase, Spark, Flink, Mapreduce, Neo4j, Titan, InfiniteGraph等幾乎全部數據存儲,數據處理的組件。在一本書裏面,囊括幾乎全部類型的數據庫,隊列,NoSQL, 批處理,流式處理組件, 很有「指點江山,激昂文字,糞土當年萬戶侯」的感受。shell
本書講解了從文檔數據模型到關係數據模型到圖數據模型的變遷及面臨的問題; 講解了分佈式系統的核心問題; 介紹了批處理到流式處理可以應付的業務場景。固然因爲本書囊括的技術點過於宏大,無法一一介紹各個組件的詳細特性及功能點,更多地是站在一個宏觀的層面介紹各個組件的特性及可以覆蓋的業務場景。數據庫
本書讓我印象深入的有以下幾個點:網絡
1 數據模型架構
本書介紹了文檔型數據庫,關係型數據庫,圖數據庫。 文檔型數據庫的schemaless, 典型的就是Mongodb和Elasticsearch; 關係型數據庫沒必要說了,應用最普遍的MySQL; 圖數據庫用得比較少,Neo4j算是典型了。 經過從文檔到圖,從無關聯處處處關聯。讓Mongodb, Elasticsearch, MySQL, Neo4j在個人知識體系中再也不是孤立的點,而是有內在聯繫的知識鏈條。
2 shell版的數據庫併發
做者經過一個基於shell實現的數據庫,講解索引。 從Hash索引到樹索引, 從B tree到 LSM tree。Hash索引沒法解決區間查詢的問題, 二叉樹面對硬盤索引讀取性能問題, B Tree的寫入性能問題... 估計讀完本書後,我一度陷入困惑,應該是但願更深刻探索索引細節的想法和原定計劃的衝突。
3 shell版的mapreduceless
做者經過組合cat, awk, sort, uniq, head 幾個簡單的命令分析日誌,讓後講解mapreduce。 這個切入點至關經典, 比mapreduce的word-count有意思多了。
4 分佈式系統的一致性分佈式
做者講解了分佈式系統存在的問題,主要是一致性問題。 而後引出選舉算法的核心: 共識。至關精闢。 惋惜分佈式算法的細節我一貫敬而遠之,以爲這個坑有點深,不急着入坑。
閃光點太多了,也許瞭解了一些系統的細節後,再看本書,收穫會更有所不一樣。ide
做者的脈絡很清晰: 性能
一個系統必需要面對以下的3個問題: 可靠性,可擴展性,可維護性。 而後基於這3個核心點,講解數據密集型應用是如何實現這3個目標的。
從數據模型層面,抽象一個統一的存取方式,好比SQL。
基於設計的模型,實現各類索引,保障系統的性能。
網絡傳輸層面,設計各類數據編碼,平衡易用性和性能的矛盾。
當單個節點沒法知足業務併發的需求時,經過副本擴展系統。 這裏一致性的問題就已然出現了。
當單個節點沒法知足業務存儲的需求時,經過分片擴展系統,解決存儲瓶頸,不管是容量仍是性能瓶頸。
經過事務機制保證原子性,解決數據不一致的問題。
列舉了分佈式系統的種種麻煩及解決問題的算法。
最後介紹了衍生數據,講解批處理和流式處理。
做者至關於給數據處理組件畫了一幅全景圖。如此多的數據組件,開發系統作架構選型也將是個極大的考驗。好在能理解各個組件的異同,學習可以舉一反三,觸類旁通也是不錯的。