Was this page helpful?
Caution
You're viewing documentation for an unstable version of ScyllaDB Manual. Switch to the latest stable version.
Compaction¶
This document describes the compaction strategy options available when creating a table. For more information about creating a table in ScyllaDB, refer to the CQL Reference.
By default, ScyllaDB starts a compaction task whenever a new SSTable is written. Compaction merges several SSTables into a new SSTable, which contains only the live data from the input SSTables. Merging several sorted files to get a sorted result is an efficient process, and this is the main reason why SSTables are kept sorted.
Note that SStables created by node operations, such as bootstrap, repair, or replace,
are kept in a temporary data set and may undergo off-strategy compaction while the node operation is in progress or after it is completed.
See Off-strategy Compaction for details.
To reduce read, write, and space amplification, you should choose an appropriate compaction strategy. If you are unsure which strategy to use or need general information on the compaction strategies available in ScyllaDB, refer to Compaction Strategies.
The following compaction strategies are supported by Scylla:
Incremental Compaction Strategy (ICS) - the default strategy
Leveled Compaction Strategy (LCS)
Time-window Compaction Strategy (TWCS)
Size-tiered Compaction Strategy (STCS) - deprecated, an alias of ICS
This page concentrates on the parameters to use when creating a table with a compaction strategy. If you are unsure which strategy to use or want general information on the compaction strategies which are available to ScyllaDB, refer to Compaction Strategies.
Common options¶
The following options are available for all compaction strategies.
compaction = {
'class' : 'compaction_strategy_name',
'enabled' : (true | false),
'tombstone_threshold' : ratio,
'tombstone_compaction_interval' : sec,
'unchecked_tombstone_compaction' : (true | false)}
class(default: IncrementalCompactionStrategy)Selects the compaction strategy.
It can be one of the following. If you are unsure which one to choose, refer to Compaction Strategies :
IncrementalCompactionStrategy
LeveledCompactionStrategy
TimeWindowCompactionStrategy
SizeTieredCompactionStrategy - deprecated, an alias of IncrementalCompactionStrategy
enabled(default: true)Runs background compaction (known as “minor compaction”). Can be one of the following:
true - runs minor compaction
false - disable minor compaction
tombstone_threshold(default: 0.2)The ratio (expressed as a decimal) of garbage-collectable tombstones compared to the data. When this threshold is exceeded on a specific table, a single SSTable compaction begins. Acceptable values are numbers in the range 0 -1.
tombstone_compaction_interval(default: 86400s (1 day))tombstone_compaction_interval is lower-bound for when a new tombstone compaction can start. If an SSTable was compacted at a time X, the earliest time it will be considered for tombstone compaction again is X + tombstone_compaction_interval. This does not guarantee that sstables will be considered for compaction immediately after tombstone_compaction_interval time has elapsed after the last compaction.
unchecked_tombstone_compaction(default: false)If unchecked_tombstone_compaction is set to true, tombstone_threshold will be ignored, and an SSTable will be compacted according to tombstone_compaction_interval.
Leveled Compaction Strategy (LCS)¶
The compaction class LeveledCompactionStrategy (LCS) creates SSTables of a fixed, relatively small size (160 MB by default) that are grouped into levels. Within each level, SSTables are guaranteed to be non-overlapping. Each level (L0, L1, L2 and so on) is ten times as large as the previous level.
LCS options¶
compaction = {
'class' : 'LeveledCompactionStrategy',
'sstable_size_in_mb' : int}
sstable_size_in_mb(default: 160)This is the target size in megabytes, that will be used as the goal for an SSTable size following a compression. Although SSTable sizes should be less or equal to sstable_size_in_mb, it is possible that compaction could produce a larger SSTable during compaction. This occurs when data for a given partition key is exceptionally large.
Incremental Compaction Strategy (ICS)¶
When using ICS, SSTable runs are put in different buckets depending on their size.
When an SSTable run is bucketed, the average size of the runs in the bucket is compared to the new run, as well as the bucket_high and bucket_low levels.
The database compares each SSTable-run size to the average of all SSTable-run sizes on all buckets in the node.
It calculates bucket_low * avg_bucket_size and bucket_high * avg_bucket_size and then compares the result with the average SSTable-run size.
The conditions set for bucket_high and bucket_low dictate if successive runs will be added to the same bucket.
When compaction begins it merges SSTable runs whose size in KB are within [average-size * bucket_low] and [average-size * bucket_high].
Once there are multiple runs in a bucket, minor compaction begins.
The minimum number of SSTable runs that triggers minor compaction is either 2 or min_threshold, if the compaction_enforce_min_threshold
configuration option is set in the scylla.yaml configuration file.
ICS options¶
The following options only apply to IncrementalCompactionStrategy:
compaction = {
'class' : 'IncrementalCompactionStrategy',
'bucket_high' : factor,
'bucket_low' : factor,
'min_sstable_size' : int,
'min_sstable_age' : sec,
'min_threshold' : num_sstables,
'max_threshold' : num_sstables,
'sstable_size_in_mb' : int,
'space_amplification_goal' : double}
bucket_high(default: 1.4142)A new SSTable is added to the bucket if the SSTable size is less than bucket_high * the average size of that bucket (and if the bucket_low condition also holds). For example, if ‘bucket_high = 1.4142’ and the SSTable size = 14MB, does the SSTable belong to a bucket with an average size of 10MB? Yes, because the SSTable size = 14, which is less than ‘bucket_high’ * average bucket size = 14.142. So, the SSTable will be added to the bucket, and the bucket’s average size will be recalculated.
bucket_low(default: 0.7071)A new SSTable is added to the bucket if the SSTable size is more than bucket_low * the average size of that bucket (and if the bucket_high condition also holds). For example, if ‘bucket_low = 0.7071’ and the SSTable size is 10MB, does the SSTable belong to a bucket with an average size of 15MB? No, because the SSTable size = 10, which is less than ‘bucket_low’ * average bucket size = 10.607. So, the SSTable will not be added to the bucket.
min_sstable_size(default: 50)All SSTables smaller than this number of megabytes are eligible to be put into the same bucket, provided they are at least
min_sstable_ageold.Unlike Apache Cassandra, scylla uses uncompressed size when bucketing similar-sized tiers together. Since compaction works on uncompressed data, SSTables containing similar amounts of data should be compacted together, even when they have different compression ratios.
min_sstable_age(default: 3600)The minimum age, in seconds, an SSTable must have before it is eligible to be put into the same bucket as other SSTables smaller than
min_sstable_size. SSTables smaller thanmin_sstable_sizethat were written more recently than this are kept in their own size tier, so that similarly sized SSTables are compacted together while they are still being actively written, avoiding excessive write amplification.
min_threshold(default: 4)Minimum number of SSTable runs that need to belong to the same size bucket before compaction is triggered on that bucket.
Note
Enforcement of
min_thresholdis controlled by thecompaction_enforce_min_thresholdconfiguration option in the scylla.yaml configuration settings. By default,compaction_enforce_min_threshold=false, meaning the Incremental Compaction Strategy will compact any bucket containing 2 or more SSTable runs. Otherwise, ifcompaction_enforce_min_threshold=true, the value ofmin_thresholdis considered and only those buckets that contain at leastmin_thresholdSSTable runs will be compacted.
max_threshold(default: 32)Maximum number of SSTables that will be compacted together in one compaction step.
sstable_size_in_mb(default: 1000)This is the target size in megabytes, that will be used as the goal for an SSTable size (fragment size) following a compression.
space_amplification_goal (default: null)
Added in version 2020.1.6.
This is a threshold of the ratio of the sum of the sizes of the two largest tiers to the size of the largest tier, above which ICS will automatically compact the second largest and largest tiers together to eliminate stale data that may have been overwritten, expired, or deleted. The space_amplification_goal is given as a double-precision floating point number that must be greater than 1.0.
For example, if ‘space_amplification_goal = 1.25’ and the largest tier holds 1000GB, when the second-largest tier accumulates SSTables with the total size of 250GB or more, the
space_amplification_goalthreshold is crossed and all the SSTables in the largest and second-largest tiers will be compacted together.
Time Window CompactionStrategy (TWCS)¶
The basic concept is that TimeWindowCompactionStrategy will create 1 SSTable per file for a given time window.
Caution
We strongly recommend using a single TTL value for any given table.
This means sticking to the default time to live as specified in the table’s schema.
Using multiple TTL values for a given table may lead to inefficiency when purging expired data, because an SSTable will remain until all of its data is expired.
Tombstone compaction can be enabled to remove data from partially expired SSTables, but this creates additional WA (write amplification).
Caution
Avoid overwriting data and deleting data explicitly at all costs, as this can potentially block an expired SSTable from being purged, due to the checks that are performed to avoid data resurrection.
TWCS options¶
compaction = {
'class' : 'TimeWindowCompactionStrategy',
'compaction_window_unit' : string,
'compaction_window_size' : int,
'expired_sstable_check_frequency_seconds' : int,
'min_threshold' : num_sstables,
'max_threshold' : num_sstables}
compaction_window_unit(default: DAYS)A time unit used to determine the window size which can be one of the following:
'MINUTES''HOURS''DAYS'
compaction_window_size(default: 1)The number of units which will make up a window.
expired_sstable_check_frequency_seconds(default: 600)Specifies (in seconds) how often ScyllaDB will check for fully expired SSTables, which can be immediately dropped.
min_threshold(default: 4)Minimum number of SSTables that need to belong to the same size bucket before compaction is triggered on that bucket.
max_threshold(default: 32)Maximum number of SSTables that will be compacted together in one compaction step.
Size Tiered Compaction Strategy (STCS)¶
Note
Size Tiered Compaction Strategy is deprecated. SizeTieredCompactionStrategy
is an alias of Incremental Compaction Strategy (ICS): a table configured
with SizeTieredCompactionStrategy is compacted by ICS.
Naming it in CREATE TABLE, ALTER TABLE, CREATE MATERIALIZED VIEW
or ALTER MATERIALIZED VIEW is still accepted, so that existing
applications and schema dumps keep working, but returns a CQL warning.
Set the allow_deprecated_size_tiered_compaction_strategy configuration
option to false to make it an error instead. That option defaults to
true for backward compatibility, and will default to false in a
future version.
STCS options¶
Since SizeTieredCompactionStrategy is an alias of
IncrementalCompactionStrategy, it takes the same options, with the same
defaults. See ICS options.
The one exception is the cold_reads_to_omit option, which ICS does not have.
It is accepted, and ignored.
See Also¶
Copyright
© 2016, The Apache Software Foundation.
Apache®, Apache Cassandra®, Cassandra®, the Apache feather logo and the Apache Cassandra® Eye logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries. No endorsement by The Apache Software Foundation is implied by the use of these marks.