【问题标题】:Connection Timeout with ElasticsearchElasticsearch 的连接超时
【发布时间】:2015-04-01 23:03:59
【问题描述】:
from datetime import datetime
from elasticsearch import Elasticsearch
es = Elasticsearch()

doc = {
    'author': 'kimchy',
    'text': 'Elasticsearch: cool. bonsai cool.',
    'timestamp': datetime(2010, 10, 10, 10, 10, 10)
}
res = es.index(index="test-index", doc_type='tweet', id=1, body=doc)
print(res['created'])

此简单代码返回以下错误:

elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(host='localhost', port=9200): Read timed out. (read timeout=10))

很奇怪,因为服务器已经准备好了(http://localhost:9200/ 正在返回一些 json)。

【问题讨论】:

    标签: python python-2.7 elasticsearch


    【解决方案1】:

    由于某种原因在我的查询中指定fields 选项时出现此错误。删除该选项使查询工作(至少在 OpenSearch 中):

    之前:

    elasticsearch.helpers.scan(es, index="my_index", query={"query": {"match_all": {}}, "fields": ["zip_code", "polygon"]}, size=5000, scroll="15m")
    

    之后:

    elasticsearch.helpers.scan(es, index="my_index", query={"query": {"match_all": {}}}, size=5000, scroll="15m")
    

    【讨论】:

      【解决方案2】:

      扩展requestTimeout

      client = new elasticsearch.Client({
              host          : 'http://localhost:9200',
              requestTimeout: 60000
          });
      

      【讨论】:

        【解决方案3】:

        在 ubuntu 的端口 9202(elasticsearch 6 正在使用 9200)尝试 elasticsearch 7.11.1(使用 apt install 安装)时遇到此超时问题。

        我在谷歌上搜索了将近两个小时才最终修复它。原来我需要在/etc/elasticsearch/elasticserch.yml 中设置(注释掉)一行

        cluster.initial_master_nodes: ["node-1"]  # earlier in the same file: node.name: node-1 
        

        我希望这可以帮助某人。

        【讨论】:

          【解决方案4】:

          超时的原因可能有很多,似乎值得检查 elasticsearch 端的日志 端 (logs/elasticsearch.log) 以查看详细错误。在我们的例子中,ES 上的错误是:

          primary shard is not active Timeout: [1m]
          

          正如post 中所述,这是因为我们的磁盘已满。我们在一天前调整了它(和分区)的大小来解决这个问题,但是如果我们没有完成一次高/低水位线(我们在 5.5.x 上),则需要重新启动 ES。

          只需在生产环境中重新启动 ES 即可为我们解决问题。

          【讨论】:

            【解决方案5】:

            尝试在 Elasticsearch 初始化中设置超时:

            es = Elasticsearch([{'host': HOST_ADDRESS, 'port': THE_PORT}], timeout=30)
            

            您甚至可以将retry_on_timeout 设置为True 并为max_retries 指定一个可选数字:

            es = Elasticsearch([{'host': HOST_ADDRESS, 'port': THE_PORT}], timeout=30, max_retries=10, retry_on_timeout=True)
            

            【讨论】:

              【解决方案6】:

              两个有帮助的选项:

              1:增加超时时间

              设置超时为我解决了这个问题。请注意,较新的版本需要一个单位,例如timeout="60s":

              es.index(index=index_name, doc_type="domains", id=domain.id, body=body, timeout="60s")
              

              没有单位,例如通过设置timeout=60,你会得到

              elasticsearch.exceptions.RequestError: RequestError(400, 'illegal_argument_exception', 'failed to parse setting [timeout] with value [60] as a time value: unit is missing or unrecognized')
              

              2:减少文字长度

              它还有助于减少文本长度,例如通过剪切长文本,弹性可以更快地存储文本,这也将避免超时:

              es.index(index=index_name, doc_type="domains", id=domain.id, body=text[:5000], timeout="60s")
              

              【讨论】:

              • 这不起作用,因为错误仍然存​​在,将超时值声明为 10
              【解决方案7】:

              如果您使用的是 Amazon Elastic Search 服务,可能会出现连接超时问题。

              es = Elasticsearch([{'host': 'xxxxxx.us-east-1.es.amazonaws.com', 'port': 443,  'use_ssl': True}])
              

              上面的 python 代码将默认端口从 9200 覆盖到 443 并将 SSL 设置为 true 将解决该问题。

              如果没有指定端口,则尝试连接指定主机的9200端口,超时后失败

              【讨论】:

              • 或者你可以使用端口 80 es = Elasticsearch([{'host': 'xxxxxx.us-east-1.es.amazonaws.com', 'port': 80}])跨度>
              【解决方案8】:

              请注意,执行es.search(或es.index)时超时的常见原因之一是查询大小过大。例如,在我的 ES 索引大小(> 3M 文档)相当大的情况下,搜索 30 个单词的查询大约需要 2 秒,而搜索 400 个单词的查询需要 18 秒。因此,对于足够大的查询,即使 timeout=30 也无法拯救您。一个简单的解决方案是将查询裁剪为可以在超时以下回答的大小。

              如果原因是交通拥堵,增加超时或在超时时重试将对您有所帮助,否则这可能是您的罪魁祸首。

              【讨论】:

                【解决方案9】:

                我的个人问题已通过 (timeout = 10000) 解决,但实际上从未达到,因为服务器上的条目只有 7.000,但它的流量很大,资源被占用,这就是连接断开的原因

                【讨论】:

                  【解决方案10】:

                  这与将超时时间增加到 30 秒无关。 人们是否真的认为弹性搜索需要最多 30 秒才能返回一个微小的命中?

                  我解决此问题的方法是转到 config/elasticsearch.yml 取消注释以下内容

                  http.port: 9200
                  network.host: 'localhost' 
                  

                  Network.host 可能设置为 192.168.0.1 这可能有效但我只是将其更改为 'localhost'

                  【讨论】:

                  • 如果服务器太忙,是的,您只需轻轻一击就会出现此错误。
                  • 或者如果 DNS 解析有问题,超时的原因有很多
                  【解决方案11】:

                  默认情况下,超时值设置为 10 秒。如果想要更改全局超时值,可以通过在创建对象时设置标志 timeout=your-time 来实现。

                  如果您已经创建了对象而没有指定超时值,那么您可以通过在查询中使用 request_timeout=your-time 标志为特定请求设置超时值。

                  es.search(index="my_index",
                            doc_type="document",
                            body=get_req_body(),
                            request_timeout=30)
                  

                  【讨论】:

                  • 可以设置为 60 吗?即使设置为 30 后我也会超时
                  • @Kishan 你的文档有多大?
                  • 嗨,@RohitPatwa 我的问题是通过减少文档的长度来解决的。我不记得现在身体有多大。感谢您的帮助:)
                  • 如果我的老板不让我更改超时并且它在一条记录上失败了怎么办?
                  【解决方案12】:

                  elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(host='localhost', port=9200): Read timed out. (read timeout=10)) 表示请求未在指定时间结束(默认情况下,timeout=10)。

                  这将在 30 秒内工作:

                  res = es.index(index="test-index", doc_type='tweet', id=1, body=doc, timeout=30)

                  【讨论】:

                    猜你喜欢
                    • 2018-08-17
                    • 2021-04-13
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-01-21
                    • 2018-07-24
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-09-03
                    相关资源
                    最近更新 更多