在J=1且W=maist的MongoDB副本集上是否仍会发生回滚?

在J=1且W=maist的MongoDB副本集上是否仍会发生回滚?,mongodb,replication,rollback,failover,Mongodb,Replication,Rollback,Failover,我一直在阅读文档,根据我的理解,我可以看到一种情况,即回滚仍然可能发生: 写入到主日志,主日志确认日志已写入磁盘 大多数辅助设备确认写入,但不写入磁盘 整个群集上的电源故障 由于某种原因,主电源在恢复供电时不会启动备份 次要角色扮演主要角色 原始主节点最终启动,作为辅助节点重新加入集合并回滚 这种情况合理吗?如果获取命令并写入磁盘的其他成员之间发生电源故障,则回滚是一种合理的情况 在这种情况下,正如您所指出的,主服务器无法启动备份,因此一旦备份,就会包含其他服务器无法验证的操作,从而导致回滚

我一直在阅读文档,根据我的理解,我可以看到一种情况,即回滚仍然可能发生:

  • 写入到主日志,主日志确认日志已写入磁盘
  • 大多数辅助设备确认写入,但不写入磁盘
  • 整个群集上的电源故障
  • 由于某种原因,主电源在恢复供电时不会启动备份
  • 次要角色扮演主要角色
  • 原始主节点最终启动,作为辅助节点重新加入集合并回滚

这种情况合理吗?

如果获取命令并写入磁盘的其他成员之间发生电源故障,则回滚是一种合理的情况

在这种情况下,正如您所指出的,主服务器无法启动备份,因此一旦备份,就会包含其他服务器无法验证的操作,从而导致回滚


同样值得注意的是,作为一个曲线球,如果主进程不停止,那么它将返回一个成功的写操作,应用程序也不会知道集合已经停止,并且它们的
{w:maist}
没有写入磁盘。当然,这是一种边缘情况。

根据文档,我的理解是,如果设置j=1,那么w>1并不重要。您的应用程序将仅在主应用程序将写操作提交到其自己的日志后(并且尽快)进行一次写操作确认。将发生对副本的写入,但不要考虑写入问题

有鉴于此,“主服务器是否可以提交日志、确认写操作,并在辅助服务器提交日志之前让集群关闭,然后在辅助服务器返回主服务器时回滚主服务器”的说法比原始问题所暗示的可能性更大(但可能性仍然很低)

从文档中:

Requiring journaled write concern in a replica set only requires a journal commit of the write
operation to the primary of the set regardless of the level of replica acknowledged write concern.

不要认为它会发生在MongoDB 3.2+中,如中所示:

在版本3.2中更改:使用j:true,MongoDB仅在 请求的成员数(包括主要成员)已写信给 杂志。以前的j:仅在副本集中存在真正的写入问题 要求主服务器写入日志,而不考虑w: 写下关注点


嗯,很有趣。在曲线球上,您是指已确认还是已写入磁盘?集合必须已响应,写入才会被视为成功,但如果在写入磁盘之前它们停止,应用程序将不会知道数据仅在一个节点上保留?@Max抱歉,我是说写入磁盘,它当然会被确认,那里的英语很差。确切地说,该应用程序将对这个问题视而不见。还需要注意的是,j仅适用于primarywrite convern,即使超时也不会回滚,它将等待其他节点出现并读取到该节点,但会生成错误。。。。我有选择地添加我运行的代码和我得到的结果,而不是所有的代码都包含在内:
db.new\u data.insert({“m103”:“非常有趣”},{writeConcern:{w:3,wtimeout:1000})
,“codeName”:“WriteConcernFailed”…
mongod--config/shared/config-repl-3.cfg
rs.slaveOk()
db.new\u data.find()
:ObjectId(“5b8b0930e6fc3ad79049ba08”),“m103:“非常有趣”}
你的意思是如果它发生在一个没有摔倒的成员身上?我必须承认,这个答案很古老,我已经有一段时间没有机会使用mongodb了,但是通常如果成员发生故障,那么它将在返回时进行回滚,因为集合的其余部分具有不同的映像,但是,如果主服务器没有故障转移,我可以很容易地看到这种情况,但即使在旧的mongo中,超时也不会导致回滚,这将由单个成员决定何时重新启动该计算机上的二进制文件