当前位置: 首页 > news >正文

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

相关文章:

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

Epoxy 利用 Postgres 事务数据库作为主数据库/协调数据库&#xff0c;并扩展多版本并发控制 (MVCC) 以实现跨数据存储隔离。它通过乐观并发控制 (OCC) 和两阶段提交 (2PC) 协议提供隔离性以及原子性和持久性。 环氧树脂被用作五种不同数据存储的接口层&#xff1a;Postgres, M…...

鸿蒙:从0到“Hello Harmony”

效果展示 一.概述 明年华为鸿蒙就不再兼容Android生态了&#xff0c;作为拥有7亿终端用户的华为&#xff0c;建立自己的生态也是理所当然。 所以对HarmonyOS的研究也是众多开发者绕不开的坎了。 今天这篇博文主要实现一个“Hello Harmony&#xff01;”的Demo。 二.官方链接…...

istio安装文档

1、重装命令 istioctl manifest generate --set profiledemo | kubectl delete --ignore-not-foundtrue -f - 2、下载 参考&#xff1a;02、istio部署到k8s中 - 简书 (jianshu.com) 参考 Istio / 入门 curl -L https://istio.io/downloadIstio | ISTIO_VERSION1.20.0 TAR…...

修改CentOS默认mail发件人名称

修改CentOS默认mail发件人名称 在CentOS中&#xff0c;可以通过修改邮件发送配置文件来修改默认的邮件发件人名称。以下是一些步骤&#xff0c;您可以根据您的实际情况进行修改&#xff1a; 打开终端或SSH连接到CentOS服务器。使用文本编辑器&#xff08;如vi或nano&#xff0…...

Trigger替换Demo

maven工程 pom依赖 <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version> </dependency> import org.quartz.Job; import org.quartz.JobExecutionContext; imp…...

iApp祁天社区UI成品源码 功能齐全的社区应用

iApp祁天社区UI成品源码是一个非常实用的资源&#xff0c;提供了完整的源代码&#xff0c;可以帮助您快速搭建一个功能齐全的社区应用。 这个源码具有丰富的UI设计&#xff0c;经过精心调整和优化&#xff0c;确保用户体验流畅而舒适。它不仅具备基本的社区功能&#xff0c;如…...

python基于BAC0库进行bacnet IP的读写

python基于BAC0库进行bacnet IP的读写 实现内容&#xff1a;基于BAC0库实现对一台虚拟bacnet设备的扫描、点位读取和点位数据写入。 开发环境 python3.9 pip下载BAC0库 功能实现 # 扫描设备myIPAddr 192.168.90.81/24bacnet BAC0.lite(ipmyIPAddr)devices bacnet.whois(…...

CSDN每日一题学习训练——Python版(简化路径,不同的二叉搜索树)

版本说明 当前版本号[20231116]。 版本修改说明20231116初版 目录 文章目录 版本说明目录简化路径题目解题思路代码思路参考代码 不同的二叉搜索树题目解题思路代码思路参考代码 简化路径 题目 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路…...

milvus集合管理

一、创建集合 集合由一个或多个分区组成。在创建新集合时&#xff0c;Milvus会创建一个默认分区_default 1.准备模式 需要创建的集合必须包含一个主键字段和一个向量字段。INT64和String是主键字段支持的数据类型。 首先&#xff0c;准备必要的参数&#xff0c;包括字段模式、…...

基于SSM的教学管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

【第2章 Node.js基础】2.7 Node.js 的流(一)可写流

&#x1f308;可写流 &#x1f680;什么是可写流 可写流是对数据被写入的目的地的一种抽象。 所有可写流都实现了 stream.Writable类定义的接口。 可写流的例子包括&#xff0c;也都是实现了可写流接口的双工流 客户端的 HTTP 请求、服务器的HTTP 响应、fs 的写入流、zlib…...

【kerberos】使用 curl 访问受 Kerberos HTTP SPNEGO 保护的 URL

前言&#xff1a; 大数据集群集成 Kerberos 后&#xff0c;很多 WEBUI 打开都会提示输入用户名和密码。由于我想获取 flink 任务的详情&#xff0c;且KNOX 并不支持Flink api&#xff0c;查看KNOX 直接的列表&#xff1a;https://docs.cloudera.com/cdp-private-cloud-base/7.…...

基于SSM的智慧养老平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

图像生成colab集合

不过colab会做检测&#xff0c;一般文生图算法是基本很难跑起来的。 https://github.com/camenduruhttps://github.com/camenduru这哥们有很多colab。 1.stable-diffusion-webui https://colab.research.google.com/drive/1Iy-xW9t1-OQWhb0hNxueGij8phCyluOh#scrollTow3KNZ-…...

SpringBoot整合Quartz示例

