使用mgo的mongodb错误:net.OpError(net.timeoutError)

在不可预测的时间向mongo写入数据时,我不断收到错误消息,并想找出原因。
我正在使用 Go的mgo驱动程序。 该错误的类型为 net.OpError </ code>。 它的一些相关字段:</ p>

  net.OpError {
Err:net.timeoutError,
Op:“读取”,
Net:“ tcp”,
}
</ code> </ pre>

当前,我通过重新连接来解决此错误:</ p>

  err:= myType.mgoCollection.Insert(msg  )
if err!= nil {
myType.mgoSession = myType.mgoSession.Copy()
myType.mgoCollection = myType.mgoSession.DB(“ my_db_name”)。C(“ my_collection_name”)
}
< / code> </ pre>

并重新提交。 有时这足够了,有时需要重试几次。 有时甚至在重试10次后(每次大约1分钟),错误仍然存​​在(目前,我在重试10次后便分手了)。 我不知道该怎么看。</ p>

我对mongo的大部分写操作都很小,但是每秒两次写的操作会更大一些(以JSON字符串表示时可能为1或10 kb)。 </ p>

我有两个单独的进程,并且两个进程同时发生此错误。</ p>
</ div>

展开原文

原文

I keep getting errors when writing to mongo at unpredictable times and would like to find out the reason. I am using the mgo driver for Go. The error is of type net.OpError. Some of its relevant fields:

net.OpError{
  Err: net.timeoutError,
  Op: "read",
  Net: "tcp",
}

Currently I handle this error by reconnecting:

err := myType.mgoCollection.Insert(msg)
if err != nil {
    myType.mgoSession = myType.mgoSession.Copy()
    myType.mgoCollection = myType.mgoSession.DB("my_db_name").C("my_collection_name")
}

and re-submit. Sometimes this is enough, sometimes several retries are needed. And sometimes even after 10 retries (each around 1 minute) the error is still there (currently I break up after 10 retries).

I could not find anything suspicious in the mongodb logs and do not know where to look further.

Most of my writes to mongo are rather small, but twice a second there are somewhat larger writes (maybe 1 or 10 kb when represented as JSON string).

I have two separate processes and this error occurs for both of them at the same time.

doubingling4706
doubingling4706 实时观察它具有挑战性,因为(我的流程)运行时间长达24小时后,它可能会发生。而且每当我注意到它时,一切都恢复正常(无需重新启动mongod)。但是也许我可以编写一些代码以通过一些查询运行mongo客户端。
接近 3 年之前 回复
douyong1974
douyong1974 如果您可以实时观察到这种情况的发生,可以在应用程序出现问题时尝试从Shell客户端连接到mongo吗?可能是证明性的。我将确保您在重新连接逻辑中关闭死的会话,但是您是对的,这可能不是您的问题。
接近 3 年之前 回复
douti0467
douti0467 我正在使用mongodb记录事件。一个Go进程中只有两个并发会话。两者都是通过session.Copy()从单个“原始”会话创建的。这些session.Copy()调用在启动期间同时发生。通常,在整个过程的整个生命周期中,我都会使用这两个会话。对每个单个会话的访问都已序列化。现在,我意识到我的重新连接逻辑(如上面的文章所示)在用新的(副本)覆盖旧会话之前不会关闭旧会话。除此之外,确实不需要关闭会议。
接近 3 年之前 回复
doure8758
doure8758 这些进程是否正在运行许多并发请求?完成会话后,您是否要关闭会话?可能是您对连接池增加了负担。
接近 3 年之前 回复
doutuo1908
doutuo1908 是的,它是同一台(虚拟)计算机。
接近 3 年之前 回复
douna4762
douna4762 Mongo和Go应用程序在同一台机器上吗?同一局域网?这听起来像是网络问题,所以我先将其排除在外。
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