-22

假设您有一个三节点副本集。节点 1 是主节点。节点 2 是辅助节点,节点 3 是辅助节点,运行延迟 10 秒。所有对数据库的写入都以 w=majority 和 j=1 发出(我们的意思是 getLastError 调用设置了这些值)。

在 time=0 时从您的应用程序启动写入操作(可以是插入或更新)。在 time=5 秒时,主节点节点 1 停机一个小时,另一个节点被选为主节点。

节点 1 恢复时是否会回滚数据?选择最佳答案。

  1. 总是是的
  2. 总是没有
  3. 也许,这取决于节点 3 是否处理了写入。
  4. 也许,这取决于节点 2 是否处理了写入。

任何帮助将不胜感激。

4

3 回答 3

6

我将把我的答案改为 4,但它应该是 2,且 aw=majority。您可能有一个边缘情况,即wtimeout返回一个操作并且该操作没有得到大多数集合的确认。这些问题应该非常罕见或几乎不会发生,但要记住一些事情。

由于大多数节点(1 和 2)将确认写入,如果节点 1 发生故障,节点 2 应该有它的操作并达到最高速度,因为节点 1 不需要回滚到节点 2 的状态;相反,节点 1 将迎头赶上。

日志对于定义回滚是否存在并不那么重要。

于 2013-04-15T07:05:56.507 回答
1

请阅读 MongoDB 文档的相关摘录:“如果写操作在主要步骤关闭之前复制到副本集的另一个成员,并且该成员仍然可用并且可供大多数副本集访问,则不会发生回滚。”

于 2015-02-23T07:36:41.470 回答
1

我认为这是 Mongo DB 考试中的一个问题,但答案很容易看出:

也许,这取决于节点 2 是否处理了写入。

于 2015-07-14T02:57:03.563 回答