cassandra:`sstabledump`输出问题

时间:2017-11-14 12:04:21

标签: cassandra nosql

我正在检查sstabledump的输出,以便更好地理解cassandra数据模型,我有一些问题

sstabledump的输出看起来似乎

  1. 表是分区列表(按分区键拆分)
  2. 分区是行列表(根据群集密钥分割)
  3. 一行是键值对的映射,其中键属于预定义列表
  4. 问题1:对于每个分区,以及分区内的每一行,都有一个position密钥。这个值对应的是什么?物理存储细节?究竟是怎么回事?

    问题2:每个分区内的每一行都有一个type: row键值对。这种类型可以是其他什么吗?如果有,那是什么?如果不是

    • 为什么有一个总是相同的值?
    • 为什么cassandra被归类为宽栏和其他类似术语?看起来更像是一个两级行存储。

1 个答案:

答案 0 :(得分:2)

分区键是你指定为主键的murmur3哈希值。 Consistent hashing与该哈希一起使用,以确定该分区所属的群集中的哪个节点及其副本。在每个分区内,数据按聚类键排序,然后按行中的单元名称排序。使用该结构时,如果一次插入一行,则时间戳等冗余内容仅作为来自分区的vint delta序列插入一次以节省空间。

在磁盘上,分区按此散列键的顺序排序。 position键的输出仅指sstable数据文件中的位置(解压缩的字节偏移量)。 type还可以在该点中识别为静态块,该块位于每个分区的开头,用于任何静态单元格或远程逻辑删除标记(开始或结束)。请注意,即使没有物理地写入磁盘(即重复的时间戳),有时可以在json中重复使用sstabledump值以获得可读性。

您可以在分区中包含许多这些行,例如,时间序列的通用数据模型是使用时间戳作为群集键,这会产生具有数百万行的非常宽的分区。 Pre 3.0以及数据存储更接近big table的设计。它基本上是Map<byte[], SortedMap<byte[], Cell>>,其中排序映射的比较器基于模式进行了更改。它没有区分分区中的行和列,并且导致大量冗余数据,并且经过重新设计以更好地适应查询语言。

更多参考资料: