【问题标题】:How Cassandra read works with single column datamodel partition in multiple SSTables?Cassandra 如何读取多个 SSTable 中的单列数据模型分区?
【发布时间】:2020-01-23 13:06:40
【问题描述】:

我们在 Cassandra 中使用了一个非常简单的键值对数据模型,我们的分区键在 17 个 SSTable 中。我想了解 read 在我们的具体案例中是如何工作的。

如果我理解正确,一般 Cassandra 读取将需要在 memtable 和不同的 SSTable 中搜索每一列的最新版本,直到它检索到所有列并将它们合并。

由于 SSTable 是按时间排序的,并且我们的数据模型是单列的,因此理想情况下,我们的读取操作应该只命中包含我们的分区键的最新 SSTable,因为这将包含整个数据。

我们的读取操作会达到 17 个 SSTables 吗?还是只是包含搜索到的分区键的最新分区键?

【问题讨论】:

  • 嗨,我不确定您使用的是哪个版本的 cassandra,但这是 Tyler Hobbs 在read path internals 上的精彩演讲

标签: cassandra


【解决方案1】:

Cassandra 将搜索所有这些列,因为它不确定哪些列存在于何处(DML 发生在单元级别,因此,执行协调的地方可能存在变体)。读取在分区级别完成。但是,如果 Cassandra 知道某些分区键不存在,它可以过滤掉 sstables。这就是为什么压缩对于最佳读取很重要 - 以删除不必要的单元格。

【讨论】:

  • 谢谢,如果我们在查询中指定列名呢?我的意思是,它不应该只检索该列的最后更新吗?
  • Cassandra 没有该信息。它只知道分区键是 X 并且它存在于 Y sstables 中。扫描它们,协调和响应。可以做一个简单的测试:insert into table,flush table,将同一行插入同一张表,flush table,然后查询表。你会看到它扫描并合并了 2 个 sstables。扫描分区以查找包含它们的 sstable。
【解决方案2】:

我们的读取操作会达到 17 个 SSTables 吗?还是只是包含搜索到的分区键的最新分区键?

为了补充 Jim 的答案,Cassandra 对此有一个称为布隆过滤器的东西。从本质上讲,它是一种概率结构,可以告诉您以下两件事之一:

  • SSTable 可能包含请求的数据。

  • SSTable 肯定包含请求的数据。

这应该可以防止 Cassandra 扫描所有 17 个 SSTable。我的建议是在 cqlsh 中使用TRACING ON 运行查询,它会告诉您需要查看多少个 SSTable。

【讨论】:

    猜你喜欢
    • 2018-09-15
    • 1970-01-01
    • 2017-02-13
    • 2021-11-12
    • 2018-06-07
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多