目前OceanBase中还存在updaeserver单点,下一步的开发任务是使得OB支持多点写入,支持多个UPS(及updateserver)。
其中难点是如何设计两阶段提交的失败恢复以及多机的快照读写,和同事讨论后,形成一个可以work的简单设计版本,记录在此。
为分布式事务的两阶段提交细化具体流程,拟采用primary record方式实现失败恢复,即在进入commit阶段之前,先写入primary record 记录当前事务的状态(commit/rollback)。Primary record起到一个全局日志的作用,可供所有参与者读取。需要注意的是,为了保证一致性,读写primary record 都需要加锁,需要使用select update语句。
采用primary record 方式的优势是,协调者在整个事务处理过程中可以是无状态的,不需要记录操作日志,宕机重启后不需要做失败处理;而参与者宕机重启或超时失败后,可以无需与协调者以及其他参与者通信,实现独立恢复,实现简单。其缺点是每次分布式事务中都会记录一次primary record,会增加写入数据量以及事务延迟。
将两阶段提交的流程分为以下子流程描述:
Ø 协调者处理流程
Ø 参与者处理流程
Ø 未决事务处理流程
为支持长事务、长事务中长语句以及两阶段提交,文档还简单描述了对UPS日志的修改目标。
最后,文档简单记录了组内讨论实现多UPS快照读写的一些讨论结果。
1. 两阶段提交详细流程
Ø 协调者处理流程