分布式数据库MVCC读写设计,数据库mvcc读写


分布式数据库数据表分成多个parition,分布在不同server上,拓扑是每个server维护不同的版本时间戳,相比单机数据库,提供MVCC要复杂很多,当然,你如果有spanner的原子钟,那会简单很多。

现描述一种可行的实现方案,抛砖引玉。

此方案可以做如下保证:

  • 1.单Partition读(分分布式事务读)可以保重repeated read。

  • 2同一个server上的分布式事务可以保证repeated read,并且对外保证因果序列;

  • 3.跨partition不能保证因果序,但可保证repeated read

数据模型

  • 1.每个server上多个parition,每个是一个MVCC数据结构,即有多个版本的数据
  • 2 每个server上一个publish_id,表示版本小于此值的数据都可以读取到
  • 3 每个server上一个trans_id,表示后续写入的数据的版本都是大于此值

分布式事务写

  • 1在两阶段提交的prepare阶段,参与者发送prepare ack中携带一个版本号,即本地++trans_id的值
  • 2 协调者在收集到的parepare ack中选出时间戳最大的max_ver,发送commit
  • 3 参与者收到此请求后写commit日志,同时使用max_ver更新trans_id
  • 4 commit日志落盘后,修改publish_id,并释放行锁

分布式事务读

由于跨server的分布式读不作任何保证,只讨论同一个server的分布式读,简单来说,就是去publish_id作为版本号,如果目标行上有行锁,且行锁相关的版本号是小于publish_id的,则阻塞等待行锁释放,否则直接读取即可。nweet/stackedit

相关内容