LSM与TSM原理分析

导语

LSM作为一种重要的数据存储结构方式,被许多大型开源存储系统应用为底层引擎的存储结构。同时由于influxDB的不断改良,一种基于LSM的改良数据结构TSM也开始被熟知并广泛应用。本文将基于官方文档和相关论文分析该两种数据结构的组成原理和应用特点。

LSM(Log-Structured Merge Tree)日志结构合并树

° 模型发展

由于b+树具有稳定查询效率、逻辑上有序的数据存储等特点,使得b+树成为了许多RDBMS的底层引擎的数据结构。不过,b+数的有序数据存储仅保持在逻辑层面,在实际的磁盘访问中,由于b+树中的数据并不是批量读写磁盘,因而会产生大量的随机读写。在以机械硬盘为存储主力的时代,由于单机械臂的局限,硬盘需要在处理随机读写的过程中访问大量不必要的额外数据,造成性能上的损失。因此,寻找更加高效的、能够解决随机读写效率问题的新的数据结构成为九十年代数据库学界研究方向主流。1996年《Acta Informatica》期刊发表The log-structured merge-tree (LSM-tree)文章,提出了通过延时写数据来保证磁盘顺序存取并带有事务日志的合并树模型。2008年《ACM Transactions on Computer Systems》期刊发表文章Bigtable: A Distributed Storage System for Structured Data,在LSM的基础上提出了分布式存储系统,并由此衍生出hbase、cassandra等开源存储系统。本文将从bigtable入手,忽略与分布式相关的知识,从bigtable中看LSM的应用。

° 原理

  1. LSM

图1 LSM中硬盘树与内存树的合并操作

LSM论文中提出一种减少io操作并避免随机存取的表信息存储结构。在进行表插入操作时,数据会先被写入日志(类似es的translog和MySQL innodb中的redo log)中,并在内存和硬盘中构造两种树状存储结构,内存树为C0树,硬盘树为C1树,数据根据键值进行排序,C0树结构可选AVL树,C1树是b树类型,且索引节点被保存在内存中。在内存数据丢失时,数据可以从日志中恢复,重新读取到内存中。实际可将LSM看作SB树的改良。

写操作发生时,数据先写日志,然后被加载到内存树中,当内存树数据到达阈值时,将自己叶子结点的数据与硬盘树进行合并。由于数据有序,内存树的合并节点与硬盘树将进行一次归并排序,将内存中的部分数据一次性写入硬盘,以此减少磁盘io次数。读操作时,先从内存树中寻找数据是否命中,命中丢失时通过内存中保存的索引节点快速从硬盘树中读取对应数据。删除与更新操作发生时,硬盘树会标记需要被更新和删除的节点,在下一次合并时进行相应操作,减少磁盘操作次数。通过这种方式,实现了读写分离,并避免了随机读写带来的磁盘io瓶颈。

2. Bigtable中的变种

图2 bigtable论文中单个tablet的结构图,tablet为分布式的单位,由连续的键组成

图3 自己画了个更容易理解的图

在bigtable中,插入的数据同样先写入commit log,以便记录和备份(GFS, Google File System, 屏蔽了文件在分布式系统中的存储方式)。同时,将数据以键值对形式保存在内存的memtable中,键为数据库模式的行列关键字和时间戳,memtable通过avl或者红黑树实现,数据按照有序方式进行排列。

与LSM论文中的实现不同,bigtable中当memtable里的数据当到阈值时,会freeze该memtable,并开辟一个新的空间作为新的memtable,被fronzen的memtable将被转化成ssTable(Google的一种持久有序只读的map结构文件),并写入硬盘中。

硬盘中会有一个多级联的文件组织结构对ssTable进行管理,当图3的level1中的ssTable数量达到该层的上限时,会将level1总的ssTable进行merge操作,由于数据都是有序的,因此相当于进行一次多路归并排序,合并后的大文件会被存储在level2中,以此类推。这样在数据从内存保存到硬盘的过程中,只进行了一次io操作,将memtable里的数据一次性写入硬盘,并且将多个ssTable合并成一个文件,在文件系统中由一个inode去记录起始block,实现硬盘中的连续存储,节省存储空间。

在读操作时,会先访问内存memtable中的数据,命中丢失时再访问硬盘。由于ssTable中的数据都是有序的,因此level2、level3可以保存一个开始节点的索引,这样访问硬盘时先读取索引获知数据在哪一层,然后通过二分等方式从该层的ssTable获取数据。另外可以通过布隆过滤器等方式,快速判断是否保存了对应数据。

删除操作与LSM中的实现一样,会用tombstone标记对应节点,然后在ssTable文件合并时进行处理。查询时,在返回结果集中删掉被tombstone标记的数据。合并时,删除tombstone标记及其数据。由于frozen memtable是一次性保存为level 1中的ssTable,因而level 1中可能存在相同键的数据,因而在读取level 1中数据时需要遍历该层的所有文件,造成一定性能损耗。

3. 区别

总体而言,Bigtable在屏蔽掉分布式条件后的数据存取方式与LSM基本相同。区别在于Bigtable是将内存中的数据一次性写入硬盘

