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

python cql驱动程序-cassandra.ReadTimeout-“0”;操作超时-仅收到1个响应。”;,python,cql3,cassandra-2.0,Python,Cql3,Cassandra 2.0,我将Cassandra2.0与python CQL一起使用 我创建了一个柱族,如下所示: CREATE KEYSPACE IF NOT EXISTS Identification WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'DC1' : 1 }; USE Identification; CREATE TABLE IF NOT EXISTS entitylookup ( name varchar, val

我将Cassandra2.0与python CQL一起使用

我创建了一个柱族,如下所示:

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
;
#!/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"
然后,我尝试按如下方式计算此CF中的记录数:

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
;
#!/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}
/count\u entity\u lookup.py-H localhost-cf entitylookup
回溯(最近一次呼叫最后一次):
文件“/count\u entity\u lookup.py”,第27行,在
计数(args.host、args.column\u系列)
文件“/count\u entity\u lookup.py”,第16行,在count中
对于session.execute(st,timeout=None)中的行:
文件“/home/mvalle/pyenv0/local/lib/python2.7/site packages/cassandra/cluster.py”,执行中的第1026行
结果=未来。结果(超时)
结果中的文件“/home/mvalle/pyenv0/local/lib/python2.7/site packages/cassandra/cluster.py”,第2300行
自我提升。\最终\例外
cassandra.ReadTimeout:code=1200[读取请求期间超时]message=“操作超时-仅收到1个响应。”info={'received_responses':1,'data_retrieved':True,'required_responses':2,'consistency':5}
答案似乎只是在一个复制品中找到的,但这对我来说真的没有意义。难道卡桑德拉就不能质疑它吗

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

从响应中:

received_responses': 1, 'data_retrieved': True, 'required_responses': 2
当查询要求一致性==全部时,数据仅在一个节点上可用。卡桑德拉无法满足该请求,因此超时

如果要求所有节点都具有数据,则可以将写入一致性更改为“全部”

这将确保在没有一致性的情况下满足所有读取请求==all,就像写入请求本身能够满足一样,尽管如果节点离线,写入可能会失败

有关每个一致性级别的含义的解释,请参见


LOCAL\u QUORUM
是用于确保在DC内联系大多数与复制因子相关的节点的方法。

此群集中要运行多少个节点?根据您的描述,它听起来像是一个单一的节点,所以不清楚为什么读取操作需要两个响应。如果您有一个2节点群集,其中只有一个处于联机状态,那么这些结果是可以预期的。我在这个群集中有两个节点,RF=2,写入和读取一致性级别都是-两个节点都处于联机状态。您是否找到过解决方案?关于超时,我发现在cassandra服务器文件上更改超时将是有效的。可以指定客户端超时,但它不会覆盖服务器中的配置。关于慢度本身,它与对Cassandra的请求大小有关。列族中存储的数据太大,这会导致延迟。如果DC的复制因子为1,为什么需要\u响应2?
ALL
means ALL:)当一致性设置为ALL时,复制因子并不重要,这意味着需要联系所有节点。也许您打算使用
QUORUM
联系大多数节点的复制因子。所有包含数据的节点-也称为复制因子。如果集群中有1000个节点的复制系数为3,则应联系3个节点以获得一致性—全部,而不是1000个。所有DC中的所有节点都是。另一个节点是否在另一个DC中并具有密钥
all
将捕获数据。根据Cassandra的说法,集群中还有另一个节点拥有数据。查询需要
所有
,一个节点无法响应,查询失败。那个节点在哪里,我不知道。