SStable

Google SSTable文件格式被用于BIgTable内部数据,SStable是一种不可变的、排序的、持久化的key_value Map,其中key和value都是任意字节的字符串。提供了找寻特定Key值对应的value的操作,以及找寻给定范围内所有key_value的操作。每一个SStale包括一系列的block(一般block大小是64Kb,这个值是可以配置的)Google SSTable文件格式被用于BIgTable内部数据,SStable是一种不可变的、排序的、持久化的key_value Map,其中key和value都是任意字节的字符串。提供了找寻特定Key值对应的value的操作,以及找寻给定范围内所有key_value的操作。每一个SStale包括一系列的block(一般block大小是64Kb,这个值是可以配置的)

sorted String Table(ssdtable)是HBase,cassandra一些nosql数据库中使用的一种持久文件格式,用于获取存储在memtables中的内部数据,对其进行排序已实现快速访问,并将其存储在磁盘上的一组持久的,有序的,不可变的文件中.不可变意味着sstable永远不能被修改.它们稍后会被合并到新的sstable中,或者在更新数据时被删除

其中Key和value都可以是任意的byte字符串。使用Key来查找Value,或通过给定Key范围遍历所有的Key/Value对。

每个ssTable包含一系列block(一般block大小为64kb,可配置)SStable末尾是block索引,用于定位block,这些索引在SStable打开是被加载到内存中,再查找是首先从内存中的索引二分查找到block,然后通过一次磁盘寻找即可读取到相应的block.还有一种方案是将这个SStable加载到内存中,从而在查找和扫描过程中不需要读盘

SSTable和LSM-Tree在学大数据必懂系列之LSM-Tree文章中,我们讲到LSM-Tree是一种能够将批量随机写,转换为顺序写的数据结构,其实本质就是不断产生SSTree结构的Log文件,然后不断Merge以提高文件效率的,它是一种分层的组织数据的结构,具体到实现上就是一些按照逻辑分层的有序文件一言概述的话 :LSM-Tree的树节点可以分为两种,保存在内存中的称之为MemTable, 保存在磁盘上的称之为SSTable在学大数据必懂技术之LSM-Tree文章中,我们也提到LSM-Tree是应用与写多读少的场景,对于大数据量的写入性能很好,但是损耗了一些数据读取的性能,那么SSTable的数据结构就是作为一个解决方案来处理这种读取效率低的问题。

  1. 磁盘上的SSTable需要永远加载在内存里
  2. 所有写操作直接memTable(写入缓存即内存保证随机写入速度)
  3. 读数据的时候先从memTable检索,然再从SStable的索引中检索
  4. MemTable周期性Flush到磁盘中
  5. 磁盘上的SSTable会定期合并
  6. 落盘的数据不可变更,更新操作并不是真正的物理修改和删除,只是已增加版本号

SStable和LSM-Tree更新和删除在内存中写操作是经常发生的,写操作是直接写入MemTable,当MemTable达到一定size,就flush到disk内成为一个不可变的immutable的SSTable.与此同时我们会保持(maintain)所有SSTable的index在内存中,这样在对给定的key进行搜索的时候,我们首先在MemTable内进行检索,再在每一层的SSTale之间再进行搜索

那对于更新与删除操作呢?对于更新操作,因为SSTable是不可变的,因此更新与删除操作只发生在内存的MemTable内,如果要对SSTable内的数据进行更新只需要重新写进去一个新的就可以了,因为对于SSTable的访问是顺序的,所以新内容的存在会覆盖旧内容,也就是顺序访问到需要的值的时候就会退出,以下的旧值不被访问到。对于删除操作,也是在MemTable内插入一个“墓碑”标志加值,代表这个值被删除了,然后访问的时候会提前访问到墓碑标志而得知该值已经被删除了SSTable 压缩和合并随着数据的不断写入和更新,将创建更多不可变的SSTable文件。每层SSTable的文件到达一定条件之后进行合并操作(hbase.hregion.memstore.flush.size),然后放置到更高层,因此,可以在磁盘上的不同SSTable文件中找到具有不同版本数据的相同记录。系统了解这些记录中的哪些是最新的,并且仅使用最新版本响应查询请求。然而,如果没有某种方法来删除过时的数据,SSTable计数和存储的数据量将非常高,磁盘将被填满。压缩是一个使用现有SSTables中的数据写入一个全新文件的过程。此过程将消除过时记录的重复数据,并仅将同一密钥的最新更改写入不同的SSTable,从而写入新的SSTALE文件。删除的行(由称为“墓碑”的标记指示)或整个删除的列也会被清除,并且该过程会为压缩的SSTable文件创建新的索引。

Last modification:August 8, 2023
如果觉得我的文章对你有用,请随意赞赏