Percolator 分布式事务原理

embedded/2025/2/16 5:23:26/

Percolator__0">Percolator 分布式事务原理

简介

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

结构

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

列Data作用:具体存储数据集映射关系: {key, start_ts} => {value}key: 真实的 keystart_ts: 事务开始时间戳value: 真实的数据值Lock作用:事务执行中产生的锁事务开启时获取锁事务提交时释放锁映射关系: {key, start_ts} => {primary_key, lock_type,..etc}key: 数据的 keystart_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: 数据的 keycommit_ts: 事务的提交时间戳start_ts: 事务开始时间戳, 指向该数据在 data 中的实际存储位置

流程

写流程

1.Prewrite阶段1.从 TSO 获取 start_ts2.尝试对所有被写元素加锁, percolator 为所有需要写的 key 选出一个作为 primary, 其余的作为 secondary1.每个 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_ts2.依次对各个 key 进行提交1.先 Commit primary , 如果失败则 Abort 事务检测 lock 列 primary 对应的锁是否存在,如果锁已经被其它事务清理(触发 failover 可能导致该情况),则失败。写入 Write 列: commit_ts -> data 列的 start_ts释放锁:删除 Lock 列当前 key2.再异步的进行 Commit secondaryCommit seconary 无需检测 lock 列锁是否还存在,一定不会失败写入 Write 列: commit_ts -> data 列的 start_ts释放锁:删除 Lock 列当前 key

读流程

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

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

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

Percolatorlazy 方式处理这些锁:
当事务 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论文


http://www.ppmy.cn/embedded/42095.html

相关文章

介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。

Docker是一种开源的容器化平台,它可以将应用程序及其所有依赖项打包为一个可以在任何环境中运行的独立容器。下面是Docker的基本概念和优势以及在应用程序开发中的实际应用。 基本概念: 镜像(Image):镜像是Docker的基…

【大模型微调】一文掌握7种大模型微调的方法

本篇文章深入分析了大型模型微调的基本理念和多样化技术,细致介绍了LoRA、适配器调整(Adapter Tuning)、前缀调整(Prefix Tuning)等多个微调方法。详细讨论了每一种策略的基本原则、主要优点以及适宜应用场景,使得读者可以依据特定的应用要求和计算资源限…

美易官方:早盘纳指与标普500指数创盘中历史新高

早盘,纳斯达克指数与标普500指数纷纷展现出强劲的涨势,双双创下盘中历史新高,成为市场关注的焦点。这一显著成就不仅彰显了美国经济的稳健与活力,也反映出全球投资者对于未来市场发展的乐观预期。 美股周三早盘继续上扬&#xff…

git 问题解决笔记

最近办公电脑坏了送去返修 申请了一个备用机 然后忘记了coding.net的密码 重新改了密码 电脑修好之后发现自己本来的项目拉不了代码了 如下 remote: CODING 提示: Authentication failed. remote: 认证失败,请确认您输入了正确的账号密码。 fatal: Authentication …

当前社会知识技术的重要性

在当今社会,知识技术的重要性已经不言而喻。随着科技的飞速发展,人类社会正经历着前所未有的变革。在这个过程中,知识技术成为了推动社会进步的关键力量。本文将从以下几个方面探讨知识技术在当前社会中的重要性。 首先,知识技术是提高生产力的关键因素。在过去的几十年里,…

学习MySQL(四):记录的增删改查

记录的增、删、改 增 -- 插入一条数据 INSERT INTO 表名(字段 1,字段2,字段3) VALUES(值 1,值2,值3) INSERT INTO 表名 VALUES(值 1,值2,值3&am…

【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置

本节博客主要是通过“在排序数组中查找元素的第一个和最后一个位置”总结关于二分算法的左右界代码模板,有需要借鉴即可。 目录 1.题目2.二分边界算法2.1查找区间左端点2.1.1循环条件2.1.2求中点的操作2.1.3总结 2.2查找区间右端点2.1.1循环条件2.1.2求中点的操作2.…

树莓派、ubuntu低版本python3安装库

如果遇到树莓派中自带低版本python3,又不想额外去安装python3时,可能会遇到版本过低,无法安装库的情况,以下用我实际情况举例解决方案。 本次遇到的问题是树莓派低版本中,python3为3.7.3,需要安装numpy&am…