如何修复Elasticsearch中的读取超时

时间:2014-09-18 09:04:07

标签: elasticsearch timeout connection-timeout timeoutexception executiontimeout

我使用Elasticsearch-1.1.0来索引推文。 索引过程没问题。 然后我升级了版本。现在我使用Elasticsearch-1.3.2,我随机收到这条消息:

Exception happened: Error raised when there was an exception while talking to ES.
ConnectionError(HTTPConnectionPool(host='127.0.0.1', port=8001): Read timed out. (read timeout=10)) caused by: ReadTimeoutError(HTTPConnectionPool(host='127.0.0.1', port=8001): Read timed out. (read timeout=10)).

随机性快照:

Happened --33s-- Happened --27s-- Happened --22s-- Happened --10s-- Happened --39s-- Happened --25s-- Happened --36s-- Happened --38s-- Happened --19s-- Happened --09s-- Happened --33s-- Happened --16s-- Happened 

--XXs-- = after XX seconds

有人可以指出如何解决Read timed out问题吗?

非常感谢。

7 个答案:

答案 0 :(得分:22)

由于您看到的错误与您正在使用的客户端相关联,因此很难直接回答。但是,解决方案可能是以下之一:

1.通过传递timeout参数创建ES客户端时,全局增加默认超时。 Python中的示例

es = Elasticsearch(timeout=30)

2.设置客户端每个请求的超时时间。摘自下面的Elasticsearch Python文档。

# only wait for 1 second, regardless of the client's default
es.cluster.health(wait_for_status='yellow', request_timeout=1)

以上将为群集提供一些额外的时间来回复

答案 1 :(得分:20)

试试这个:

es = Elasticsearch(timeout=30, max_retries=10, retry_on_timeout=True)

它可能不会完全避免ReadTimeoutError,但它会将它们缩小。

答案 2 :(得分:2)

对于它的价值,我发现这似乎与一个破碎的索引状态有关。

要可靠地重新创建这个问题非常困难,但我已经多次见过它了;操作正常运行,除了某些周期性似乎挂起ES的(特别是刷新索引)。

删除索引(curl -XDELETE http://localhost:9200/foo)并从头开始重新编制索引,为我修复此问题。

如果您看到此行为,我建议您定期清除并重新编制索引。

答案 3 :(得分:1)

当查询大小很大时,读取超时也会发生。例如,在我的ES索引很大(> 3M文档)的情况下,用30个单词的查询进行搜索大约需要2秒钟,而用400个单词的查询进行搜索需要18秒钟以上。因此,对于足够大的查询,即使timeout=30也无法挽救您。一种简单的解决方案是将查询裁剪为在超时以下可以回答的大小。

答案 4 :(得分:0)

增加各种超时选项可能会立即解决问题,但不能解决根本原因。

提供了ElasticSearch服务可用并且索引运行良好,请尝试增加Java的最小和最大堆大小:请参阅https://www.elastic.co/guide/en/elasticsearch/reference/current/jvm-options.html

TL; DR编辑/etc/elasticsearch/jvm.options -Xms1g-Xmx1g

答案 5 :(得分:0)

您还应该检查是否所有都带有弹性。某些分片可能不可用,这是有关分片https://www.datadoghq.com/blog/elasticsearch-unassigned-shards/

不可用的可能原因的很好的文档

答案 6 :(得分:0)

以防万一有人在这里尝试了一切,但没有任何效果...

将问题一分为二,检查Elasticsearch是否真的可以,请尝试在命令行上运行以下任何命令:

curl localhost:9200/_cat/indices
curl -XGET 'http://localhost:9200/_cluster/state?pretty'

万一它们不起作用(因此与Python无关),请检查/etc/elasticsearch.yaml(在Ubuntu上的配置,在这种情况下已打包)。可能是文件配置错误(由于进行了旧的实验,我使用了该文件)。 尝试注释掉所有内容,然后再次检查命令,然后检查是否有效,然后回到Python。