【问题标题】:Operation Timed out while counting the number of rows计算行数时操作超时
【发布时间】:2018-01-03 22:28:26
【问题描述】:

我在 2 个数据中心中有 3 个节点。在每个节点上,我都使用相同的 cqlshrc 文件,其中只有以下几行:

[connection] 
request_timeout = 3600

复制策略如下:

class:NetworkTopologyStrategy, 'dc1' :2, 'dc2':1

我在数据库中插入了超过 100 000 行。但是,当我执行 select count(*) from table,我在 3 个节点中的 2 个节点中得到“操作超时”。即查询在一个节点中成功。

为什么尽管每个节点都有相同的 cqlshrc 文件,但在 3 个节点中的 2 个节点中查询不成功?

  • 操作系统:RHEL 6
  • 卡桑德拉:3.0.14

【问题讨论】:

  • 您是否检查了引发超时的节点的日志文件?
  • 我只能在日志中看到一个警告:“未使用分区键的聚合查询”。除此之外,我什么也不懂
  • 您的数据是如何分布的?它在哪些节点上失败?他们在同一个直流电吗?
  • 我总共有 3 个节点和 2 个数据中心。命令成功的节点(节点 1)与另一个节点(节点 2)在 dc 1 中。节点 3 在 dc 2 中。在节点 2 和节点 3 上,命令都不成功。在 dc1: 2 和 dc2: 1 中复制的网络拓扑策略

标签: cassandra cassandra-3.0


【解决方案1】:

在 cassandra 中count(*) 是一个非常昂贵的操作,需要扫描所有节点的所有行只是为了给你计数并且会产生超时异常。

所以不要使用count(*) 维护一个计数器表,例如:

CREATE TABLE page_view_counts (
    counter_value counter,
    url_name varchar,
    page_name varchar,
    PRIMARY KEY (url_name, page_name)
);

每当插入基表的新行将计数加一时

UPDATE page_view_counts
   SET counter_value = counter_value + 1
   WHERE url_name = 'stackoverflow.com' AND page_name = 'questions';

现在要获得计数,请尝试如下所示

SELECT * FROM page_view_counts 
   WHERE url_name = 'stackoverflow.com' AND page_name = 'questions';

【讨论】:

  • 但我不明白为什么查询每次在 3 个节点之一上都能正常工作,而在另外两个节点上却失败了,尽管每个节点都有相同的 cqlshrc 文件。似乎在其他 2 个节点上,cqlshrc 文件中给出的配置没有影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 2021-09-09
  • 2016-11-08
  • 2013-07-14
  • 2015-05-26
相关资源
最近更新 更多