Percolator 分布式事务原理

Percolator 分布式事务原理

简介

Percolator 提供了跨行、跨表的、基于快照隔离的 ACID 事务。

结构

Percolator 为了实现分布式事务,抽象了三个列。

列
    Data
        作用:
            具体存储数据集
        映射关系: {key, start_ts} => {value}
            key: 真实的 key
            start_ts: 事务开始时间戳
            value: 真实的数据值
    Lock
        作用:
            事务执行中产生的锁
            事务开启时获取锁
            事务提交时释放锁
        映射关系: {key, start_ts} => {primary_key, lock_type,..etc}
            key: 数据的 key
            start_ts: 事务开始时间戳
            primary_key: 该事务的 primary_key 的引用. primary_key 是在事务执行时,从待修改的 keys 中选择一个作为 primary_key, 其余的则作为 secondary key.
    Write
        作用:
            已提交事务信息,存储提交时间戳
            write 列记录着 key 的提交记录,当客户端读取一个 key 时,会从 write 列中读取 key 所对应数据在 data 列中的存储位置,然后从 data 列中读取真正的数据。
        映射关系:
            {key, commit_ts} => {start_ts}
                key: 数据的 key
                commit_ts: 事务的提交时间戳
                start_ts: 事务开始时间戳, 指向该数据在 data 中的实际存储位置

流程

写流程

1.Prewrite阶段
    1.从 TSO 获取 start_ts
    2.尝试对所有被写元素加锁, percolator 为所有需要写的 key 选出一个作为 primary, 其余的作为 secondary
        1.每个 key 处理流程如下,中间出现失败,则 Prewrite 失败(先 Prewrite primary,成功后再 Prewrite secondaries)
            1.检查 write-write 冲突
                若 write 列当前 key 的最新数据 commit_ts 大于等于 start_ts,存在更新版本的已提交事务,失败,直接 Abort 整个事务
            2.检查 lock 列中该写入操作是否被上锁
                若 key 已被上锁,失败,直接 Abort 整个事务
        2.Lock 列写入 lock(start_ts, key, primary) 为当前 key 加锁
            若当前 key 被选为 primary, 则标记为 primary;
            若为 secondary, 则标明指向 primary 的信息
    3.Data 列写入 data(key, start_ts, value)
        由于此时 write 列尚未写入,因此数据对其它事务不可见
2.Commit阶段
    1.从 TSO 获取 commit_ts
    2.依次对各个 key 进行提交
        1.先 Commit primary , 如果失败则 Abort 事务
            检测 lock 列 primary 对应的锁是否存在,如果锁已经被其它事务清理(触发 failover 可能导致该情况),则失败。
            写入 Write 列: commit_ts -> data 列的 start_ts
            释放锁:删除 Lock 列当前 key
        2.再异步的进行 Commit secondary
            Commit seconary 无需检测 lock 列锁是否还存在,一定不会失败
            写入 Write 列: commit_ts -> data 列的 start_ts
            释放锁:删除 Lock 列当前 key

读流程

1.Get 操作首先检查 [0, start_ts] 时间区间内 Lock 是否存在
    1.若存在,则返回错误
    2.如果不存在有冲突的 Lock
        1.获取在 Write 中合法的最新提交记录指向的在 Data 中的位置
        2.从 Data 中获取到相应的数据并返回

异常处理流程(异步清理锁)

若 Client 在 Commit 一个事务时,出现了异常,Prewrite 时产生的锁会被留下。为避免将新事务 hang 住,Percolator 必须清理这些锁。

Percolator 用 lazy 方式处理这些锁:
当事务 A 在执行时,发现事务 B 造成的锁冲突,事务 A 将决定事务 B 是否失败,以及清理事务 B 的那些锁。

根据key 从 Lock 列查询 primary 锁
1.若 primary lock 存在
    事务B被 roll back
        因为我们总是最先提交 primary, 所以 primary 未被提交时,可以安全地执行回滚
2.若 primary lock 不存在
    说明 primary lock 已被 WRITE 所替代,也就是说该事务已被提交,事务需要 roll forword
        因为:在 B 提交 commit 之前, 它会先确保其 primary lock 被 write record 所替代(即往 primary 的 write 写提交数据,并删除对应的 lock)。

参考

Percolator论文

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FlyingZCC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值