python cql 驱动程序 - cassandra.ReadTimeout -“操作超时 - 仅收到 1 个响应。”

Posted

技术标签:

【中文标题】python cql 驱动程序 - cassandra.ReadTimeout -“操作超时 - 仅收到 1 个响应。”【英文标题】:python cql driver - cassandra.ReadTimeout - "Operation timed out - received only 1 responses." 【发布时间】:2014-05-30 19:00:58 【问题描述】:

我正在使用带有 python CQL 的 Cassandra 2.0。

我创建了一个列族如下:

CREATE KEYSPACE IF NOT EXISTS Identification
  WITH REPLICATION =  'class' : 'NetworkTopologyStrategy',
  'DC1' : 1 ;

USE Identification;

CREATE TABLE IF NOT EXISTS entitylookup (
  name varchar,
  value varchar,
  entity_id uuid,
  PRIMARY KEY ((name, value), entity_id))
WITH
    caching=all
;

然后我尝试计算此 CF 中的记录数,如下所示:

#!/usr/bin/env python
import argparse
import sys
import traceback
from cassandra import ConsistencyLevel
from cassandra.cluster import Cluster
from cassandra.query import SimpleStatement

def count(host, cf):    
    keyspace = "identification"
    cluster = Cluster([host], port=9042, control_connection_timeout=600000000)
    session = cluster.connect(keyspace)
    session.default_timeout=600000000

    st = SimpleStatement("SELECT count(*) FROM %s" % cf, consistency_level=ConsistencyLevel.ALL)
    for row in session.execute(st, timeout=600000000):
        print "count for cf %s = %s " % (cf, str(row))
    dump_pool.close()
    dump_pool.join()

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-cf", "--column-family", default="entitylookup", help="Column Family to query")
    parser.add_argument("-H", "--host", default="localhost", help="Cassandra host")    
    args = parser.parse_args()

    count(args.host, args.column_family)

    print "fim"

计数对我来说没什么用,它只是一个需要很长时间才能完成的操作的测试。

虽然我已将超时定义为 600000000 秒,但在不到 30 秒后,我收到以下错误:

./count_entity_lookup.py  -H localhost -cf entitylookup 
    Traceback (most recent call last):
      File "./count_entity_lookup.py", line 27, in <module>
        count(args.host, args.column_family)
      File "./count_entity_lookup.py", line 16, in count
        for row in session.execute(st, timeout=None):
      File "/home/mvalle/pyenv0/local/lib/python2.7/site-packages/cassandra/cluster.py", line 1026, in execute
        result = future.result(timeout)
      File "/home/mvalle/pyenv0/local/lib/python2.7/site-packages/cassandra/cluster.py", line 2300, in result
        raise self._final_exception
    cassandra.ReadTimeout: code=1200 [Timeout during read request] message="Operation timed out - received only 1 responses." info='received_responses': 1, 'data_retrieved': True, 'required_responses': 2, 'consistency': 5

似乎只是在复制品中找到了答案,但这对我来说真的没有意义。 cassandra 不应该能够查询它吗?

在下图中,可以看到对集群的请求量非常低,延迟也非常低。我不确定为什么会这样。

【问题讨论】:

这个集群要运行多少个节点?根据您的描述,它听起来只是一个节点,因此不清楚为什么读取操作会期望 2 个响应。如果您有一个 2 节点集群,其中只有一个处于联机状态,那么这些结果是预期的。 我在这个集群中有两个节点,RF=2,读写一致性级别都是ALL——两个节点都在线 你找到解决方案了吗? 关于超时,我发现更改cassandra服务器文件的超时会有效。可以指定客户端超时,但不会覆盖服务器中的配置。 关于缓慢本身,它与对 Cassandra 的请求的大小有关。存储在列族中的数据太大,导致延迟。 【参考方案1】:

来自回复:

received_responses': 1, 'data_retrieved': True, 'required_responses': 2

当查询要求一致性==全部时,数据仅在一个节点上可用。 Cassandra 无法满足该请求并超时。

如果要求所有节点都有数据,您可以将写入一致性更改为“ALL”。

这将确保所有读取请求都可以在没有一致性的情况下得到满足==ALL,因为这将由它自己的写入请求来满足,尽管如果节点离线,写入可能会失败。

请参阅documentation,了解每个一致性级别的含义。

LOCAL_QUORUM 用于确保在 DC 内联系到与复制因子有关的大多数节点。

【讨论】:

如果 DC 的复制因子为 1,为什么 required_responses 为 2? ALL 表示全部 :) 当一致性设置为全部时,复制因子无关紧要,这意味着需要联系所有节点。也许您打算使用QUORUM 联系大多数节点以了解复制因子。 所有包含数据的节点——也就是复制因子。如果您的集群中有 1000 个节点且复制因子为 3,则应联系 3 个节点以确保一致性 ALL,而不是 1000 个。 所有 DC 中的所有节点,是的。另一个 DC 中的另一个节点是否有密钥? all 会抓住它。 根据 Cassandra 的说法,集群中有另一个节点有数据。查询需要ALL,一个节点无法响应,查询失败。该节点在哪里,不知道。

以上是关于python cql 驱动程序 - cassandra.ReadTimeout -“操作超时 - 仅收到 1 个响应。”的主要内容,如果未能解决你的问题,请参考以下文章

cassandra安装配置

python cql 驱动程序 - cassandra.ReadTimeout -“操作超时 - 仅收到 1 个响应。”

我们可以编写 SQL 查询而不是 CQL 吗?

在 JAVA 中执行 cql shell 文件或命令

如何使用 cql 对宽行进行数据建模

我无法使 CQL 参数 IN 工作