【问题标题】:Mongo::Error::SocketError: Broken pipe when executing queries in a mongo replica setMongo::Error::SocketError:在 mongo 副本集中执行查询时管道损坏
【发布时间】:2020-08-24 18:59:47
【问题描述】:

我从连接到 mongo 副本集的 Rails 应用程序中随机收到此错误。然后,这会导致服务器描述更改为“未知”并且服务器选择重新开始。

当我尝试在连接到独立 mongod 服务器的本地运行应用程序时,不会发生这种情况。

由于某种原因,连接到副本集并对其执行重复查询会导致

Read retry due to: Mongo::Error::SocketError EOFError: end of file reached

这是与副本集的下划线 SSL/TLS 连接的问题吗?我尝试在我的 mongoid.yml 中增加 socket_timeout、connection_timeout,但没有成功。

【问题讨论】:

  • 可能会添加MongoDB和mongo驱动的版本。 mongodb.yml 失败也可能会有所帮助。

标签: ruby-on-rails mongodb mongoid


【解决方案1】:

当服务器关闭与客户端的连接时会发生这种情况。 发生的一次是副本集进行选举时 - 旧的主节点关闭了它与 MongoDB 4.0 及更早版本(而不是 4.2+)的所有连接。

由于重试读取,除了您看到的正在打印的诊断消息外,这种情况通常不会影响应用程序。

您可以在打印消息时查看服务器日志,了解服务器关闭连接的原因。有时连接在没有服务器端日志记录的情况下关闭(例如,当服务器进程终止时,它不会记录所有连接关闭)。

【讨论】:

  • 所以集群在主节点可用的情况下也有选举?那么除了设置一个高的 server_selection_timeout 之外没有办法避免这个问题吗?
  • 由于成员的优先级,一个副本集在它有一个主节点时可能会举行选举。服务器选择超时与情况无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 2016-04-16
相关资源
最近更新 更多