Epoxy:跨不同数据存储的 ACID 事务

Epoxy 利用 Postgres 事务数据库作为主数据库/协调数据库,并扩展多版本并发控制 (MVCC) 以实现跨数据存储隔离。它通过乐观并发控制 (OCC) 和两阶段提交 (2PC) 协议提供隔离性以及原子性和持久性。

环氧树脂被用作五种不同数据存储的接口层:Postgres, MySQL, Elasticsearch, MongoDB, 和Google Cloud Storage (GCS).

Epoxy 是开源的,网址为  https://github.com/DBOS-project/apiary。

Epoxy 的动机是为面对两种日益流行的趋势提供交易保证,这使得实现这一目标变得更加困难。**异构数据:**除了数据库记录之外,应用程序还存储和访问大型媒体 blob。  **微服务:**许多系统由多个服务组成,每个服务管理自己的数据。

酒店预订应用程序:客房供应服务将数据存储在 Postgres 中。客户预订服务将数据存储在 MongoDB 中。工作负载包括 80%:搜索可用房间,在 Postgres 中执行读取,在 MongoDB 中执行地理空间搜索;20%:预订房间,在 Postgres 中执行读取和更新,在 MongoDB 中执行插入。如果没有 Epoxy,这些操作将无法以原子和隔离的方式执行,从而导致异常。

电子商务服务:购物车和目录存储在 Postgres 中,目录复制到 Elasticsearch 以进行快速搜索。工作负载包括 90%:搜索和添加项目(Elasticsearch 搜索和 Postgres 读取、插入、更新),8%:结账(Postgres 读取、删除、两次插入,用于购物车到订单的转换),1%:目录插入(Postgres 和 Elasticsearch),1%:目录更新(Postgres 和 Elasticsearch)。如果没有 Epoxy,并发搜索和添加以及目录更新可能会导致购物车添加错误。

Epoxy 协议方法
Epoxy 的想法是提供螺栓式事务支持,利用 Postgres 作为协调器/主数据库,并通过添加填充层将额外的数据存储加入到此设置中。(请注意,协调器和主数据库略有不同。协调器是主数据库之上的垫片。)

解决这个问题的现状如何?如果您没有 Epoxy 来解决这个问题,您将自己编写自定义粘合代码。您将采用以工作流为中心的解决方案,并在粘合代码中嵌入/强制执行业务应用程序逻辑。

某种程度上(以定制的方式),您可以将 OLTP 事务扩展到应用程序中。但这是定制的,并且更难重用,并且处理原子性和隔离性的表面积很大,因为你会在你的代码库中涂抹它。

作为一个更可重用、抽象化的解决方案,您可以考虑使用分布式事务协议(如X/Open XA ),基于两阶段提交,以便跨数据存储执行事务。然而,X/Open XA 缺乏事务隔离,仅提供原子性。Epoxy 通过提供快照隔离超越了 X/Open XA,使其成为更强大的解决方案。

此外,X/Open XA 方法要求数据存储实现两阶段提交的参与者协议,从而造成与 MongoDB、CockroachDB 和 Redis 的兼容性问题。此外,在像S3/GCS这样的非事务性数据存储中,实现X/Open XA的“准备”步骤是不可行的。

Epoxy 协议:设置
在了解 Epoxy 如何提供跨数据存储的事务保证之前,我们先回顾一下 Epoxy 对主数据库(用作协调器)和辅助数据存储的要求。主数据库必须提供至少具有快照隔离的 ACID 事务。这是使用 Epoxy 中的 Postgres 实现的。二级存储必须确保:

  • 单对象写入操作是可线性化且持久的。

  • 每条记录都有一个唯一可识别的密钥。

  • [可选地提高性能]记录可以包含元数据,并且可以根据该元数据有效地过滤数据存储中的查询。

Epoxy 使用四种数据存储来实现:Elasticsearch、MongoDB、GCS、MySQL,满足这些辅助存储要求。
Epoxy 成为访问辅助存储表的独占模式:使用该存储的一个应用程序采用 Epoxy,强制访问该表进行操作的所有应用程序都采用 Epoxy。

