Cassandra在使用一致性LOCAL_ONE进行读取查询时发生失败(需要1个响应,但只有0个副本响应,其中1个失败)。

9

以下是我的脚本

CREATE TABLE alrashed.tbl_alerts_details (
    alert_id int,
    action_required int,
    alert_agent_id int,
    alert_agent_type_id int,
    alert_agent_type_name text,
    alert_definer_desc text,
    alert_definer_name text,
    alert_source text,
    alert_state text,
    col_1 text,
    col_2 text,
    col_3 text,
    col_4 text,
    col_5 text,
    current_escalation_level text,
    date_part date,
    device_id text,
    driver map<text, text>,
    is_processed int,
    is_real_time int,
    location map<text, text>,
    seq_no int,
    severity text,
    time_stamp timestamp,
    transporter map<text, text>,
    transporter_name text,
    trip_id int,
    updated_on timestamp,
    vehicle map<text, text>,
    vehicle_type_name text,
    PRIMARY KEY (alert_id)
    ) WITH read_repair_chance = 0.0
    AND dclocal_read_repair_chance = 0.1
    AND gc_grace_seconds = 864000
    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', 'max_threshold' : 32, 'min_threshold' : 4 }
    AND compression = { 'chunk_length_in_kb' : 64, 'class' : 'org.apache.cassandra.io.compress.LZ4Compressor' }
    AND default_time_to_live = 0
    AND speculative_retry = '99PERCENTILE'
    AND min_index_interval = 128
    AND max_index_interval = 2048
    AND crc_check_chance = 1.0;  

当我运行这个查询时,我得到了以下错误:

Cassandra在一致性LOCAL_ONE(需要1个响应,但只有0个副本响应,1个失败)的读取查询期间发生故障

这是我的Java Cassandra查询:

select
  count( * )
from
  tbl_alerts_details
where
  alert_state = 'ACKNOWLEDGE'
  and date_part >= '2017-10-01'
  and date_part <= '2017-10-31'
  and is_real_time = 1
  and alert_agent_type_name = 'VEHICLE' ALLOW FILTERING

1
请您检查Cassandra日志,看看是否有任何错误。例如,如果它有类似于以下内容的东西:https://groups.google.com/a/lists.datastax.com/d/msg/spark-connector-user/ZKyACqzoBw4/32UIoxyVFgAJ - Simon Fontana Oscarsson
1
我检查了Cassandra日志,它显示在查询'SELECT * FROM alrashed.tbl_alerts_details WHERE alert_state = ACKNOWLEDGE AND date_part >= 2017-08-01 AND LIMIT 5000'期间扫描了超过100001个墓碑(最后扫描的行分区键为(185587));查询被中止。 - Prasanna Wani
1
这是很多墓碑。你应该重新考虑你的数据模型。如果它适合你的用例,可以降低表上的gc_grace_seconds(但你必须理解这意味着什么,否则对你来说可能会非常糟糕,删除后数据可能会重新出现)。 如果你是Cassandra的新手,我可以指向一些很棒的学习资源。 - Simon Fontana Oscarsson
1个回答

5

这个错误让我们意识到了一个空间问题,将图片存储在每一行的Base64中很快就会引起Tombstone问题。

根据这篇文章所述,

Cassandra不仅会扫描行,而且还必须在准备响应时将它们累积在内存中。如果情况变得太糟糕,这可能会在节点上导致内存不足错误,并且如果多个节点正在处理请求,则甚至可能导致多个失败并使整个集群崩溃。为了防止这种情况发生,如果检测到危险的tombstones数量,服务会中止查询。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接