python cql驱动程序-cassandra.ReadTimeout-“0”;操作超时-仅收到1个响应。”;
我将Cassandra2.0与python CQL一起使用 我创建了一个柱族,如下所示: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
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的说法,集群中还有另一个节点拥有数据。查询需要所有
,一个节点无法响应,查询失败。那个节点在哪里,我不知道。