2

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

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。

4

2 回答 2

0

可能与以下事实有关

# Connect nonblock is broken in current versions of JRuby

for connectin lib/mongo/util/tcp_socket.rb:文件链接

 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 

错误发生在这里

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

所以它可能是一个EIO/IOError.

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

希望这可以帮助。

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

于 2012-04-22T05:42:46.847 回答
0
  • 您在哪种 EC2 实例上运行 MongoDB?它们至少应该是一个m1.large.
  • 您的 MongoDB 集群中有多少台服务器?至少应有 2 位加一位仲裁员。它们是如何配置的?
  • 您是否将TCP keepalive超时设置为300 秒
  • 您是否使用top和检查了数据库服务器上的基本统计信息mongostat
  • 您是否安装并使用过来自 10gen的免费 MongoDB 监控服务?

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

于 2012-04-22T04:21:32.937 回答