分布式数据库数据表分成多个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
时间: 2024-10-29 19:05:42