什么是 SSTable?

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

7
这是一篇关于SSTables的很好的介绍文章: http://www.igvita.com/2012/02/06/sstable-and-log-structured-storage-leveldb/ - Taha Jahangir
5个回答

147

Sorted Strings Table(摘自 Google)是一个按键排序的键值对字符串文件。


5
谢谢你提供了另一个优秀的SO Cassandra解答!顺便问一下,你看过这个问题吗:https://dev59.com/r3E85IYBdhLWcg3w3Xhp - knorv
它通常是不可变的吗? - Dean J
1
是的,SSTable 是按设计不可变的 -- 这是一个很棒的特性。 - Schildmeijer
3
它既可以被排序,又可以是不可变的吗? - xjcl
3
SSTable段是不可变的。在内存级别上,通过利用排序数据结构(例如AVL树)设计了排序行为。当您将内存中的数据刷新到磁盘上时,以排序格式进行写入。一旦在磁盘上形成了一个段,就没有办法对其进行编辑,因此它是不可变的。 - Varun Upadhyay
显示剩余2条评论

67

"SSTable提供了一个从键到值的持久、有序、不可变的映射,其中键和值都是任意的字节串。它提供了用于查找与指定键相关联的值以及在指定键范围内迭代所有键/值对的操作。在内部,每个SSTable包含一系列块(通常每个块大小为64KB,但这是可配置的)。块索引(存储在SSTable末尾)用于定位块;当打开SSTable时,索引会被加载到内存中。可以使用单个磁盘查找来执行查找:我们首先通过在内存中的索引上执行二进制搜索来找到相应的块,然后从磁盘读取相应的块。可选地,SSTable可以完全映射到内存中,这使得我们可以执行查找和扫描而不必触碰磁盘。"


9
"without touching disk" -> "在不触碰磁盘的情况下进行操作" 内存映射I/O是一种非常方便的技术,因为它将实际的I/O委托给操作系统,在做好缓存(特别是多个进程共享同一个文件时)的前提下。但它的缺点是你无法控制它。如果页面不在内存中,线程将会阻塞,无法执行其他操作。与之相反的是"异步I/O",其中你可以注册回调并在同一个线程中执行其他操作,同时I/O仍在等待执行。 - mkm
4
@ithkuil:你完全可以控制内存映射IO,至少可以确保某些页面在内存中或已经提交到磁盘(仍有余地,可能存在未被保证在内存中但很可能在内存中的页面)。这就是像mlock()、msync()和MAP_LOCKED这样的神奇工具存在的原因。通过mincore(),你还可以了解当前哪些页面已经分页或未被分页。 - Christopher Smith
3
@ChristopherSmith:是的,你说得对,有方法可以控制它。然而,通常它被用于关键性能部分(实时)或安全相关问题(比如避免内存中的密码被交换到磁盘上)。内存映射文件非常有用,正是因为你不必决定要在内存中保留多少文件;否则,你可以只读取整个文件到内存中,而不使用mmap并达到相同的效果。事实上,我刚刚通过cassandra代码进行了grep搜索;唯一的调用是在启动时执行mlockall(MCL_CURRENT);。另请参见:http://goo.gl/AEgPM - mkm
6
上述引语来自于《BigTable论文》 - ShreevatsaR

7
  • SSTable(英文缩写Sorted Strings Table)是一种按键排序的键值字符串对文件。

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

  • 在内部,每个SSTable包含一个块序列(通常每个块的大小为64KB,但可以配置)。


6

平板电脑以SSTable的形式存储。

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

定义:

  • 键的索引:键和起始位置
  • 块是GFS中的存储单元,通过块进行副本管理

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接