2013-04-14 64 views
-20

假设您有一个三节点副本集。节点1是主要的。节点2是次要的,节点3是延迟10秒的次要运行。所有对数据库的写操作都是以w = majority和j = 1来发布的(我们的意思是getLastError调用具有这些值)。Mongodb在副本集中回滚

写入操作(可能是插入或更新)是从应用程序在时间= 0开始的。在时间= 5秒时,主节点1下降一小时,另一个节点被选为主节点。

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

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

任何帮助将不胜感激。

+0

5.取决于什么其他写你已经打算和节点1个节点2 – Sammaye

+0

感谢之间的复制滞后sammaye ....这可能是4个选项中选择最佳答案? –

+0

没有延迟的单次写操作我会去2,那么操作应该在故障转移时被复制到新的主服务器上,特别是当我在第一个评论中没有看到w =多数时,应该意味着2/3的成员应该确认写入,并且由于节点3被延迟,所以它不应该在那里确认它。 – Sammaye

回答

6

我打算将我的答案改为4,但是它应该是2,w =多数。你可能会遇到一个边缘情况,即返回一个操作的wtimeout,并且该操作没有被该集合的大部分所得到。这些问题应该是非常罕见的或者几乎从不发生,但需要牢记。由于大多数节点(1 & 2)将确认写入,所以如果节点1下降,则节点2应该有其操作并加速,因为节点1不需要回退到节点2的状态;相反,节点1将迎头赶上。

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

0

请阅读MongoDB的文档此相关的摘录:“回滚如果写操作复制到副本的另一个成员不发生设置之前的主要步骤下来,如果该成员仍然可用和可访问到大部分副本集合。“

1

我觉得这是从蒙戈DB考试一个问题,但得到的答复是不难看出:

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