MST

星途 面试题库

面试题:MongoDB副本集成员故障时的数据一致性处理

当MongoDB副本集的一个成员发生故障,且故障期间有新的数据写入,在该成员恢复后,如何保证数据的一致性?请详细描述相关机制和操作步骤。
43.2万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试
  1. MongoDB副本集数据同步机制
    • MongoDB副本集通过 oplog(操作日志)来保证数据一致性。主节点(Primary)将所有写操作记录到 oplog 中,从节点(Secondary)定期从主节点拉取 oplog 并应用这些操作,从而保持与主节点数据同步。
  2. 故障成员恢复后的处理
    • 自动同步
      • 当故障成员恢复后,它会自动尝试与当前主节点进行同步。它会从主节点获取自己缺失的 oplog 部分。
      • 例如,如果故障期间主节点有数据写入,生成了新的 oplog 记录,恢复的节点会根据自己最后已知的 oplog 位置,请求主节点从该位置之后的 oplog 记录。
      • 恢复节点获取到 oplog 后,会按顺序应用这些操作,就像主节点执行写操作时一样,从而使自身数据与主节点保持一致。
    • 手动干预(特殊情况)
      • 步骤一:确认节点状态
        • 可以使用 rs.status() 命令查看副本集的状态,确认恢复节点的状态。如果恢复节点长时间处于 RECOVERING 状态,可能存在同步问题。
      • 步骤二:强制重新同步
        • 如果自动同步出现问题,可以考虑强制该节点重新同步。首先将该节点从副本集中移除,使用 rs.remove("hostname:port") 命令(将 hostname:port 替换为实际故障恢复节点的地址和端口)。
        • 然后将该节点重新加入副本集,使用 rs.add("hostname:port") 命令。重新加入后,节点会重新进行完整的数据同步,从主节点获取全部数据(而不是仅同步故障期间缺失的部分),这可以确保数据一致性。不过这种方式可能在数据量较大时花费较长时间。