Cassandra Leveled Compaction Strategy

简介: 这篇文章19年写的,重新发到开发者社区翻新下。

前言

Cassandra是基于LSM架构的分布式数据库。LSM中有一个很重要的过程,就是压缩(Compaction)。默认的压缩策略是SizeTieredCompactionStrategy,今天主要说一下另一种压缩策略LeveledCompactionStrategy。

LeveledCompactionStrategy

LeveledCompactionStrategy被用在读密集的场景,读操作的延迟相对容易估算(最坏情况可控),缺点是会有更多的磁盘IO消耗。

SSTable合并过程

image

这个压缩算法主要是将数据分级(L0,L1,L2……)。最开始数据在内存(memtable)里,然后被flush到磁盘上,也就是到了L0这级。L0的sstable会和L1的合并成更大的sstable。

大于等于L1的层级,sstable大小会被控制在sstable_size_in_mb(160MB)。每个层级之间数据量是10倍的关系,即L2的数据量是L1的10倍。我们假设L1可以容纳10*160MB,那么L2可以容纳100*160MB。如果在L1做压缩,结果大于10哥文件,则会被合并到L2。如此反复,多出来的文件会跟下一层级中有重叠的文件合并。

非常多次写入后

image

性能分析

经过上面这个合并流程,LCS 会保证每个层级内的每个文件数据不重叠(除了L0),这也就是它高效原因所在。你所要读的数据大概率会只在某个层级中,而层级内文件数据不重复,所以你大概率只需要读一个文件即可。这个概率是多少呢,大约是90%。这个是怎么算的呢?因为每一层是前一层的10倍,所以最后一层容纳了大部分数据。比如:L1=10,L2=100,L3=1000,L3占比90.09%。同理,可以推出无用数据(删除或被覆盖的),最多占比10%左右(假设L1和L2全是无用数据)。

如果是更新删除比较高频的场景,那么读最坏情况,可能需要访问每个层级,每个层级读一个文件(L0除外),所以说最坏情况可控。如果L0中的文件出现积压,是有可能出现更坏的情况都,需要再访问L0中大部分文件。

更多细节可以参考:https://cassandra.apache.org/doc/latest/cassandra/operating/compaction/lcs.html

相关文章
|
9月前
|
分布式计算 测试技术 Apache
探索Apache Hudi核心概念 (3) - Compaction
探索Apache Hudi核心概念 (3) - Compaction
162 5
|
9月前
|
分布式计算 Apache 调度
Apache Hudi 异步Compaction部署方式汇总
Apache Hudi 异步Compaction部署方式汇总
170 0
|
9月前
|
存储 缓存 算法
Redis进阶-分布式存储 Sequential partitioning & Hash partitioning
Redis进阶-分布式存储 Sequential partitioning & Hash partitioning
74 0
|
9月前
|
Go 对象存储 Python
dataCoord的Compaction分析2
dataCoord的Compaction分析2
648 0
|
SQL JSON 分布式计算
Apache Hudi初探(九)(与spark的结合)--非bulk_insert模式
Apache Hudi初探(九)(与spark的结合)--非bulk_insert模式
287 0
|
分布式计算 算法 大数据
Spark - RangePartitioner rangeBounds 生成 源码分析 & 实践
本文主要探索RangePartitioner 源码中rangeBounds 的生成,rangeBounds 用于对 key 进行范围分区,通过源码可以学习到如何在分布式大数据下采样并获取近似均分的范围。
229 0
Spark - RangePartitioner rangeBounds 生成 源码分析 & 实践
|
SQL 分布式计算 大数据
【spark系列3】spark 3.0.1 AQE(Adaptive Query Exection)分析(一)
【spark系列3】spark 3.0.1 AQE(Adaptive Query Exection)分析(一)
703 0
【spark系列3】spark 3.0.1 AQE(Adaptive Query Exection)分析(一)
|
分布式计算 Spark
【spark系列3】spark 3.0.1 AQE(Adaptive Query Exection)分析(二)
【spark系列3】spark 3.0.1 AQE(Adaptive Query Exection)分析(二)
470 0
|
分布式计算 Java 调度
Apache Hudi异步Compaction方式汇总
本篇文章对执行异步Compaction的不同部署模型一探究竟。
714 0
|
分布式计算 测试技术 调度
一文彻底掌握Apache Hudi异步Clustering部署
在之前的一篇中,我们介绍了Clustering(聚簇)的表服务来重新组织数据来提供更好的查询性能,而不用降低摄取速度,并且我们已经知道如何部署同步Clustering,本篇博客中,我们将讨论近期社区做的一些改进以及如何通过HoodieClusteringJob和DeltaStreamer工具来部署异步Clustering。
566 0