每个 Epoxy 事务都链接到一个快照,代表其可见的所有过去事务的集合。快照表示使用两个事务 ID xmin 和 xmax,以及最近提交的事务列表 rc_txns。创建快照时:

  • xmin 是最小的活动事务 ID。
  • xmax 被指定为大于已提交的最大事务 ID 的值。
  • rc_txns 表示 ID 大于 xmin 的已提交事务的集合。
  • 如果 (x < xmin) \/ (x \in rc_txns),则 ID 为 x 的事务位于快照中。

Epoxy 辅助存储垫片通过元数据增强记录版本,以促进事务读取操作。记录版本对事务的可见性取决于事务快照中是否存在 beginTxn 以及事务快照中是否存在 endTxn。

  • 记录版本用两个值标记:beginTxn 和 endTxn。
  • beginTxn 表示创建记录版本的事务的 ID。
  • endTxn 是用新版本取代它或删除记录的事务的 ID。

Epoxy协议:OCC
Epoxy 采用两阶段提交 (2PC) 协议。辅助存储首先在其数据库内进行准备,然后主存储结束事务提交(或中止)。

辅助存储S在执行事务T时,在写入之前获取记录键上的排他锁(如果锁定失败,则T被中止)。因此,每个辅助存储垫片都为其记录包含一个锁管理器,为每个记录维护一个独占写锁。此锁可防止对先前记录版本的 endTxn 字段进行并发修改。

完成 T 后,S 通过获取独占(S 本地)验证锁来验证它。然后,S 检查 T 写入的密钥是否也由不在 T 快照中的已提交事务写入。如果验证成功,S 临时将 T 标记为已提交,释放锁,并投票提交。

仅当所有辅助存储都成功验证时,事务才会提交;否则,它将中止并回滚。通过在主数据库上执行提交操作来提交事务。主数据库上的原子提交可确保事务对所有数据存储上的未来事务可见(出现在其快照中)。辅助存储在获悉提交后释放写锁(或者如果决定中止,也用于完成回滚)。

如果事务验证失败或在任何数据存储中遇到任何错误,它将启动中止。为了防止无限期挂起客户端故障,如果与客户端的连接超时,协调器也会中止事务。中止过程删除新添加的记录版本,并恢复记录 endTxn 字段论文列出了以下正确性不变量:

  • SI1:T 始终从 T 启动时有效的已提交信息的快照中读取数据。
  • SI2:仅当在提交时快照之外没有已提交的事务修改了打算由 T 写入的数据时,T 才能提交。
  • AC1:达成决策的所有流程都会达成相同的决策。
  • AC2:流程一旦做出决定,就无法逆转。
  • AC3&4:只有当所有进程都投票“是”时,才会做出提交决策。在没有失败且一致投赞成票的情况下,决定提交。
  • AC5:在任何具有容忍故障(崩溃故障)的执行中,如果所有故障都被修复并且在足够长的时间内没有新的故障发生,则所有进程最终都会做出决定。

如果主数据库/协调数据库发生故障,辅助存储将无法接受任何写入/更新,直到主数据库/协调数据库恢复并恢复数据为止。但它们可以提供读取服务。主/协调器故障意味着辅助存储中活动事务的中止和回滚。在发生次要或主要故障时,目标是让它们备份,并恢复辅助存储以反映已提交的事务,从而建立崩溃一致的状态。

局限性和开销
Epoxy 需要单个协调器/主节点。对于多个主选,事情会变得复杂/复杂,并且跨主选所需的分布式事务效率低下。在云中,可以使用 AWS RDS/Aurora 扩展单个 Postgres 协调器。对于地理分布,可以通过分布式 SQL 产品提供虚拟/单个协调器。

Epoxy 需要对辅助存储表进行独占访问。如果客户端在不使用 Epoxy 的情况下进行写入,则缺少版本信息会使写入对读取不可见。同样,不使用 Epoxy 进行读取可能会暴露同一记录的冲突版本。辅助存储表上的一个应用程序采用 Epoxy 需要该表上的所有其他应用程序执行相同的操作。

