在Cassandra中读取级别压缩策略中的路径

时间:2017-03-29 04:26:00

标签: cassandra

我想知道读取请求是从较高级别(L3,L4,具有更多sstables)变为较低级别(L0,L1,具有较小sstables)还是反过来。

读取请求从较高级别到较低级别的问题是,如果较低级别sstable中的同一行已更新且尚未压缩到较高级别,则较高级别sstable中的行可能包含过时数据。这种理解是否正确?

另一方面,从较低级别到较高级别不会确保单个sstable的90%读取保证。在大多数情况下,它会读取所有级别。

2 个答案:

答案 0 :(得分:0)

确实从较低级别到较高级别......或多或少。来自HH,读取修复或从反熵修复流过的sstables的变异可以将较旧的行放在较低的级别中,这会使这一点变得混乱。 TWCS处理得更好(但仍然不是很好)。

每个级别最多只能读取一个(例外L0是STCS),并按照sstables年龄(往往与级别对应)的顺序遍历sstables。一旦它拥有所有列,它就不必阅读任何较旧的sstables,因此它可以停止,因为它知道即使旧的sstables中的任何数据它已经过时并且将在LWW冲突中丢失。

在计数器,解冻的UDTS和墓碑之间存在一些情况,它们必须阅读所有的sstables。

90%来自没有分区更新的情况。因为还有一个具有10%误报率的布隆过滤器(默认为lcs),因此90%(ish)只会击中一个sstable。

对于像时间序列这样的更新重行或宽行,每个级别中的一个sstable可能会有所请求的分区。在这种情况下,它将必须走所有级别。对于那些,它将使用sstables最小/最大时间戳和最小/最大聚类索引来仅读取必要的内容。在过滤最小/最大sstable分区方面,集群实际上是第一件事。

每次读取nodetool tablehistograms“sstables”的度量标准实际上是分区/群集过滤之间和布隆过滤器检查之前读取的sstables数量(因为可能必须从磁盘读取)。因此,您可以使用该指标来查看实际正在考虑的sstables数量以及磁盘搜索量。

答案 1 :(得分:0)

请查看:

How does the Leveled Compaction Strategy ensure 90% of reads are from one sstable

  

在大多数情况下,它会读取所有级别

只有当您在所有级别保存相同的密钥时才能说明。这是最糟糕的情况,当你必须为每个级别读取1 sstable时。

  

水平压实可确保满足所有读数的90%   从一个单一的sstable(假设几乎统一的行大小)。最糟糕的情况   以总数水平为界 - 例如,10TB数据为7。

http://www.datastax.com/dev/blog/leveled-compaction-in-apache-cassandra