查询现有数据时的Cassandra ReadTimeout
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查询现有数据时的Cassandra ReadTimeout相关的知识,希望对你有一定的参考价值。
对于我的测试服务器,我没有复制Cassandra 2.1.6设置:
CREATE KEYSPACE v2 WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes = false; CREATE TABLE v2.tiles ( zoom int, idx int, tile blob, PRIMARY KEY (zoom, idx) )
对于每个缩放值,可能有数千万个小项目。对于zoom = 11,第一个idx在100352左右。当我需要迭代所有项目时,我总是看到特定存储情况的超时错误:
cqlsh:v2> select zoom,idx from tiles where zoom=11 limit 10;
ReadTimeout: code=1200 [Coordinator node timed out waiting for replica nodes' responses] message="Operation timed out - received only 0 responses." info={'received_responses': 0, 'required_responses': 1, 'consistency': 'ONE'}
我得到“zoom = 11和idx> 1000”的相同错误。对于更接近现有项目的idx值,它会给出正确的结果:
cqlsh:v2> select zoom,idx from tiles where zoom=11 and idx > 100000 limit 10;
zoom | idx
------+--------
11 | 100352
...
当idx与极高值比较时,它还显示正确的空结果:
cqlsh:v2> select zoom,idx from tiles where zoom=11 and idx > 1000000 limit 10;
zoom | idx | tile
------+-----+------
(0 rows)
对于每个缩放值,可能有数千万个小项目。对于zoom = 11,第一个idx在100352左右。当我需要迭代所有项目时,我总是看到特定存储情况的超时错误。
这听起来像是一排排的问题。如果单个分区有多个项目(放大你的情况),它可能会为cassandra中的读取带来问题。一般来说,保持分区大小<100MB是一个很好的经验法则,你认为你的分区可能很大吗?平均有多少字节是'tile'列?例如,idx是一个4字节的int,并假设blob大小为96字节,每行100个字节,忽略任何开销~1,048,576行等于100MB
尽管您的页面大小很小,但cassandra最终还是会在磁盘上读取数据及其索引。似乎发生的事情是您的C *节点无法读取read_request_timeout_in_ms中的数据(默认值为10秒)。当您的查询确实有效期他们需要多长时间?
可能值得启用跟踪(在cqlsh会话中'跟踪')以帮助理解查询成功时所花费的时间。您还可以考虑在调试时将read_request_timeout_in_ms增加到某个任意大的值。关于追踪的好文章可以找到here。
如果您发现行太宽,可以考虑进一步分区数据,例如按天:
CREATE TABLE v2.tiles (
zoom int,
day timestamp,
idx int,
tile blob,
PRIMARY KEY ((zoom, day), idx)
)
虽然不了解您的数据模型,但时间可能不是一种好的分区方式。
在我的情况下,此错误已解决,增加了“cassandra.yaml”文件中参数“range_request_timeout_in_ms”的时间。默认情况下,此参数的值为10000毫秒。
以上是关于查询现有数据时的Cassandra ReadTimeout的主要内容,如果未能解决你的问题,请参考以下文章
在 Cassandra 的现有集群(数据中心)中添加节点时面临的问题
Cassandra存储time series类型数据时的内部数据结构?
Cassandra java驱动程序 - 使用多线程提取数据时的高延迟
将节点添加到 Cassandra 集群会导致现有节点上的 CPU 过载