【问题标题】:Mongo::OperationFailure repeatedly happening in EC2, what to do?Mongo::OperationFailure在EC2中反复发生,怎么办?
【发布时间】:2012-04-30 13:28:38
【问题描述】:

我在日志中看到很多异常:

A Mongo::OperationFailure occurred in foo#bar:

Mongo::OperationFailure
mongo (1.6.2) lib/mongo/util/tcp_socket.rb:76:in `read'

我使用 Mongoid 作为我的 Ruby 驱动程序。

不确定这是否与连接池有关,但如果是的话,这是我的 mongoid.yml:

production:
  host: xxx
  port: 27017
  username: xxx
  password: xxx
  database: foo
  logger: false
  pool_size: 200
  max_retries_on_connection_failure: 5

我了解 EC2 可能会出现暂时的网络问题,但这几乎已成为常态。解决这个问题的最佳方法是什么?

仅作为背景信息,我正在运行 JRuby 1.6.7。

【问题讨论】:

  • mongod 日志中是否有警告/错误?
  • 你能分享mongostat的快照吗?

标签: ruby-on-rails ruby mongodb amazon-ec2 mongoid


【解决方案1】:
  • 您在哪种 EC2 实例上运行 MongoDB?他们至少应该是m1.large
  • 您的 MongoDB 集群中有多少台服务器?至少应该有 2 加 1 个仲裁器。它们是如何配置的?
  • 您是否将TCP keepalive 超时设置为300 seconds
  • 您是否使用topmongostat 检查了数据库服务器上的基本统计信息?
  • 您是否安装并使用了来自 10gen 的 free MongoDB Monitoring Service

如果您使用过一些监控工具,它们告诉了您什么?如果您还没有,那么请使用它们并报告您的发现。

【讨论】:

    【解决方案2】:

    可能

    # Connect nonblock is broken in current versions of JRuby
    

    对于lib/mongo/util/tcp_socket.rb中的connectlink to file

     def connect
      # Connect nonblock is broken in current versions of JRuby
      if RUBY_PLATFORM == 'java'
        require 'timeout'
        if @connect_timeout
          Timeout::timeout(@connect_timeout, OperationTimeout) do
            @socket.connect(@socket_address)
          end
        else
          @socket.connect(@socket_address)
        end
      else
        ... # nonblocking connect 
    

    错误发生here

    rescue Errno::EINTR, Errno::EIO, IOError 
      raise OperationFailure 
    end
    

    所以它可能是EIO/IOError

    也许尝试使用 Ruby 而不是 JRuby?

    希望这会有所帮助。

    (如果我不得不做出一个未受教育的猜测,我可能会后悔说,因为 JRuby 必须使用阻塞套接字 connect 而不是非阻塞套接字,@ 987654330@ 在read 期间发生大量读取/连接。)

    【讨论】:

      猜你喜欢
      • 2021-10-18
      • 2012-03-13
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 2010-09-18
      • 2020-12-23
      相关资源
      最近更新 更多