作者:生如葳蕤_306 | 来源:互联网 | 2023-05-18 08:48
花了大概半个月的时间,将《设计数据密集型应用》看了一遍,不愧是豆瓣10.0的好书。作者在一本书里面,讲解了MySQL,Redis,Solr,Mongodb,Elasticsearc
花了大概半个月的时间,将《设计数据密集型应用》看了一遍,不愧是豆瓣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。
基于设计的模型,实现各种索引,保障系统的性能。
网络传输层面,设计各种数据编码,平衡易用性和性能的矛盾。
当单个节点无法满足业务并发的需求时,通过副本扩展系统。 这里一致性的问题就已然出现了。
当单个节点无法满足业务存储的需求时,通过分片扩展系统,解决存储瓶颈,无论是容量还是性能瓶颈。
通过事务机制保证原子性,解决数据不一致的问题。
列举了分布式系统的种种麻烦及解决问题的算法。
最后介绍了衍生数据,讲解批处理和流式处理。
作者相当于给数据处理组件画了一幅全景图。如此多的数据组件,开发系统做架构选型也将是个极大的考验。好在能理解各个组件的异同,学习能够触类旁通,举一反三也是不错的。