【问题标题】:Why is elasticserach-rails suddenly raising Faraday::ConnectionFailed (execution expired)?为什么 elasticsearch-rails 突然提高 Faraday::ConnectionFailed (执行过期)?
【发布时间】:2019-10-24 14:27:05
【问题描述】:

我通过 elasticsearch-model 和 elasticsearch-rails gems 在 Rails 应用程序中使用 Elasticsearch。

以前一切正常,但经过一些更新后,现在每当我尝试与远程集群 (AWS Elasticsearch) 交互时都会收到连接失败错误。

> MyModel.__elasticsearch__.create_index! force: true
=> Faraday::ConnectionFailed (execution expired)

我正在努力找出导致此连接错误的原因。在搜索了类似的问题后,我调整了超时时间,尝试了各种 http、https 和裸 url 的组合,但没有成功。

调试此连接错误的明智方法是什么?

我的 Elasticsearch 是这样初始化的。

#initializers/elasticsearch.rb


require 'faraday_middleware'
require 'faraday_middleware/aws_sigv4'

credentials = Aws::Credentials.new(
  ENV.fetch('AWS_ACCESS_KEY_ID'),
  ENV.fetch('AWS_SECRET_ACCESS_KEY')
)

config = {
  url: ENV.fetch('AWS_ELASTICSEARCH_URL'),
  retry_on_failure: true,
  transport_options: {
    request: { timeout: 10 }
  }
}


client = Elasticsearch::Client.new( config ) do |f|
  f.request :aws_sigv4, credentials: credentials, service: 'es', region: ENV.fetch('AWS_ELASTICSEARCH_REGION')
end


Elasticsearch::Model.client = client

【问题讨论】:

    标签: ruby-on-rails elasticsearch


    【解决方案1】:

    事实证明,这个问题有两个部分。

    首先,上面配置的 Elasticsearch::Client 使用默认的 ES 端口 9200。我的 ES 托管在 AWS 上,它似乎没有公开此端口。

    修复此问题后,我遇到了第二个问题(我怀疑该问题更具体到此应用程序)。我开始收到Faraday::ConnectionFailed (end of file) 错误。我不知道是什么原因造成的,但是用hostscheme 配置客户端修复了它。

    我的最终配置如下:

    #initializers/elasticsearch.rb
    
    
    # ...
    
    config = {
      host: ENV.fetch('AWS_ELASTICSEARCH_URL'),
      port: 443,
      scheme: "https",
      retry_on_failure: true,
      transport_options: {
        request: { timeout: 10 }
      }
    }
    
    client = Elasticsearch::Client.new( config ) do |f|
    # ...
    

    注意AWS_ELASTICSEARCH_URL 必须返回一个没有协议的 URL。

    【讨论】:

    • 将端口添加到我的 AWS Elasticsearch URL 也为我解决了这个问题。谢谢!
    • 将端口添加为“443”而不是“9200”有助于解决 ConnectionFailed 问题。
    【解决方案2】:

    这是因为版本问题。 使用这个gem 'elasticsearch-model', '~> 5'

    【讨论】:

    • 谢谢@parakh。为什么感觉这是版本问题?我正在使用 v6,不希望降级到 v5
    • elasticsearch-model v6 gem 可能与 AWS elasticsearch v6 不兼容,我也遇到了同样的问题,唯一可行的解​​决方案是将elasticsearch-model gem 的版本降级到5。所以你可以使用@ 987654324@ gem 到 v6 elasticsearch-rails 到 v6 也 aws es 到 v6 但 elasticsearch-model 到 5。
    猜你喜欢
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 2023-03-28
    • 2016-01-27
    • 1970-01-01
    • 2018-10-25
    相关资源
    最近更新 更多