Cassandra 数据如何维护

  

数据如何维护?

Apache Cassandra™(DDAC)数据库写入过程DataStax分发将数据存储在称为SSTables的文件中。SSTable是不可变的。数据库不使用插入或更新覆盖现有行,而是在新的SSTables中写入已插入或更新的数据的新时间戳版本。数据库不会通过删除已删除的数据来执行删除。而是,数据库使用逻辑删除标记已删除的数据

随着时间的流逝,数据库可能会在不同的SSTables中写入一行的许多版本。每个版本可能具有一组唯一的列,并以不同的时间戳存储。随着SSTable的累积,数据的分发可能需要访问越来越多的SSTable来检索完整的行。

为了保持数据库的健康,数据库会定期合并SSTables并丢弃旧数据。此过程称为压缩。

 

压缩

压缩对SSTables的集合起作用。从这些SSTable中,压缩使用每一行列的最新版本(按时间戳记)收集每个唯一行的所有版本,并组装一个完整行。合并过程是高效的,因为行是通过每个SSTable中分区键排序的,并且合并过程不使用随机I / O。每行的新版本都会写入新的SSTable。旧版本以及准备删除的所有行都保留在旧SSTables中,并在任何未完成的读取完成时删除。

压实如何工作

 Cassandra 数据如何维护_第1张图片

 

 

压缩会导致新旧SSTables共存时磁盘空间使用量和磁盘I / O暂时增加。完成后,压缩将释放旧SSTables占用的磁盘空间。通过用压缩的SSTable逐渐替换旧的SSTable,可以提高读取性能。数据库甚至可以在完成写入之前就直接从新的SSTable中读取数据,而不必等待整个压缩过程完成。

数据库进程进行读写操作时,它将页面缓存中的旧SSTables替换为新的SSTables。缓存新SSTable的过程是将读取从旧缓存中移开,它是渐进式的,不会造成严重的缓存未命中。这意味着即使在重负载下Cassandra也可以提供可预测的高性能。

 

 

压实策略

卡珊德拉数据库支持不同的压缩策略。这些策略控制着选择哪个SSTable进行压缩,以及如何将压缩的行分类到新的SSTable中。每种策略都有自己的优势。以下各节介绍了每种压缩策略。

尽管以下各节均以通用建议开头,但许多因素使压缩策略的选择复杂化。请参阅选择压缩策略

SizeTieredCompactionStrategy(STCS)
建议用于写密集型工作负载。
  • 优点:很好地压缩了写密集型工作负载。
  • 缺点:可以将陈旧的数据保留太长时间。所需的内存随时间增加。

当数据库已累积设置数量(默认值:4)的相似大小的SSTables时,SizeTieredCompactionStrategy(STCS)启动压缩。STCS将这些SSTable合并为一个更大的SSTable。随着更大的SSTable的累积,STCS将这些合并为更大的SSTable。在任何给定时间,都会出现几个大小不同的SSTable。

多次插入后按大小分层压实

Cassandra 数据如何维护_第2张图片

 

 

尽管STCS可以很好地压缩写入密集型工作负载,但由于按大小合并过程不会按行对数据进行分组,因此它会使读取速度变慢。这使得特定行的版本更有可能分布在许多SSTables上。而且,STCS不会像预期那样逐出已删除的数据,因为其压缩的触发因素是SSTable的大小,并且SSTables可能增长得不够快,无法合并和逐出旧数据。随着最大的SSTable的大小增加,在STCS压缩期间新旧SSTable同时需要的磁盘空间量可能超过节点上典型的磁盘空间量。

LeveledCompactionStrategy(LCS)

建议用于读取密集型工作负载。
  • 优点:磁盘需求更容易预测。读取操作延迟更可预测。过时的数据被更频繁地逐出。
  • 缺点:更高的I / O利用率会影响操作延迟

LeveledCompactionStrategy(LCS)减轻了STCS的某些读取操作问题。此策略在一系列级别上起作用。首先,将内存表中的数据刷新到第一级(L0)的SSTables中。LCS压缩将这些第一个SSTable与级别L1中的较大SSTable合并。

分级压缩-添加SSTables

Cassandra 数据如何维护_第3张图片

 

 

级别大于L1的SSTable合并为大小大于或等于sstable_size_in_mb(默认值:160 MB)的SSTable 如果L1 SSTable存储的分区的数据大于L2,则LCS会将SSTable从L2移到下一级。

多次插入后进行均匀压实

Cassandra 数据如何维护_第4张图片

 

 