更高的开销来自垃圾收集。由于 Epoxy 的 MVCC 方法是通过写入创建新记录版本而不是更新现有记录,因此清理旧版本至关重要。仅当记录版本不再对任何事务可见时(由所有活动事务的快照中的 endTxn 指示),记录版本才会被删除。因此,事务协调器应该定期执行垃圾收集。垃圾收集器扫描所有活动事务以识别最小的 xmin,代表最旧的活动事务。然后,它指示辅助存储垫片删除 endTxn 小于此最小活动 xmin 的记录版本。

https://www.jdon.com/69782.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/145111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计基于STM32F103C8T6微控制器的巡线小车

巡线小车是一种能够在一条预定线追踪路径的小车&#xff0c;广泛应用于工业自动化、物流仓储、智能家居等领域。本设计将使用STM32F103C8T6微控制器来实现一个基础的巡线小车。 硬件组成&#xff1a;1. STM32F103C8T6微控制器开发板&#xff1a;作为巡线小车的核心控制器&…

如何快速搭建Spring Boot接口调试环境并实现公网访问

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

用归并排序算法merge_sort( )求解 逆序对的数量 降低时间复杂度为 nlogn

题目简述 给定一个序列有n个数&#xff0c;求n个数中逆序对的个数&#xff0c;逆序对的定义&#xff1a;i < j && a[i] > a[j]。 输入格式 第一行包含一个整数n。 第二行包含 n 个整数&#xff08;所有整数均在1~1e9范围内&#xff09;&#xff0c;表示整数数…

Maven项目指定main方法配置

例如有个maven工程 打包后 xxx.jar 而这个maven工程里可能有很多main方法,比如测试的main方法 插件指定 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId>&…

docker创建service时动态获取服务名 模版占位符

docker 模板占位符{{xxx}}&#xff1a; 官方文档&#xff1a;https://docs.docker.com/engine/reference/commandline/service_create/#create-services-using-templates docker service create --name test --env SERVICE_NAME{{.Service.Name}} --mount typebind,src/dat…

Python武器库开发-flask篇之模板渲染(二十四)

flask篇之模板渲染(二十四) Flask 中的模板是一种将数据和 HTML 代码组合在一起的方式&#xff0c;使得我们可以生成动态的 HTML 页面。使用模板可以使我们的代码更加简洁、易于维护和复用。在真实的环境中&#xff0c;我们往往接触到的是由 html、CSS和JavaScript所做的网页&…

目标检测YOLO实战应用案例100讲-基于改进YOLO算法的加油站监控场景目标检测

目录 前言 国内外研究现状 传统目标检测算法 深度学习目标检测算法

【教3妹学编程-算法题】购买物品的最大开销

3妹&#xff1a;2哥&#xff0c;听说你今天发工资啦&#xff1f; 请我吃饭怎么样&#xff0c;嘿嘿 2哥 : 切&#xff0c;你上周还发工资了呢&#xff0c;也没见你请我吃饭。 3妹&#xff1a;哎呀&#xff0c; 我的工资都用来双11 shopping了&#xff0c; 双11过后我都吃了1周土…

【转载】快速搭建OpenGL环境!!!Windows10 + Visual Studio 2019 搭建OpenGL环境

目录 具体链接&#xff1a; 【转自】 完成后效果如下&#xff1a; 一开始的爆红&#xff1a; 下载安装后&#xff1a; 运行成功&#xff1a; 具体链接&#xff1a; 萌新向&#xff01;&#xff01;&#xff01;Windows10 Visual Studio 2019 搭建OpenGL环境&#xff08;…

基于springboot实现体育场馆运营平台项目【项目源码】

基于springboot实现体育场馆运营管理系统演示 系统开发平台 在该数码论坛系统中&#xff0c;Eclipse能给用户提供更多的方便&#xff0c;其特点一是方便学习&#xff0c;方便快捷&#xff1b;二是有非常大的信息储存量&#xff0c;主要功能是用在对数据库中查询和编程。其功能…

