Cassandra Table 时间序列压缩
Cassandra Table Compaction for timeseries
我的程序生成大量时间序列数据,如下table:
CREATE TABLE AccountData
(
PartitionKey text,
RowKey text,
AccountId uuid,
UnitId uuid,
ContractId uuid,
Id uuid,
LocationId uuid,
ValuesJson text,
PRIMARY KEY (PartitionKey, RowKey)
)
WITH CLUSTERING ORDER BY (RowKey ASC)
PartitionKey 是字典值(10 之一),RowKey DateTime
转换为 long
。
现在由于程序生成的数据量惊人,每个 ContractId
在代码中都有不同的保留策略。代码根据特定 ContractId
.
的保留删除旧数据
我现在 运行 遇到了问题,在 SELECT 语句中它拾取了太多墓碑,我得到了一个错误。
我应该使用什么 Table 压缩策略来解决这个 Tombstone 问题?
PartitionKey is a dictionary value (one of 10)
我认为这可能是您的问题。基本上,集群中的所有数据都在 10 个分区上结束。随着时间的推移,这些将变得非常大。通常,您希望将分区大小保持在 1MB 到 10MB 之间。越低越好
我建议拆分分区。如果它与时间相关,请采用对您的查询模式最有意义的时间单位。例如,如果大多数查询都是基于月份的,那么这样的方法可能会起作用:
PRIMARY KEY ((month,PartitionKey),RowKey)
这将为 month
和当前 PartitionKey
的每个组合创建一个分区。
同样,大多数 时间序列用例倾向于更频繁地查询最新数据。为此,按 descending
顺序按时间对分区中的数据进行排序通常是有意义的。当然,如果 RowKey
确实是一个 data/time 值。
WITH CLUSTERING ORDER BY (RowKey DESC)
此外,此模型的一个不错的小副作用是,任何被逻辑删除的旧数据现在都位于分区的“底部”。因此,根据删除模式,逻辑删除仍然存在。但是,如果数据按降序聚集...墓碑被 never/rarely 查询。
What Table Compaction strategy should I use to solve this Tombstone problem?
所以我不认为简单地改变压缩策略是解决这个问题的灵丹妙药。话虽这么说,我建议查看 TimeWindowCompactionStrategy。该压缩策略按指定时间段 ([=35=]) 存储其 SSTable 文件。这可以防止查询充满旧数据、过时数据或逻辑删除数据的文件。
我的程序生成大量时间序列数据,如下table:
CREATE TABLE AccountData
(
PartitionKey text,
RowKey text,
AccountId uuid,
UnitId uuid,
ContractId uuid,
Id uuid,
LocationId uuid,
ValuesJson text,
PRIMARY KEY (PartitionKey, RowKey)
)
WITH CLUSTERING ORDER BY (RowKey ASC)
PartitionKey 是字典值(10 之一),RowKey DateTime
转换为 long
。
现在由于程序生成的数据量惊人,每个 ContractId
在代码中都有不同的保留策略。代码根据特定 ContractId
.
我现在 运行 遇到了问题,在 SELECT 语句中它拾取了太多墓碑,我得到了一个错误。
我应该使用什么 Table 压缩策略来解决这个 Tombstone 问题?
PartitionKey is a dictionary value (one of 10)
我认为这可能是您的问题。基本上,集群中的所有数据都在 10 个分区上结束。随着时间的推移,这些将变得非常大。通常,您希望将分区大小保持在 1MB 到 10MB 之间。越低越好
我建议拆分分区。如果它与时间相关,请采用对您的查询模式最有意义的时间单位。例如,如果大多数查询都是基于月份的,那么这样的方法可能会起作用:
PRIMARY KEY ((month,PartitionKey),RowKey)
这将为 month
和当前 PartitionKey
的每个组合创建一个分区。
同样,大多数 时间序列用例倾向于更频繁地查询最新数据。为此,按 descending
顺序按时间对分区中的数据进行排序通常是有意义的。当然,如果 RowKey
确实是一个 data/time 值。
WITH CLUSTERING ORDER BY (RowKey DESC)
此外,此模型的一个不错的小副作用是,任何被逻辑删除的旧数据现在都位于分区的“底部”。因此,根据删除模式,逻辑删除仍然存在。但是,如果数据按降序聚集...墓碑被 never/rarely 查询。
What Table Compaction strategy should I use to solve this Tombstone problem?
所以我不认为简单地改变压缩策略是解决这个问题的灵丹妙药。话虽这么说,我建议查看 TimeWindowCompactionStrategy。该压缩策略按指定时间段 ([=35=]) 存储其 SSTable 文件。这可以防止查询充满旧数据、过时数据或逻辑删除数据的文件。