Cassandra cqlsh shell 上的协调器节点超时

Posted

技术标签:

【中文标题】Cassandra cqlsh shell 上的协调器节点超时【英文标题】:Coordinator node timed out on Cassandra cqlsh shell 【发布时间】:2017-08-21 10:07:10 【问题描述】:

我是 cassandra 的新手,正在尝试在两台 Mac 机器上进行多节点设置。它不是datastax casandra。 比如我的IP是10.100.1.12,其他机器IP是10.100.1.15。我在这台机器上的 cassandra.yaml 文件中更改了以下属性:

10.100.1.15:

种子:“127.0.0.1,10.100.1.12,10.100.1.15” listen_address: 10.100.1.15 rpc_address: 10.100.1.15 endpoint_snitch:GossipingPropertyFileSnitch

10.100.1.12:

种子:“127.0.0.1,10.100.1.12,10.100.1.15”

listen_address:10.100.1.12

rpc_address:10.100.1.12

endpoint_snitch:GossipingPropertyFileSnitch

cassandra 运行良好 cqlsh 也使用命令打开 bin/cqlsh 10.100.1.12

但是当我试图检索表的数量时,它会向我显示错误:

ReadTimeout:来自服务器的错误:code=1200 [协调节点超时等待副本节点的响应] message="操作超时 - 仅收到 0 个响应。" info='received_responses': 0, 'required_responses': 1, '一致性': 'ONE'

我尝试将 read_request_timeout_in_ms 属性从 5000 更改为 20000,但我仍然遇到相同的错误。谁能帮助我做错了什么?

表架构如下:

cqlsh:app_auditor> describe table traffic_data;

CREATE TABLE app_auditor.traffic_data (
    current_time bigint PRIMARY KEY,
    appid bigint,
    attributes map<text, text>,
    device bigint,
    flow_type text,
    message_time bigint
) WITH 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 crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    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 = '99PERCENTILE';

我使用的计数查询是 从 traffic_data 中选择 count(*);

【问题讨论】:

您绝对不希望 127.0.0.1 在您的种子列表中。只有 2 个监听地址。当两个节点都启动并运行时,nodetool ring 的结果是什么? 可以执行普通查询吗? 我可以执行描述查询,例如描述键空间和表。 nodetool 状态如下:Datacenter: datacenter1 ======================= Status=Up/Down |/ State=Normal/Leaving/Joining/Moving --地址加载令牌拥有主机 ID 机架 UN 10.100.1.12 472.14 KiB 256 ? 2c09d826-387a-49d6-a99a-c538fcb159cb rack1 UN 10.100.1.15 887.97 KiB 256 ? b945b293-2f54-4440-afa0-d0536bed3230 rack1 显示您的表架构和查询。我认为这是因为您的计数查询 【参考方案1】:

在 Cassandra 中,count(*) 非常昂贵,cassandra 需要扫描所有节点的所有行才能给你计数,这就是它给你超时异常的原因。

而不是使用 count(*) 维护一个计数器表,如下所示:

CREATE TABLE traffic_counter (
    type int PRIMARY KEY,
    traffic_count counter
);

当一个数据插入到traffic_data数据中时,增加traffic_count的值

UPDATE traffic_counter SET traffic_count = traffic_count + 1 WHERE type = 0;

现在您可以非常有效地选择流量计数。

SELECT traffic_count FROM traffic_counter WHERE type = 0;

【讨论】:

我在创建语句中也遇到了同样的错误。即使我从表 traffic_data 限制 1 中选择 *,它也显示相同的错误。我只显示一条记录。 属性数据量大吗? 现在表格是空的。它应该获取 0 个计数。 从你的种子中删除 127.0.0.1,然后重启 Cassandra 我也这样做了。但我想它给我必须用于我的项目的表带来了问题。对于其他虚拟和测试表,它工作正常。不确定是什么问题

以上是关于Cassandra cqlsh shell 上的协调器节点超时的主要内容,如果未能解决你的问题,请参考以下文章

COPY FROM CSV 上的 Cassandra CQLSH TEXT 字段限制(字段大于字段限制 (131072))

Cassandra 数据库, python cqlsh命令

Cassandra - 在 CQLSH 中发出的每个命令都会引发错误

无法登录到Google云平台中托管的3个节点的Cassandra集群中的cqlsh

Cassandra - 无法通过cqlsh连接

cassandra 鉴权