如何修复Elasticsearch中的读取超时问题

55

我使用 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问题吗?

非常感谢。

6个回答

56

因为你看到的错误可能与你正在使用的客户端有关,所以很难给出直接的答案。不过解决方案可能是以下之一:

1.在创建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
我有一个类似的问题,我将超时时间增加到60秒,但仍然收到超时错误。我认为问题在于为什么Elasticsearch响应如此缓慢? - digitaldavenyc
取决于各种原因。你有适当的索引吗?你可能需要发布一个新问题。 - Skillachie
5
有没有关于根本原因的新问题发布?我遇到了同样的问题,想知道 Elasticsearch 响应缓慢的根本原因是什么。 - Suanmeiguo

48

试试这个:

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

它可能无法完全避免ReadTimeoutError,但它能将其最小化。


那种确定性帮了很大忙。谢谢! - Chev_603

6

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


5
值得一提的是,我发现这似乎与索引状态损坏有关。
虽然很难可靠地重现此问题,但我已经看到过几次。操作正常运行,除了某些操作似乎定期挂起ES(特别是刷新索引)。
对我来说,删除索引(curl -XDELETE http://localhost:9200/foo)并从头重新索引解决了这个问题。
如果您看到这种行为,我建议定期清除并重新索引。

4
除非你只有少量的数据,否则这太贵了。 - Sinux
我也注意到了这一点,使用ES 6.5也是如此。不幸的是,定期重新索引对我来说并不是一个选项。 - rubik

2

2

+1 - 我们最近遇到了这个问题,我们的超时原因是由于机器磁盘空间不足而导致分片不可用。https://dev59.com/pl4c5IYBdhLWcg3wHXNS#64117534 - Anupam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接