heroku mongohq 和 mongoid Mongo::ConnectionFailure

Posted

技术标签:

【中文标题】heroku mongohq 和 mongoid Mongo::ConnectionFailure【英文标题】:heroku mongohq and mongoid Mongo::ConnectionFailure 【发布时间】:2011-02-16 14:02:15 【问题描述】:

2012 年 6 月 9 日更新:

在 heroku 使用 mongoid 3.0.0.rc 进行设置,请参阅此要点:https://gist.github.com/2900804

2011 年 1 月 22 日更新:

Uri 现在优先于 mongoid.yml

https://github.com/mongoid/mongoid/issues/issue/266

2010 年 8 月 12 日更新:虽然我在 5 月 6 日从 Jackues Crocker 那里得到了一个接受的答案,但这个问题的某些方面很容易搞砸!它再次发生在我身上,我决定研究 mongoid 源代码。所以,就这样吧:

目前,host: port: name/database: settings TAKE PRECEDENCE OVER the uri: setting。 因此,非常无信息的错误消息由于对 localhost:xxxx 的请求而不是对 flame.local.mongohq.com:xxxx

的请求而发生

这会坏掉的!

defaults: &defaults
  host: localhost  <- THIS 'OVERWRITES' host in the uri!

production:
  <<: *defaults    <- BE CAREFUL WITH WHAT YOU BRING IN. THE host: FROM DEFAULTS WILL BE THE ONE APPLIED, not your uri host.
  uri: <%= ENV['MONGOHQ_URL'] %>

通过删除默认值中的 host: 和/或删除

来修复它

原始问题:

我在 heroku 为 mongodb 添加了 mongoHQ 插件。它崩溃了:

connect_to_master': failed to connect to any given host:port (Mongo::ConnectionFailure)

在我看来,网上的描述 (heroku mongohq) 更倾向于 mongomapper。我正在使用 mongoid 运行 ruby​​ 1.9.1 和 rails 3-beta。

我的感觉是 ENV['MONGOHQ_URL'] 有一些东西,它说是 MongoHQ 插件集,但我没有在我的应用程序的任何地方设置 MONGOHQ_URL。我想问题出在我的 mongoid.yml ?

defaults: &defaults
  host: localhost

development:
  <<: *defaults
  database: aliado_development

test:
  <<: *defaults
  database: aliado_test

# set these environment variables on your prod server
production:
  <<: *defaults
  host: <%= ENV['MONGOID_HOST'] %>
  port: <%= ENV['MONGOID_PORT'] %>
  username: <%= ENV['MONGOID_USERNAME'] %>
  password: <%= ENV['MONGOID_PASSWORD'] %>
  database: <%= ENV['MONGOID_DATABASE'] %>

它在本地运行良好,但在 heroku 失败,更多堆栈跟踪:

==> crashlog.log <==
Cannot write to outdated .bundle/environment.rb to update it
/disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/rack-1.1.0/lib/rack.rb:14: warning: already initialized constant VERSION
/disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/mongo-0.20.1/lib/mongo/connection.rb:435:in `connect_to_master': failed to connect to any given host:port (Mongo::ConnectionFailure)
    from /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/mongo-0.20.1/lib/mongo/connection.rb:112:in `initialize'
    from /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/mongoid-2.0.0.beta4
/lib/mongoid/railtie.rb:32:in `new'
    from /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/mongoid-2.0.0.beta4/lib/mongoid/railtie.rb:32:in `block (2 levels) in <class:Railtie>'
    from /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/mongoid-2.0.0.beta4/lib/mongoid.rb:110:in `configure'
    from /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/mongoid-2.0.0.beta4/lib/mongoid/railtie.rb:21:in `block in <class:Railtie>'
    from /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/railties-3.0.0.beta3/lib/rails/initializable.rb:25:in `instance_exec'
.....

这一切都在本地工作,包括测试和应用程序。我没有想法...有什么建议吗?

PS:有高声望的人创建标签'mongohq'?

【问题讨论】:

【参考方案1】:

Mongoid (master) 现在在 mongoid.yml 中有一个 URI 选项。所以你可以这样做:

production:
  uri: <%= ENV['MONGOHQ_URL'] %>

要在您的项目中使用 mongoid master,请在您的 Gemfile 中进行设置

gem "mongoid", :git => "git@github.com:mongoid/mongoid.git"

希望很快会发布一个新的宝石来清理一切。

【讨论】:

uri 修复似乎还没有奏效。我在 github.com/durran/mongoid 找到了票证/问题及其来源ragingonrails.com/post/566548996/…。我也是这样做的,为端口、主机等操作 ENV。成功了! 这个答案被标记为正确。对于其他遇到同样情况的人,请注意我必须自己调整一些。也应该是:git =&gt; git://github.com/durran/mongoid.git 现在需要使用production &gt; sessions &gt; default &gt; uri - 更新了匹配的答案。【参考方案2】:

在我看来,在默认哈希中指定主机会覆盖 uri 中的值。 要修复它,只需从默认主机中删除主机,这是我的 config/mongo.yml:

defaults: &defaults
  allow_dynamic_fields: true
  parameterize_keys: true
  persist_in_safe_mode: true
  raise_not_found_error: true
  reconnect_time: 3
  use_object_ids: true

production:
  <<: *defaults
  uri: <%= ENV['MONGOHQ_URL'] %>

这是来自 mongoid 的 config.rb 的 sn-p:

  mongo_uri = settings["uri"].present? ? URI.parse(settings["uri"]) : OpenStruct.new

  name = settings["database"] || mongo_uri.path.to_s.sub("/", "")
  host = settings["host"] || mongo_uri.host || "localhost" # <= look here
  port = settings["port"] || mongo_uri.port || 27017

【讨论】:

【参考方案3】:

我们的文档的 heroku 部分有一些 mongoid 文档。它们还没有正式发布,但你已经可以拿到了。不要对样式和内容有太多期望,但它确实包含一些您可能会发现对 mongoid 有用的信息。

https://devcenter.heroku.com/articles/mongohq

【讨论】:

【参考方案4】:

请注意,这对我有用,没有任何问题,正如 http://mongoid.github.com/docs/installation/ 上所宣传的那样

宝石文件:

gem "rails", '3.0.0.beta3'
gem "mongoid", "2.0.0.beta4"
gem "bson_ext", "0.20.1"

mongoid.yml:

host: xxx.mongohq.com
port: xxx
database: db
username: user
password: xxx

【讨论】:

在部署到 heroku 时,你怎么知道放什么而不是 xxx?你没有使用 MongoHQ heroku 插件吗?

以上是关于heroku mongohq 和 mongoid Mongo::ConnectionFailure的主要内容,如果未能解决你的问题,请参考以下文章

Rails,mongoid,heroku 性能

使用 mongoid 查看 MongoDB 中的现有索引

Node.js - 在 Heroku 上使用 MongoHQ 连接到 MongoDB

如何从 Heroku 的 MongoHQ 下载生产数据到本地机器?

Heroku & MongoHQ:ActionView::Template::Error(操作:#<Moped::Protocol::Commands::Authenticate fai

Heroku 的 Rails、Mongoid 和 Unicorn 配置