这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
今日继续学习分布式理论,主要笔记内容为二阶段提交、三阶段提交、MVCC等
二阶段提交(Two-phase commit):使基于分布式系统架构下的所有节点在进行事务提交时保持一致性。
分为Prepare阶段和Commit阶段。
三个假设:
- 引入协调者(coordinator)和参与者(participants),互相进行网络通信。
- 所有节点都采用预写式日志,且日志被写入后即被保持在可靠的存储设备上
- 所有节点不会被永久损坏,即使损坏后仍然可以恢复
在Prepare阶段,如果某个事务参与者(participants)反馈失败消息,说明该节点的本地事务执行不成功,必须回滚。
注意问题:
- 性能问题:两阶段提交需要多次节点间的网络通信,耗时过大,资源需要进行锁定,徒增资源等待时间。
- 协调者单点故障问题:如果事务协调者(coor)节点宕机,需要另起新的协调者,否则参与者处于中间状态无法完成事务。
- 网络分区带来的数据不一致:一部分参与者收到了Commit消息,另一部分参与者没收到Commit消息,会导致节点之间数据不一致。
三阶段提价:就是把Prepare阶段拆成了CanCommit和PreCommit机制。
解决了单点故障问题和阻塞问题。另外引入超时机制,在等待超时之后,会继续进行事务的提交。
MVCC版本控制:
- 悲观锁:操作数据库时直接把数据锁住,直到操作完成后才释放锁;上锁期间其他人不能修改数据。
- 乐观锁:不会上锁,只是在执行更新时判断别人是否修改数据,只有冲突时才放弃操作。
MVCC是一种并发控制方法,维持一个数据的多个版本使读写操作没有冲突。所以既不会阻塞写,也不阻塞读。MVCC为每个修改保存一个版本,和事务的时间戳相关联。可以提高并发性能,解决脏读问题。
总结:
主要学习了二阶段、三阶段提交的理论知识,而对于MVCC中时间戳在Spanner论文里通过TrueTime API提供一个物理时钟的方式。还需取看论文学习。