2024清理mac苹果电脑内存免费工具CleanMyMac X4.15

当你使用苹果电脑时&#xff0c;内存的优化和清理变得至关重要。随着时间的推移&#xff0c;我们的电脑内存可能会变得拥挤&#xff0c;导致性能下降。清理内存可以提高电脑的速度和反应能力&#xff0c;并确保它始终在良好状态下运行。本文将向您介绍怎么清理苹果电脑内存的方…

深眸科技革新升级OCR技术,与AI视觉实现有效融合赋能各行业应用

OCR即光学字符识别&#xff0c;是通过扫描仪或工业相机等电子设备检查打印的字符&#xff0c;并通过检测暗、亮的模式确定其形状&#xff0c;然后用字符识别方法将形状翻译成计算机文字的过程。 目前&#xff0c;随着机器视觉和人工智能技术的进一步升级&#xff0c;OCR技术实…

鸿蒙原生应用开发-折叠屏、平板设备服务卡片适配

一、多设备卡片适配原则 为不同尺寸的卡片提供不同的功能 在卡片开发过程中请考虑适配不同尺寸的设备&#xff0c;特别是在折叠屏和平板设备上&#xff0c;设备屏幕尺寸的变化直接影响了卡片内容的展示。请发挥想象力设计具有自适应能力的卡片&#xff0c;避免在卡片内容不做…

代码随想录图论|130. 被围绕的区域 417太平洋大西洋水流问题

130. 被围绕的区域 **题目&#xff1a;**给你一个 m x n 的矩阵 board &#xff0c;由若干字符 ‘X’ 和 ‘O’ &#xff0c;找到所有被 ‘X’ 围绕的区域&#xff0c;并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 题目链接&#xff1a;130. 被围绕的区域 解题思路&#xff1a…

物联网AI MicroPython学习之语法 I2C总线

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; I2C 介绍 模块功能: I2C Master设备驱动 接口说明 I2C - 构建硬件I2C对象 函数原型&#xff1a;I2C(id, scl, sda, freq)参数说明&#xff1a; 参数类型必选参数&#xff1f;说明idintYI2C外设&#xff…

数据结构(c语言版本) 二叉树的遍历

要求 实现二叉树的创建&#xff0c;并输入二叉树数据 然后先序遍历输出二叉树、中序遍历输出二叉树、后序输出二叉树 例如二叉树为&#xff1a; 该二叉树的先序遍历结果为&#xff1a; A B D C E F 该二叉树的中序遍历结果为&#xff1a; B D A E C F 该二叉树的后序遍历结果…

xss 漏洞

1、XSS类型 XSS攻击大致上分为3类&#xff1a; 反射型xss&#xff0c;DOM型xss&#xff0c;存储型xss。前两类为非持久性xss&#xff0c;后者为持久型xss。 1.1 非持久型xss&#xff1a; 1&#xff09;反射型 XSS 攻击相对于访问者而言是一次性的&#xff0c;具体表现在恶意…

Mybatis的Mapper接口传递多个参数的时候必须要加@Param注解吗?

答案是&#xff1a;不一定&#xff0c;取决于mybatis的版本、jdk的版本和javac的编译选项。 测试代码 Maven依赖&#xff1a; <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId>…

linux三次握手、四次挥手

TCP协议是一个安全的、面向连接的、流式传输协议&#xff0c;所谓的面向连接就是三次握手&#xff0c;对于程序猿来说只需要在客户端调用connect()函数&#xff0c;三次握手就自动进行了。先通过下图看一下TCP协议的格式&#xff0c;然后再介绍三次握手的具体流程。 1.tcp协议…

kafka个人笔记

大部分内容源于https://segmentfault.com/a/1190000038173886, 本人手敲一边加强印象方便复习 消息系统的作用 解耦 冗余 扩展性 灵活性&#xff08;峰值处理 可恢复 顺序保证 缓冲 异步 解耦&#xff1a;扩展两边处理过程&#xff0c;只需要让他们遵守约束即可冗余&#xf…