TiDB学习笔记(十四)Percolator事务模型

一、三个组件

Percolator 包含三个组件:

  • Client:Client 是整个协议的控制中心,是两阶段提交的协调者(Coordinator);
  • TSO:一个全局的授时服务,提供全局唯一且递增的时间戳 (timetamp);
  • Bigtable:实际持久化数据的分布式存储;


TiDB学习笔记(十四)Percolator事务模型

二、数据存储:

需要关注三个column,c:lock , c:write , c:data :

c:data,存储数据本身

c:lock,在事务Prewrite的时候,会在此column中插入一条记录

c:write,在事务commit的时候,会在此column中插入一条记录


三、Prewrite阶段

  • 随机取一个写操作作为primary,其他的写操作则自动成为secondary。Percolator总是先操作primary。
  • 冲突检测:
  • 如果在start_ts之后,发现write列有数据,则说明有其他事务在当前事务开始之后提交了。这相当于2个事务的并发写冲突,所以需要将当前事务abort。
  • 如果在任何timestamp上发现lock列有数据,则有可能有其他事务正在修改数据,也将当前事务abort。
  • 锁定和写入:对于每一行每一列要写入的数据,先将它锁定(通过标记lock列,secondary的lock列会指向primary),然后将数据写入它的data列(timestamp就是start_ts)。此时,因为该数据的write列还没有被写入,所以其他事务看不到这次修改。



四、Commit阶段

  • 从TSO处获取一个timestamp作为事务的提交时间(后称为commit_ts)。
  • 提交primary, 如果失败,则abort事务:
  • 检查primary上的lock是否还存在,如果不存在,则abort。(其他事务有可能会认为当前事务已经失败,从而清理掉当前事务的lock)
  • 以commit_ts为timestamp, 写入write列,value为start_ts。清理lock列的数据。注意,此时为Commit Point。“写write列”和“清理lock列”由BigTable的单行事务保证ACID。
  • 一旦primary提交成功,则整个事务成功。此时已经可以给客户端返回成功了。secondary的数据可以异步的写入,即便发生了故障,此时也可以通过primary中数据的状态来判断出secondary的结果。具体分析可见故障恢复。
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章