4

Cassandra(或 Scylla)的好处之一是:

当一个表有多个聚簇列时,数据以嵌套排序顺序存储。 https://docs.datastax.com/en/dse/6.0/cql/cql/cql_using/whereClustering.html

因此,我认为以相同的排序顺序读取数据应该非常快。

如果数据的写入顺序与聚类列指定的顺序不同,Cassandra(或 Scylla)何时真正重新排序数据?

是当 memtables 刷新到 SSTables 时吗?

如果一个 memtable 已经被刷新,并且我添加了一个应该在现有 SSTable 中的记录之前的新记录怎么办?

它是否会使数据在磁盘上无序一段时间并在压缩期间重新排序?

如果是这样,需要采取哪些步骤来确保读取顺序正确?

4

2 回答 2

7

数据始终在任何给定的 sstable 中排序。

当一个 memtable 刷新到磁盘时,这将创建一个新的 sstable,它在自身内部进行排序。这是自然发生的,因为 memtables 以排序顺序存储数据,因此此时不需要额外的排序。排序发生在插入内存表时。

使用自然排序的读取必须从与读取相关的所有 sstable 中读取,将多个排序结果合并为一个排序结果。这种合并发生在内存中。

压缩,当它启动时,将用一个替换多个 sstable,创建一个合并流,就像常规读取一样。

这种存储数据的技术称为日志结构合并树

于 2018-10-29T08:35:42.487 回答
2

数据在压缩期间重新排序。

基本上,任何写入都只是一个追加,以便非常快。不涉及读取或搜索。

读取数据时,Cassandra 正在从活动的 memtable 和一个或多个 SSTable 中读取。数据被聚合并满足查询。

由于数据分发可能需要访问越来越多的 SSTable,因此压缩具有重新组织磁盘上数据的作用,因此它将消除从多个 SSTable 读取数据的潜在开销。值得一提的是,SSTables 是不可变的,并且会创建新的 SSTables。旧的被丢弃。

这个过程在 Scylla 和 Cassandra 中是相似的。

于 2018-10-29T08:36:56.787 回答