【发布时间】:2020-11-24 19:13:57
【问题描述】:
我们在 Elastic Cloud 上托管 elatsicsearch 集群,并从数据流 (GCP) 中调用它。工作在 dev 中运行良好,但是当我们部署到 prod 时,我们在客户端看到很多连接超时。
Traceback (most recent call last):
File "apache_beam/runners/common.py", line 1213, in apache_beam.runners.common.DoFnRunner.process
File "apache_beam/runners/common.py", line 570, in apache_beam.runners.common.SimpleInvoker.invoke_process
File "main.py", line 159, in process
File "/usr/local/lib/python3.7/site-packages/elasticsearch/client/utils.py", line 152, in _wrapped
return func(*args, params=params, headers=headers, **kwargs)
File "/usr/local/lib/python3.7/site-packages/elasticsearch/client/__init__.py", line 1617, in search
body=body,
File "/usr/local/lib/python3.7/site-packages/elasticsearch/transport.py", line 390, in perform_request
raise e
File "/usr/local/lib/python3.7/site-packages/elasticsearch/transport.py", line 365, in perform_request
timeout=timeout,
File "/usr/local/lib/python3.7/site-packages/elasticsearch/connection/http_urllib3.py", line 258, in perform_request
raise ConnectionError("N/A", str(e), e)
elasticsearch.exceptions.ConnectionError: ConnectionError(<urllib3.connection.HTTPSConnection object at 0x7fe5d04e5690>: Failed to establish a new connection: [Errno 110] Connection timed out) caused by: NewConnectionError(<urllib3.connection.HTTPSConnection object at 0x7fe5d04e5690>: Failed to establish a new connection: [Errno 110] Connection timed out)
我将 elasticsearch 客户端中的超时设置增加到 300 秒,如下所示,但似乎没有帮助。
self.elasticsearch = Elasticsearch([es_host], http_auth=http_auth, timeout=300)
在https://cloud.elastic.co/deployments//metrics 查看部署 CPU 和内存使用率非常低(低于 10%),搜索响应时间也在 200 毫秒左右。 这里的瓶颈可能是什么?我们如何避免这种超时?
如下面的日志所示,大多数请求都因连接超时而失败,而成功的请求很快就会收到响应:
我尝试 ssh 进入我们遇到连接错误的 VM。 netstat 显示有大约 60 个 ESTABLISHED 连接到弹性搜索 IP 地址。当我从虚拟机卷曲到弹性搜索地址时,我能够重现超时。我可以很好地卷曲到其他 URL。我也可以从本地卷曲到 elasticsearch,所以问题只是 VM 和 elasticsaerch 服务器之间的连接。
dataflow(计算引擎)或 ElasticSearch 对并发连接数有限制吗?我在网上找不到任何信息。
【问题讨论】:
-
你能澄清一下你正在建立什么类型的连接吗?是批处理还是流式传输?一段连接代码会有所帮助
-
这是流式作业,我通过 elasticsearch-py 库(调用 _search REST API)连接到 elasticsearch。我把简化的python代码和shell脚本放在这里-gist.github.com/daisy1754/985411be17773342d73cb408627e461c实际上在发布之后,我做了一些更新,所以我们现在使用共享类来共享elasticsearch客户端,并将maxsize设置为elasticsearch以限制连接数。这似乎有帮助,但经过大约 8 小时的运行后,我再次开始看到连接超时
-
您是否在代码中实现了拆卸?
-
我没有。我的最新代码(以上链接)在设置中获得了共享的弹性搜索,因此无需清理
-
您的 Dataflow 作业是否开启了自动缩放功能?当问题发生时,您是否看到工人人数增加了?此外,当您 ssh 进入有问题的 VM 时,VM 运行的繁忙程度如何?
标签: python elasticsearch google-cloud-platform google-cloud-dataflow apache-beam