数据表 加不加无所谓,如果需要重启服务器后重新执行所有JOB就把sql加上 如果不加表 将application.properties中的quartz数据库配置去掉 自己执行自己的逻辑来就好,大不了每次启动之后重新加载自己的逻辑 链接&#xff1a;https://pan.baidu.com/s/1KqOPYMfI4eHcEMxt5Bmt…...

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

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

RocketMQ的适用场景有哪些?

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…...

ubuntu启动转圈,无法进入登录界面

安装卸载搜狗拼音输入法相关东西后出现启动转圈问题 当前使用的是lightdm,按网上说去切换成gdm3 &#xff08;1&#xff09;要在刚进入系统没显示圈圈和ubuntu时长按shift进入gurb。 &#xff08;2&#xff09;选择Ubuntu高级选项&#xff0c;enter &#xff08;3&#xff09…...

MATLAB 机械臂逆运动学进行轨迹控制建模

系列文章目录 文章目录 系列文章目录前言一、模型概览1.1 Target Pose Generation 目标姿势生成1.2 Inverse Kinematics 逆运动学1.3 Manipulator Dynamics 机械手动力学1.4 Pose Measurement 姿势测量 二、机械手定义三、生成航点四、模型设置五、模拟机械手运动六、将结果可视…...

【计算机组成原理】定点加法、减法运算

系列文章目录 绘制出纯整数(1字节)和纯小数的数轴 将十进制数20.59375&#xff0c;转换成754标准的32位浮点数的二进制存储格式 用双符号位补码求 x 0.1010011, y -0.1001010, 分别求出 x y, x - y&#xff0c;并判溢出...

scp 跨服务器传输命令,把一个服务器上的文件复制传到当前服务器目录下

要将一个服务器上的文件复制到当前服务器的目录下&#xff0c;可以使用 scp 命令进行跨服务器传输。以下是具体的命令格式&#xff1a; 复制 scp usernamesource_server:/path/to/source_file destination_directory username: 远程服务器的用户名。 source_server: 远程服务…...

【python基础】用户输入和while循环详解

文章目录 一. 函数input()的工作原理1. 编写清晰的程序2. 使用int()来获取数值输入3. 求模运算符 二. while循环简介1. 使用while循环2. 让用户选择何时退出3. 使用标志4. 使用break退出循环5. 在循环中使用continue 三. 使用while循环处理列表和字典1. 在列表之间移动元素2. 删…...

k8s-部署Redis-cluster(TLS)

helm pull bitnami/redis-cluster v8.3.8拉取源码生成证书 git clone https://github.com/redis/redis.git #文档 https://redis.io/docs/management/security/encryption/#getting-started生成你的TLS证书用官网的工具生成 1 Run ./utils/gen-test-certs.sh 生成根CA和服务…...

计算机毕业设计选题推荐-幼儿园管理微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

ElasticStack日志分析平台-ES 集群、Kibana与Kafka

一、Elasticsearch 1、介绍&#xff1a; Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;Logstash 和 Beats 收集的数据可以存储在 Elasticsearch 中进行搜索和分析。 Elasticsearch为所有类型的数据提供近乎实时的搜索和分析&#xff1a;一旦数据被索引&#…...

微机原理_10

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。&#xff09; 1,将二进制数110110.01转换为十六进制为(&#xff09; A. 66.1H B. 36.4H C. 66.4 D. 36.2 2,一台计算机的字长是4个字节,含义是(&#xff09; A.能处理的最大…...

(SpringBoot)第八章:SpringMVC程序开发

文章目录 一:Spring MVC概述(1)什么是Spring MVC(2)什么是MVC(3)Spring MVC和SpringBoot(4)如何学习Spring MVC二:Spring MVC创建和连接(1)Spring MVC项目创建(2)@RequestMapping注解三:Spring MVC处理参数(1)传递简单参数(2)传递对象(3)@RequestParam:重…...

openssl + 3DES开发实例(linux)

文章目录 一、3DES介绍3DES 的特点&#xff1a;3DES 加密的步骤&#xff1a;3DES 的应用场景&#xff1a; 二、3DES原理1. DES 原理回顾&#xff1a;2. 3DES 原理&#xff1a;3. 3DES 的加密流程&#xff1a; 三、openssl 3DES开发实例 一、3DES介绍 3DES&#xff08;Triple …...

遵循开源软件安全路线图

毫无疑问&#xff0c;开源软件对于满足联邦任务所需的开发和创新至关重要&#xff0c;因此其安全性至关重要。 OSS&#xff08;运营支持系统&#xff09; 支持联邦政府内的每个关键基础设施部门。 联邦政府认识到这一点&#xff0c;并正在采取措施优先考虑 OSS 安全&#xff…...

294_C++_

1、全部大致解析: struct alarminfo_t {unsigned int alarmid;INTF_ALARM_INFO_S pAlarm; };typedef enum{INTF_IO_ALARM_E= 0, //I/O探头告警开始INTF_MOTION_ALARM_E, //移动侦测告警开始INTF_AI_ALARM_E,...