python cql 驱动 - cassandra.ReadTimeout - "操作超时 - 仅收到1个响应。
我正在使用Cassandra 2.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"
这个计数对我来说并没有太大用处,只是一个测试,而这个操作需要很长时间才能完成。
虽然我把超时时间设置为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就不能查询到它吗?
在下面的图片中,可以看到对集群的请求量非常少,延迟也很低。我不太确定为什么会这样。
1 个回答
1
根据回复内容:
received_responses': 1, 'data_retrieved': True, 'required_responses': 2
数据只在一个节点上可用,而查询要求所有节点的数据一致性(consistency==all)。Cassandra无法满足这个请求,因此超时了。
如果你希望所有节点都有数据,可以把写入的一致性设置为“ALL”。
这样的话,所有的读取请求就可以在不要求一致性为“ALL”的情况下满足,因为写入请求本身就保证了数据的一致性。不过,如果某个节点离线,写入可能会失败。
想了解每种一致性级别的具体含义,可以查看这份文档。
LOCAL_QUORUM
是用来确保在一个数据中心内,联系到大多数节点(根据复制因子)的一种方式。