我正在使用 cassandra 2.0,并且我创建了一个如下所示的列族:
CREATE TABLE user_id_timestamp_index (
user_id int,
timestamp text,
PRIMARY KEY (user_id, timestamp)
) WITH
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.000000 AND
gc_grace_seconds=864000 AND
index_interval=128 AND
read_repair_chance=0.100000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
default_time_to_live=0 AND
speculative_retry='NONE' AND
memtable_flush_period_in_ms=0 AND
compaction={'class': 'LeveledCompactionStrategy'} AND
compression={'sstable_compression': 'LZ4Compressor'};
我已经向该表写入了超过 200 万行,没有任何问题,并且我还执行了许多删除操作。
在快速连续删除大约 10k 次左右后出现问题,并且我开始遇到大量 rpc_timeouts。在此期间,通过 cqlsh 进行的简单“从 user_id_timestamp_index 中删除 user_id = 5 AND timestamp = '12345'”失败。
我注意到并尝试过的事情:
- 在 rpc 超时期间,2 个节点(共 5 个)上的平均负载飙升至约 50。
- 在这些负载密集型写入和删除期间,几乎每 5 分钟进行一次压缩。
- 在 rpc_timeouts 期间,tpstats 显示待处理的突变阶段:MutationStage 64(活动)395(待处理)48182373(完成)0 0
- 当此 CF 的 memtable 数据大小超过 3 mb 时,往往会发生超时。
- 在我执行 nodetool 刷新后,待处理的突变变为零并且 rpc 时间消失,直到 memtable 大小再次爬升到超过 3 mb。
我的问题是,有我可以调整的配置吗?例如,是否可以简单地每 5 分钟在该列族上强制执行一次 memtable 刷新?减轻此表的写入负载?一种加快写入速度并减少待处理阶段的方法?还是有更好的解决方案?