我一直在测试Cassandra来存储观察结果。 所有"事物"属于一个或多个报告组:
CREATE TABLE observations (
group_id int,
actual_time timestamp, /* 1 second granularity */
is_something int, /* 0/1 bool */
thing_id int,
data1 text, /* JSON encoded dict/hash */
data2 text, /* JSON encoded dict/hash */
PRIMARY KEY (group_id, actual_time, thing_id)
)
WITH compaction={'class': 'DateTieredCompactionStrategy',
'tombstone_threshold': '.01'}
AND gc_grace_seconds = 3600;
CREATE INDEX something_index ON observations (is_something);
所有插入都使用TTL完成,并且应在36小时后过期 " actual_time&#34 ;.我们无法控制的是重复的东西 观察结果发送给我们。一些观察结果近实际发送 时间,其他人延迟了几个小时。
" something_index"是一个实验,看看我们是否可以切片查询 在一个布尔属性上,而不必创建单独的表,和 似乎工作。
" DATA2"目前没有被写入 - 它的意思是由 与写入" data1"不同的过程,但会给出相同的过程 TTL(基于" actual_time")。
情况:
三个节点(EC2 m3.xlarge) 2015年8月26日安装了Datastax ami-ada2b6c4(us-east-1) Cassandra 2.2.0
使用" cql"从Python程序插入模 (必须启用"节俭" RPC)
运行" nodetool repair -pr"在每个节点上每三个小时(交错)。
每小时插入1到4百万行。 我看到了大量的数据文件:
$ ls *Data* | wc -l
42150
$ ls | wc -l
337201
查询不会返回过期的条目, 但超过36小时的文件不会消失!
答案 0 :(得分:0)
大量的SSTable可能是由于您经常进行的维修造成的。修理通常只能每天运行一次或每周运行一次,因此我不确定为什么每三个小时运行一次维修。如果您担心缺少写入的短期停机时间,那么您可以将提示窗口设置为三小时,而不是经常运行修复。
您可以查看CASSANDRA-9644。这听起来像是在描述你的情况。 CASSANDRA-10253也可能是有意义的。
我不确定为什么你的TTL不会丢弃旧的SSTables。您是在整行插入或单个列更新上设置TTL吗?如果你在数据文件上运行sstable2json,我想你可以看到TTL值。
答案 1 :(得分:0)
完全披露:我与DTCS有爱/恨的关系。我在DTCS中管理一个包含数百TB数据的集群,其中一个非常可怕的事情就是任何类型的流媒体。出于这个原因,我建议替换它(https://issues.apache.org/jira/browse/CASSANDRA-9666)。
那说,它应该主要是工作。但是,有一些参数可以发挥作用,比如timestamp_resolution,如果设置不正确,可能会把事情搞砸。
您是否检查了sstable时间戳以确保它们与timestamp_resolution匹配(默认值:微秒)?