面试题答案
一键面试确保数据一致性的基本机制
- 两阶段提交(2PC):
- MongoDB在事务故障转移场景下利用两阶段提交来确保数据一致性。在第一阶段(准备阶段),协调者(通常是主节点)向所有参与事务的节点(副本集成员)发送准备请求。这些节点会执行事务操作,但不会提交,而是将操作结果和日志记录保存下来,并向协调者回复准备完成情况。
- 在第二阶段(提交或回滚阶段),如果所有节点都准备成功,协调者会向所有节点发送提交请求,节点收到后正式提交事务;如果有任何一个节点准备失败,协调者会发送回滚请求,所有节点将回滚事务,撤销已执行的操作,从而保证数据一致性。
- 多数写确认(Majority Write Concern):
- 对于事务涉及的写操作,MongoDB使用多数写确认机制。即写操作必须在大多数副本集成员上成功执行并确认,才认为该写操作成功。这确保了即使在故障转移过程中,已确认的写操作在多数节点上持久化,防止数据丢失或不一致。例如,在一个包含5个节点的副本集中,至少需要3个节点确认写操作,写操作才被视为成功。
关键组件
- 协调者(Coordinator):
- 通常是副本集的主节点担任协调者角色。它负责发起事务,在两阶段提交过程中协调各个参与节点,收集准备阶段的结果,并决定最终是提交还是回滚事务。协调者跟踪事务的状态,并确保所有参与节点遵循相同的事务结果。
- 参与者(Participants):
- 副本集的各个成员(包括主节点和从节点)都是事务的参与者。它们接收协调者的请求,执行事务操作,并在准备阶段向协调者汇报准备情况。在提交或回滚阶段,按照协调者的指令进行相应操作。
操作流程
- 事务开始:
- 客户端发起事务请求,连接到副本集的主节点(协调者)。主节点开始跟踪事务状态,并为事务分配唯一标识符。
- 准备阶段:
- 协调者向所有参与事务的节点(参与者)发送准备请求,其中包含事务操作的详细信息。
- 各个参与者接收到请求后,执行事务中的操作,并将操作记录和日志保存到本地。然后向协调者回复准备结果,表明是否成功准备好提交事务。
- 提交或回滚决策:
- 协调者收集所有参与者的准备结果。如果所有参与者都准备成功,协调者决定提交事务;如果有任何一个参与者准备失败,协调者决定回滚事务。
- 提交或回滚阶段:
- 如果决定提交事务,协调者向所有参与者发送提交请求。参与者收到提交请求后,正式提交事务,使事务操作对数据可见。
- 如果决定回滚事务,协调者向所有参与者发送回滚请求。参与者收到回滚请求后,撤销已执行的事务操作,恢复到事务开始前的状态。
- 事务结束:
- 协调者向客户端返回事务结果(成功或失败),完成整个事务流程。在故障转移情况下,如果主节点发生故障,新选举出的主节点会通过两阶段提交的记录和日志,继续完成未完成的事务,确保数据一致性。