Mongodb在副本集中回滚

时间:2013-04-14 12:01:14

标签: mongodb

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

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

当节点1重新启动时,是否会有数据回滚?选择最佳答案。

  1. 永远是
  2. 始终没有
  3. 可能,这取决于节点3是否处理了写入。
  4. 可能,这取决于节点2是否处理了写入。
  5. 非常感谢任何帮助。

3 个答案:

答案 0 :(得分:6)

我打算将我的答案改为4,但是w =多数应该是2。您可能会遇到一个边缘情况,其中返回操作wtimeout并且操作未被大多数集合激活。这些问题应该非常罕见或几乎不会发生,但需要记住一些。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

  

可能,这取决于节点2是否已经处理了写入。