2010-04-04 195 views
72

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

+0

这是一个伟大的介绍后,以SSTables: http://www.igvita.com/2012/02/06/sstable-and-log-structured-storage-leveldb/ – 2016-12-26 13:11:36

回答

74

排序字符串表(从谷歌借用)是键/值字符串对一文件中,通过键

排序
+2

感谢又一优秀SO Cassandra回答!顺便说一句,你见过这个问题:http://stackoverflow.com/questions/2573106/what-are-the-alternative-ways-to-model-mm-relations-in-cassandra – knorv 2010-04-05 19:15:15

+0

它通常是不可变的? – 2015-07-01 21:40:41

+0

是的,sstables是不可变的设计 - 这是一个很棒的功能 – Schildmeijer 2015-07-03 17:19:52

41

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

+4

“没有触及磁盘” - >“没有意识到磁盘被触摸”。内存映射IO是一种非常方便的技术,因为它将实际的IO委托给操作系统,假设它可以在缓存方面做得很好(特别是当几个进程共享相同的文件时)。但它有缺点,你没有控制它。如果页面不驻留在内存中,则该线程将被阻塞并且不能执行其他操作;将其与“异步IO”进行对比,您可以在IO挂起时注册回调并在同一线程中执行其他操作。 – ithkuil 2011-07-27 14:51:57

+0

@ithkuil:你完全可以控制内存映射IO,至少可以确保某些页面在内存中或已被提交到磁盘(仍然有摆动空间的页面不保证是在内存中,但很好,可以)。这就是像mlock(),msync()和MAP_LOCKED这些奇妙的东西。你也可以通过mincore()来理解当前是什么,没有被分页。 – 2012-04-18 04:58:55

+1

@ChristopherSmith:是的,你说得对,有办法控制它。但是,通常它用于关键性能部分(实时)或安全相关问题(如避免内存中的密码在磁盘上交换)。内存映射文件是非常有用的,因为您不必决定将它们保留在内存中的多少;否则你可以只读取内存中没有mmap的整个文件,并达到相同的效果。事实上,我只是通过cassandra代码擦亮了一下;唯一的调用是'mlockall(MCL_CURRENT);'在启动时完成。另见:http://goo.gl/AEgPM – ithkuil 2012-04-18 17:03:12

3

的片剂储存在SSTables的形式。

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

定义:

  • 键的索引:密钥和起始位置
  • 组块是存储单元在GFS,副本管理是由块
2
  • 的SSTable(英格兰。 Sorted Strings Table)是键/值字符串 对的文件,按键排序。

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

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