我正在使用 Elasticsearch python 模块。我正在尝试像这样建立到服务器的连接
es = Elasticsearch([config.endpoint],
api_key=config.key,
request_timeout=config.request_timeout )
服务器连接,然后我尝试执行丰富策略。
es.enrich.execute_policy(name=policy)
但它们都失败并出现此错误:
{'policy': 'enrich-1', 'status': 'failed', 'error': "Connection error caused by: ConnectionError(Connection error caused by: FullPoolError(HTTPConnectionPool(host='our.server.internal', port=9200): Pool reached maximum size and no more connections are allowed.))"}
如果我删除
request_timeout
参数,丰富尝试运行但显示超时。如果我把参数放回去,就会收到此错误。
为什么会发生这种情况?我尝试阅读
文档
但不清楚这些参数的实际作用。是否有地方详细说明了每个参数的具体作用?我尝试使用
connections_per_node=50
没有帮助,同样的错误。
我做错了什么?
错误信息“ConnectionError: ConnectionError: FullPoolError(HTTPConnectionPool(host='our.server.internal', port=9200): Pool reached maximum size and no more connections are allowed.)”表示的 Elasticsearch 客户端试图建立的连接比允许的数量更多。
这可能是由于几个原因造成的:
1. 连接未关闭: 可能正在打开 Elasticsearch 连接但没有正确关闭它们。这会导致连接池耗尽,因为旧连接保持打开状态,阻止了新连接的建立。
解决方案:
确保在使用完 Elasticsearch 连接后关闭它们。可以使用
with
语句来自动关闭连接:
with Elasticsearch([config.endpoint], api_key=config.key, request_timeout=config.request_timeout) as es:
es.enrich.execute_policy(name=policy)
2. 连接池大小太小: 默认情况下,Elasticsearch 客户端的连接池大小有限。如果的应用程序发出大量并发请求,则连接池可能会耗尽。
解决方案:
可以通过在
Elasticsearch
构造函数中指定
maxsize
参数来增加连接池的大小:
es = Elasticsearch([config.endpoint],
api_key=config.key,
request_timeout=config.request_timeout,
maxsize=25) # 将最大连接数增加到 25
3. Elasticsearch 服务器过载: 如果 Elasticsearch 服务器过载,它可能无法及时响应连接请求,从而导致客户端出现连接错误。
解决方案: 检查 Elasticsearch 服务器的运行状况并确保它有足够的资源来处理请求负载。可能需要优化 Elasticsearch 配置或升级服务器硬件。
4.
connections_per_node
参数设置不正确:
尝试设置
connections_per_node
参数,但它没有生效,这可能是因为没有正确地将其传递给
Transport
类。
解决方案:
确保将
connections_per_node
参数传递给
Transport
类,如下所示:
from elasticsearch import Elasticsearch, Transport
transport = Transport([config.endpoint], api_key=config.key, connections_per_node=50)
es = Elasticsearch(transport=transport, request_timeout=config.request_timeout)
其他建议:
- 使用调试日志记录来获取有关连接问题的更多信息。
- 监控 Elasticsearch 服务器的连接指标以识别潜在的瓶颈。
-
考虑使用异步 Elasticsearch 客户端(例如
elasticsearch-async
)来提高应用程序的性能。
通过解决这些问题,应该能够解决“ConnectionError: FullPoolError”错误并使的应用程序可靠地连接到 Elasticsearch。
标签:python,http,elasticsearch,timeout From: 78818387