where子句中的特定值导致cassandra中的OperationTimedOut错误

时间:2016-03-03 08:52:49

标签: cassandra

我在cassandra集群中运行查询,在cqlsh中有5个节点。它给了我OperationTimedOut错误。如果我在where子句参数中稍作修改,它会给我空结果。这是预期的。即使我更改了参数的单个字符,但完全相同的参数值让我有时间,也没关系。为什么会这样?

查询:

select * from table where pid = '5f334fef-2629-484c-a081-c4a6f554c6ab'

这是表格架构

CREATE TABLE dmp.interest_data (
    pid text,
    attribute text,
    country text,
    day_count int,
    first_seen timestamp,
    flag int,
    keys set<text>,
    last_seen timestamp,
    score int,
    usage_count int,
    PRIMARY KEY (pid, attribute)
) WITH CLUSTERING ORDER BY (attribute ASC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
    AND comment = ''
    AND compaction = {'min_threshold': '4', 'class': 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy', 'max_threshold': '32'}
    AND compression = {'chunk_length_kb': '256', 'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 172800
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.1
    AND speculative_retry = '99.0PERCENTILE';
CREATE INDEX interest_data_attribute_idx ON dmp.interest_data (attribute);
CREATE INDEX interest_data_country_idx ON dmp.interest_data (country);
CREATE INDEX interest_data_day_count_idx ON dmp.interest_data (day_count);
CREATE INDEX interest_data_first_seen_idx ON dmp.interest_data (first_seen);
CREATE INDEX interest_data_usage_count_idx ON dmp.interest_data (usage_count);

更新: where子句中提到的pid的值应该在表中,因为它插入了一个没有给出任何错误的查询。但是在查询时会发生此超时。现在奇怪的事发生了。我试着删除它,它被删除了!因为删除后我尝试选择相同,我得到空的结果。所以它确实存在于某种被破坏的形式导致超时。现在我需要知道这样的事情会发生什么

2 个答案:

答案 0 :(得分:1)

检查节点的状态,更改您查询的值会更改拥有该值的节点,因此很可能您的一个节点出现问题,超出的值由该节点拥有。当您更改该值时,新值将由不同的节点拥有,因此它不会超时。

答案 1 :(得分:0)

Re:关于删除成功和损坏问题的更新。

当您使用一致性级别1(如注释中所述)查询和插入时,这肯定会发生。假设密钥空间中的复制因子大于1(通常为3)。 可能是插入过程中某个节点或两个节点出现故障/有时(集群负载,维护问题等) - 复制没有完成任务&数据不是&# 39; t复制到复制的节点。

发生这种情况时,只有修复操作(或根本没有任何操作)可以帮助解决问题。

结果是有1-2个服务器应该持有该行,但实际上没有它,这可能会导致各种奇怪的故障情况。

我没有对超时有一个很好的解释,除非该行有很多列而且它没有完成&#34;及时&#34;

如果再次发生这种情况,请尝试使用limit子句(从1开始,如果可行的话,它可能是一个非常长的查询并且自然会超时。