在硬盘文件数到达阈值时再做合并操作,相较于LSM进一步减少了硬盘io操作。

° 开源存储组件

在Bigtable提出以后,许多开源存储组件在此基础上实现了自己的引擎,如LevelDB、HBase等。另外,由于Bigtable保存时间戳为数据键的特性,为TSDB提供了良好的解决方案。然而,由于删除数据时昂贵的操作代价,同时给TSDB的数据滚动策略造成瓶颈。

TSM (Time-structured Merge Tree) 时间结构合并树

° 模型发展

在influxDB的0.9.4版本之前,为了避免删除数据所有付出的io操作代价,influxDB以BoltDB作为底层存储引擎,结构上采用更加稳定的B+树。然而在数据量增加到GB单位以后,写入操作带来了庞大的IOPS,导致性能下降。随后,influxDB开源社区决定构建自己的存储引擎TSM,它与LSM相似,并减少了删除时的性能问题。相比于LevelDB,支持了热备份功能,并直接将RP的时间段保存为单个硬盘文件,以此减少删除时的磁盘io。

° 原理

图4 手绘TSM结构图

TSM同样有WAL和只读有序压缩数据文件(.tsm)。在写入时,数据同时写入segment和Cache中。segment由一系列文件编号递增的wal文件组成,每次写入发生时,数据会被序列化后进行Snappy压缩,并写入wal文件并将数据添加到内存的索引中,用以快速访问measurement/tag/series。而Cache是对wal文件中所有数据点的内存拷贝,Cache有

  1. cache-snapshot-memory-size

  2. cache-max-memory-size

  3. cache-snapshot-write-cold-duration

三个重要阈值。

当Cache数据量达到 cache-snapshot-memory-size,Cache进行快照。当Cache数据量达到 cache-max-memory-size不再接收数据。时间达到 cache-snapshot-write-cold-duration,进行快照。快照时Compactor会将Cache数据写入tsm文件中。

Compactor是优化数据并进行数据合并的组件,运行过程称为Compactions,包含 Level Compactions 和 Index Optimizations Compaction 。Level Compactions 分为4级,每级随着tsm文件容量的变大进行压缩合并,生成更大的tsm文件,每级压缩比会升高,节省磁盘空间同时释放cpu的频繁活动。Index Optimizations Compaction 发生在第四级Level Compactions中,分割每个tsm文件中的series,使得每个文件的series都不同,目的是避免tsm文件内部索引变大带来的昂贵访问成本。当数据过期或被在分片中删除时,会启动 Full Compaction,同时执行Level Compaction和Index Optimizations Compaction 的优化,产生最佳压缩比tsm文件。

tsm文件是数据持久化保存的载体,通过mmap内存映射实现内存经过LRU算法对硬盘页的快速加载。文件结构由header/blocks/index/footer组成,如图4 snapshot部分所示:

  1. header: 由魔数和版本号组成。

  2. Blocks: CRC32错误检测块和数据块共同组成一个block,Blocks中记录有多个block。

  3. Index: key len为键长,key为measurement&tag&field组成的键,type为block数据类型,count为Index的block计数,每个Index block由最小最大时间、blcok所在文件偏移量和大小组成,每个block对应一个Index block。

  4. Footer: 记录Index开头offset。

查询时,通过index定位到series key的存储位置,Cache之外的数据通过搜索tsm文件的index以返回数据。

插入和删除时,做Cache中的修改,或标记映射文件中的数据,合并时处理,与LSM一致。滚动删除时,由于tsm文件对应RP时间段,因此硬盘的文件删除也得以快速实现。

° 与LSM的异同

TSM中的文件组成结构与ssTable大致相同,且TSM的wal、合并、分级、快照等机制与LSM大致相同。与LSM主要的不同是TSM使用了mmap加快了文件从硬盘加载到内存的速度,并进行series的区分来加快数据定位。同时,在写入的wal部分区分删除和插入数据,分别写入不同的wal文件。并且TSM使用了压缩了来减少磁盘空间使用。总的来说,这种读写分离的处理方式一定程度上突破了磁盘io瓶颈,在时间序列的应用场景下,由于少量的删除操作,也不会带来太大的文件合并代价。

° 开源存储组件

influxDB

° influxDB基础概念

请参考官方文档: https://docs.influxdata.com/influxdb/v1.8/concepts/key_concepts/

° 参考文献:

[1] O’Neil, P., Cheng, E., Gawlick, D. and O’Neil, E., 1996. The log-structured merge-tree (LSM-tree). Acta Informatica, 33(4), pp.351-385.

[2] Chang, F., Dean, J., Ghemawat, S., Hsieh, W.C., Wallach, D.A., Burrows, M., Chandra, T., Fikes, A. and Gruber, R.E., 2008. Bigtable: A distributed storage system for structured data. ACM Transactions on Computer Systems (TOCS), 26(2), pp.1-26.

[3] https://docs.influxdata.com/influxdb/v1.8/concepts/storage_engine/

[4] Naqvi, S.N.Z., Yfantidou, S. and Zimányi, E., 2017. Time series databases and influxdb. Studienarbeit, Université Libre de Bruxelles.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值