什么是 SSTable?

Posted

技术标签:

【中文标题】什么是 SSTable?【英文标题】:What is an SSTable? 【发布时间】:2011-02-04 06:47:49 【问题描述】:

在 BigTable/GFS 和 Cassandra 术语中,SSTable 的定义是什么?

【问题讨论】:

这是一篇很棒的 SSTables 介绍文章:igvita.com/2012/02/06/… 【参考方案1】:

Sorted Strings Table(借自google)是一个key/value字符串对的文件,按key排序

【讨论】:

感谢另一个出色的 SO Cassandra 答案!顺便说一句,你有没有看到这个问题:***.com/questions/2573106/… 它通常是不可变的吗? 是的,sstable 在设计上是不可变的——这是一个很棒的特性 那怎么才能既排序又不可变呢? @xjcl SSTable 段是不可变的。通过利用诸如 AVL 树之类的排序数据结构,排序行为是在内存级别上设计的。当您刷新磁盘上的内存时,您以排序格式写入它。一旦在磁盘上形成一个段,就无法对其进行编辑,因此它是不可变的。【参考方案2】:

“SSTable 提供了一个从键到值的持久、有序的不可变映射,其中键和值都是任意字节字符串。提供操作来查找与指定键关联的值,并迭代所有键/​​值指定键范围内的对。在内部,每个 SSTable 包含一系列块(通常每个块的大小为 64KB,但这是可配置的)。块索引(存储在 SSTable 的末尾)用于定位块; index 在 SSTable 打开时加载到内存中。可以通过一次磁盘查找来执行查找:我们首先通过在内存索引中执行二进制搜索来找到适当的块,然后从磁盘中读取适当的块。可选,SSTable可以完全映射到内存中,这样我们就可以在不接触磁盘的情况下进行查找和扫描。”

【讨论】:

“不接触磁盘”->“不知道磁盘被接触”。内存映射 IO 是一种非常方便的技术,因为它将实际 IO 委托给操作系统,假设它可以很好地缓存(尤其是当多个进程共享同一个文件时)。但它的缺点是你无法控制它。如果页面不常驻内存,线程会阻塞,不能执行其他操作;将其与“异步 IO”进行对比,您可以在其中注册回调并在同一线程中执行其他操作,而 IO 处于挂起状态。 @ithkuil:您绝对可以控制内存映射 IO,至少能够确保某些页面在内存中或已提交到磁盘(页面仍有摆动空间不能保证在内存中,但很可能是)。这就是 mlock()、msync() 和 MAP_LOCKED 之类的奇妙事物的全部意义所在。您还可以通过 mincore() 了解当前哪些是分页,哪些不是分页。 @ChristopherSmith:是的,你是对的,有办法控制它。但是,通常它用于关键性能部分(实时)或安全相关问题(例如避免在磁盘上交换内存密码)。内存映射文件非常有用,正是因为您不必决定要在内存中保留多少文件。否则你可以在没有 mmap 的情况下读取内存中的整个文件并达到相同的效果。事实上,我只是通过了 cassandra 代码。唯一的电话是mlockall(MCL_CURRENT); 在启动时完成。另见:goo.gl/AEgPM 以上引用来自the BigTable paper。【参考方案3】:

tablet 以 SSTables 的形式存储。

SSTable(直接映射到 GFS)是基于键值的不可变存储。它存储数据块,每个数据块大小为 64KB。

定义:

键的索引:键和起始位置 Chunk是GFS中的一个存储单元,副本管理是按chunk来的

【讨论】:

【参考方案4】:

SSTable (engl. Sorted Strings Table) 是一个键/值字符串文件 对,按键排序。

SSTable 提供了一个持久的、有序的不可变映射,从键到 值,其中键和值都是任意字节字符串。

在内部,每个 SSTable 都包含一系列块(通常 每个块大小为 64KB,但这是可配置的)。

【讨论】:

【参考方案5】:

SSTable 表示“排序的字符串表”,基于键值对。在 Cassandra 中,SSTable 是不可变的,并且是按键排序的。

【讨论】:

以上是关于什么是 SSTable?的主要内容,如果未能解决你的问题,请参考以下文章

了解 SSTable 不变性

万字长文使用 LSM Tree 思想实现一个 KV 数据库

06-Leveldb实现-sstable

06-Leveldb实现-sstable

06-Leveldb实现-sstable

LevelDB 源码剖析SSTable模块:SSTableBlock布隆过滤器LRU Cache