面试题答案
一键面试原子性保证
- 系统设计角度
- MongoDB 4.0 引入了多文档事务支持。对于跨分片的增删改查组合操作,事务机制可以确保这些操作要么全部成功,要么全部失败。事务通过两阶段提交(2PC)协议来协调各个分片上的操作。
- 在启动事务时,MongoDB 会为事务分配一个全局事务标识符(GTID)。各个分片上的操作会记录与该 GTID 相关的日志。
- 当事务进入提交阶段,协调者(通常是主分片)会向所有涉及的分片发送预提交请求。如果所有分片都成功预提交,协调者再发送提交请求,各个分片完成最终提交;如果有任何一个分片预提交失败,协调者会发送回滚请求,所有分片回滚操作。
- 底层实现角度
- 每个分片内部使用 WAL(Write - Ahead Logging)来记录操作。在事务预提交阶段,分片会将相关操作记录到 WAL 中,并生成预提交记录。在提交阶段,这些预提交记录会被转换为正式的提交记录。
- 为了确保操作的原子性,MongoDB 使用锁机制。在事务执行过程中,会对涉及的文档或集合加锁,防止其他并发事务修改相同的数据,直到当前事务完成。
性能权衡
- 优点
- 事务机制提供了强一致性的操作,对于一些对数据完整性要求极高的业务场景非常适用,例如银行转账等操作。确保了跨分片操作要么全部完成,要么全部不完成,不会出现部分成功部分失败的情况,从而保证数据的正确性。
- 缺点
- 锁开销:由于在事务执行过程中需要加锁,这会导致并发性能下降。其他事务可能需要等待锁释放才能执行,特别是在高并发环境下,锁竞争会变得更加激烈。
- 网络开销:两阶段提交协议需要协调者与各个分片之间进行多次网络通信。预提交和提交请求都需要在网络中传输,这增加了网络延迟和带宽消耗,特别是当分片之间的网络延迟较高时,对性能影响更大。
- 日志开销:为了支持事务的原子性,每个分片都需要记录详细的 WAL 日志。这不仅增加了存储开销,在写入日志和回放日志时也会带来一定的性能损耗。
一致性权衡
- 优点
- 跨分片事务通过 2PC 协议保证了强一致性。在事务提交后,所有分片上的数据状态是一致的,满足 ACID 中的一致性要求。这对于需要严格数据一致性的业务场景,如财务系统等,是非常重要的。
- 缺点
- 可用性降低:由于 2PC 协议的特性,如果某个分片在事务过程中出现故障,整个事务可能会被阻塞或回滚。例如,在预提交阶段某个分片不可用,协调者无法收到该分片的预提交结果,就不能继续提交事务,这可能导致整个系统的可用性降低。
- 延迟增加:为了保证一致性,事务执行过程中的协调和同步操作会增加延迟。特别是在跨数据中心部署的分片集群中,不同数据中心之间的网络延迟会进一步放大这种延迟,影响系统的响应时间。