Design Data-Intensive Applications 读书笔记七 索引结构:LSM和B-tree对比

对比B-tree和LSM-tree

即便B-tree比LSM-tree成熟,LSM-tree也有吸引力,因为它的性能。LSM-tree写入很快,B-tree读取很快。LSM-tree读取慢,因为它不得不在压缩的各个阶段检查多个不同的数据结构和SSTable。

但是测定负载通常是不准确的,易受干扰的。你不得不使用自定的负载来测试系统,做出有效的比较。这节我们简要的讨论测量存储引擎性能时要考虑的一些事情。

 

LSM-tree的优势

B-tree会将每个数据至少写入两次:一次是写入写入前的日志,然后是写入树中的page(或许在page分裂时还要写入一次)。即便page只改动了一小部分,也不得不写入整个page,这很浪费资源。一些存储引擎甚至将相同page覆写两次,避免在电力故障后,page只是部分更新。

日志结构索引也会多次重写数据,因为它会重复压缩和合并SSTable。这个影响,在数据库运行时,数据库的一次写入会造成磁盘的多次写入,被称为写入扩展(write amplification)。在写入操作多的应用里,性能的主要瓶颈就是数据库写入磁盘的速率。在这种情况下,写入扩展会造成性能降低:存储引擎越多次写入磁盘,在磁盘有效带宽内,每秒能处理的写入就越少。

LSM-tree能比B-tree处理更高的写入量,一是因为它们有时候有更低的写入扩展,二是因为它会连续写入压缩SSTable而不是覆写多个page。这个区别对于机械硬盘很重要,因为它的连续写快于随机写入。

LSM-tree能被更好的压缩,所以能比B-tree生成更小的文件。B-tree存储会在磁盘上留下未使用的空间,因为分裂操作:当page被分开的时候,或者是一行数据不能适应现存的page时,一个page中的一些空间没有利用。因为LSM-tree不是以page为基础的,而是会不时重写SSTable来移除碎片,它们有着更低的存储负担,特别是使用水平压缩的时候。

 

LSM-trees的缺点

日志架构的存储的弱点就是压缩过程有时候会影响正在进行的读取和写入操作的性能。即便存储引擎试图增量压缩而不影响并行的操作,磁盘的资源也是有限的,很容易发生的情况是请求需要等待磁盘完成很耗资源的压缩操作。结果是吞吐量和平均响应时间很小,但是查询的响应时间大概率变得相当长,但是对B-tree而言这是可控的。

另一个压缩带来的问题是高写入吞吐量:开始时,磁盘的有限的带宽需要分配给几个前台写入程序(日志,写入mentable至磁盘),以及后台运行的压缩线程。当写入一个空的数据库时,整个磁盘的带宽用于前台写入,但是数据库增长后,需要更多的带宽用于压缩。如果写入吞吐量恨到,压缩程序没有很好的配置,可能发生的情况是压缩程序跟不上输入的写入速度;此时,没有合并的块文件就会持续增长,直到用完磁盘空间,读取也会变得很慢,因为需要检查越来越多的块文件。一般而言,基于SSTable的存储引擎不需要限制输入写入速度,即便是压缩速度更不上;所以你需要部署监控来探测这种场景。

B-tree的一个优势就是在索引中每个键值存在一个地方,但是日志结构的存储引擎在不同块文件相同的键会有多个复制的值。这个特定使得B-tree对于那些想提供强一致性的数据库很有吸引力:很多关系型数据库,传输隔离就是在键上范围加锁来实现得,在B-tree索引中,这些锁可以直接附加在树上。

B-tree非常契合数据库,在多种工作场景中提供了一直的良好性能。在新的数据存储中,日志结构索引更受欢迎。没有快捷方便的判断标准来决定那种存储引擎更适合你的应用,要根据经验判断。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Designing Data-Intensive Applications》这本书是一本关于设计和构建大型数据应用程序的指南。它重点关注数据存储、处理和传输方面的现代技术。这本书由三部分组成:第一部分围绕着数据存储系统展开,包括传统的关系型数据库和现代的NoSQL数据库等;第二部分则聚焦于数据处理,涵盖流处理、批处理和交互式查询等领域;第三部分则探讨了如何构建可靠、可扩展且具有良好性能的分布式系统。无论是新手还是老手,都可以从本书中获得一些有价值的见解。这本书概述了不同技术在数据处理方面的优缺点,并介绍了一些构建大型、高效数据应用程序的最佳实践。另外,由于该书旨在让读者获得对现代架构和技术的深刻理解,因此它也介绍了一些分布式系统的核心理论,例如CAP定理和BASE原则等。这本书的读者包括数据科学家、软件工程师、数据工程师和系统管理员。总之,如果你正在构建一个数据密集型应用程序,想要了解最新的技术和最佳实践,那么《Designing Data-Intensive Applications》绝对值得一读。 ### 回答2: 《设计数据密集型应用程序》(Designing Data-Intensive Applications)是一本由 Martin Kleppmann 所著的计算机科学类图书,这本书讨论了当今主要的数据系统和应用程序所面临的问题和挑战,并提供了一些解决方案。这本书内容涵盖了分布式系统、数据存储和查询、数据一致性与容错性、流处理、数据流水线、实时分析等领域,不仅提供了丰富的理论知识,还有很多实践案例和相关技术细节。 对于软件工程师、架构师、数据工程师等人来说,这本书是一本非常重要的访问。如果你正在开发一个数据密集型的应用或系统,这本书提供了很多有用的指导和建议。例如,这本书会告诉你如何选择和使用不同的数据存储技术,如何设计高效的数据处理流水线,如何保证系统的可扩展性和容错性等等。 《设计数据密集型应用程序》还使用了很多实用的案例和场景,比如 Twitter 的分布式消息队列 Kafka,Google 的基于 Paxos 算法的分布式一致性协议 Chubby,Facebook 的实时数据处理系统 Apache Samza 等等。通过这些案例,读者可以更好地了解如何应用书中的理论知识到实际工作中。 总之,《设计数据密集型应用程序》是一本值得阅读的计算机科学类图书,无论你是软件工程师、数据工程师、系统架构师等,都有望从中获得很多启发。 ### 回答3: Designing Data-Intensive Applications是一本讲述大数据应用程序设计的书籍。这本书主要涵盖了数据密集型应用程序设计的方方面面,包括数据存储和查询、数据处理和流处理、分布式系统和高可用性、性能和可扩展性等。它通过介绍各种不同的数据管理工具和技术,帮助读者了解如何在大数据领域中设计出高效和可靠的应用程序。 在设计数据密集型应用程序时,需要考虑很多因素。从数据存储和查询的角度来看,我们需要考虑使用哪种数据库或数据存储方案,并且了解其适用的场景和可扩展性。同时还需要思考如何使用数据查询工具来优化查询性能。 在数据处理和流处理方面,我们需要选择正确的数据处理框架和工具,以处理大数据集合。我们也需要了解如何设计分布式系统,并且使其具有高可用性和容错性。性能和可扩展性也是设计数据密集型应用程序时的至关重要因素,因此我们需要考虑如何优化系统吞吐量和处理能力,并在需要时进行水平扩展。 总之,Designing Data-Intensive Applications是一本非常有价值的书籍,可以帮助读者了解如何在大数据领域中进行应用程序设计。它提供了丰富的知识和有实际应用的案例,让读者在实践中掌握数据密集型应用程序设计的关键技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值