在L0以上的每个级别中,LCS都会创建大小大致相同的SSTable。每个级别的大小是最后一个级别的10倍,因此级别L1的SSTable是L0的10倍,级别L2的大小是L0的100倍。如果压缩的结果在级别L1中超过10个SSTable,则多余的SSTable将移动到级别L2。
注意:请记住,使用LCS时的最大开销是N-1个级别的总和。例如,给定最大表大小为160兆字节,一旦超过第3级,开销需求将从第4级的1.7 TB急剧增加到第5级的17 TB:
L0 1 * 160 MB = 160 MB
L1 10 * 160 MB = 1600 MB
L2 100 * 160 MB = 16000 + 1600 = 17 GB
L3 1000 * 160 MB = 160000 + 1600 + 16000 = 177 GB
L4 10000 * 160 MB = 1600000 + 1600 + 16000 + 160000 = 1.7 TB
L5 100000 * 160 MB = 16000000 + 1600 + 16000 + 160000 + 1600000 = 17 TB
要缓解这种情况,请切换到STCS并添加其他节点或使用sstablesplit减小sstable的大小

LCS压缩过程可确保以L1开头的每个级别内的SSTable具有不重叠的数据。对于许多读取,此过程使数据库仅从一个或两个SSTable中检索所有必需的数据。实际上,一个SSTable可以满足所有读取的90%。但是,由于LCS不会压缩L0表,因此涉及许多L0 SSTable的资源密集型读取仍可能发生。

在超过L0的级别上,LCS需要较少的磁盘空间来进行压缩:通常是SSTable固定大小的10倍。淘汰旧数据的频率更高,因此删除的数据使用磁盘上SSTables的较小部分。但是,LCS压缩操作会更频繁地发生,并给节点带来更多的I / O负担。对于写密集型工作负载,使用此策略的回报通常不值得I / O操作的性能损失。在许多情况下,对LCS配置表的测试表明写入和压缩时I / O饱和。

注意:使用LCS将新节点引导到群集中时,数据库会绕过压缩操作原始数据直接移动到正确的级别,因为不存在现有数据,因此每个级别都没有分区重叠。有关更多信息,请参阅 Apache Cassandra 2.2-级别压缩的自举性能改进博客。
TimeWindowCompactionStrategy(TWCS)
建议用于时间序列和 生存时间(TTL) 工作负载过期
  • 优点:非常适合时间序列数据,存储在对所有数据使用默认TTL的表中。比DateTieredCompactionStrategy(DTCS)的配置更简单,DateTieredCompactionStrategy(DTCS)的配置已被TWCS取代。
  • 缺点:如果需要不按顺序排列的时间数据,则不合适,因为SSTables无法很好地压缩。另外,由于没有限制,因此不适用于没有TTL工作负载的数据。与DTCS相比,微调配置的可能性更低。
TimeWindowCompactionStrategy(TWCS)与DTCS相似,但设置更简单。TWCS使用一系列时间窗口对SSTables进行分组。在压缩期间,TWCS在最近的时间窗口中将STCS应用于未压缩的SSTables。在时间窗口结束时,TWCS根据SSTable的最大时间戳将落入该时间窗口的所有SSTable压缩为一个SSTable。在完成时间窗口的主要压缩之后,将不再进行数据的进一步压缩,尽管在 compaction_window  阈值经过之后仍可以在sstables上执行逻辑删除该过程从下一个时间窗口中写入的SSTables开始。
注意:对于所有单元都应用了生存时间(TTL)的表,或者使用默认TTL的表,一旦所有TTL都通过,则该gc_grace_seconds期限到期,并且可删除逻辑删除比率为100%,则该sstable可以为没有压实就掉落了。
TimeWindowCompactionStrategy如何工作
Cassandra 数据如何维护_第5张图片

 

 

如图所示,从10 AM到11 AM,内存表从内存刷新到100MB SSTables中。使用STCS将这些SSTable压缩为更大的SSTable。在上午11点,所有这些SSTable被压缩为一个SSTable,并且不再由TWCS再次压缩。

在12 PM,使用STCS压缩在11 AM和12 PM之间创建的新SSTable,并在时间窗口结束时重复TWCS压缩。请注意,每个TWCS时间窗口包含不同数量的数据。

注意:有关动画的说明,请参阅DataStax Academy时间窗口压缩策略视频。需要有效的DataStax Academy帐户才能观看视频。

TWCS配置具有两个主要属性设置:

  • compaction_window_unit:用于定义窗口大小的时间单位(毫秒,秒,小时等)
  • compaction_window_size:每个窗口有多少个单位(1、2、3等)

对于上述示例中的配置: compaction_window_unit = ‘minutes’compaction_window_size = 60

DateTieredCompactionStrategy(DTCS)-已弃用

请改用TimeWindowCompactionStrategy(TWCS)

DateTieredCompactionStrategy(DTCS)与STCS类似。但是,DTCS不会根据SSTable的大小进行压缩,而是根据SSTable的年龄进行压缩。SSTable中的每一列在写入时都标记有时间戳。随着年龄的的SSTable的,DTCS使用的SSTable包含的任意列的最老的(最小)时间戳。

有关压缩的更多信息

以下博客文章和视频提供了已测试压缩策略的开发人员的更多信息:
  • 选择压缩策略
  • 何时使用平整压实
  • Apache Cassandra中的分层压缩
  • 使用TimeWindowCompactionStrategy处理时间序列工作量
  • 在Cassandra中使用LCS时会延迟清除墓碑的原因

 

 

 

你可能感兴趣的:(Cassandra 数据如何维护)