我在 AWS 上的 Cassandra 2.2.0 中创建了一个结构简单的表:
CREATE TABLE data_cache (
cache_id text,
time timeuuid,
request_json_data text,
PRIMARY KEY (cache_id, time)
) WITH CLUSTERING ORDER BY (time DESC)
AND bloom_filter_fp_chance = 0.01
AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
AND comment = ''
AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}
AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND dclocal_read_repair_chance = 0.1
AND default_time_to_live = 3600
AND gc_grace_seconds = 86400
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.0
AND speculative_retry = '99.0PERCENTILE';
我在 AWS 上有 2 个数据中心 - eu 和 us-east。
我遇到的问题是表很快填满,以至于系统上没有更多的磁盘空间。当 READ 在 CQLSH 中变得不负责任时,截断表也是有问题的。
如您所见 - 我将默认 TTL 更改为 3600 秒(或 1 小时),并将 GC 宽限秒数更改为短于默认的 10 天。
目前,每个集群的数据现在为 101GB,系统变得无响应。如果我尝试一个简单的select count(*) from data_cache
方法,它会向我发送连接超时 - 尝试 3 次后,集群本身就会丢失。错误日志指出 java 内存不足。
我应该怎么做?我究竟做错了什么?
目前存在 TTL,因此数据不会破坏服务器,直到我们知道我们将使用缓存多长时间,因此为什么它只设置为 1 小时 - 但如果我们认为缓存应该构建 1 天 - 我们将扩展容量因此,但我们也需要从中读取,由于崩溃,我们无法这样做。