分布式系统概念和设计——分布式事务

分布式系统概念和设计

分布式事务

访问多个服务器管理的对象的事务称为分布式事务。

当一个分布式事务结束时,事务的原子特性要求所有参与事务的服务器必须全部提交或全部放弃。

实现:

  • 其中一个服务器承担了协调者的角色,保证在所有的服务器上获得一样的结果。
  • 协调者的动作取决于协议:二阶段提交协议,该协议允许服务器之间通信,可以就提交和放弃共同做出决定。

平面和嵌套分布式事务

在这里插入图片描述

分布式事务的协调者

  • 执行了分布式事务请求的服务器需要相互通信,以确保在事务提交时能够协调他们之间的动作。
  • 创建某一分布式事务的协调者称为该分布式事务的协调者,作用于在分布式事务结束时负责提交或放弃事务。
  • 分布式事务访问的每个服务器都是该事务的参与方,每个服务器提供一个我们称为参与者的对象。
  • 每个事务参与者负责跟踪所有参与分布式事务的可恢复对象。
  • 这些参与者配合协调者共同执行提交协议的决定。
  • 在事务的执行过程中,协调者在列表中记录所有对参与者的引用,每个参与者都记录一个对协调者的引用。
  • 协调者将参与者记录到分布式事务的参与者的列表中。
  • 协调者知道此事务的每个参与者,每个参与者也知道协调者。
  • 在事务的提交过程中,参与者和协调者都能收集到必要的信息。

在这里插入图片描述

原子提交协议

二阶段提交协议

出发点是任何一个参与者都能提交或放弃事务它那部分事务。

根据事务的原子特性,如果一个事务放弃提交事务,那么整个分布式事务全部放弃。

  • 第一个阶段是每个参与者投票决定事务是提交还是放弃。
    • 一个参与者决定提交事务之后就不再允许其放弃事务。
    • 在一个参与者决定投票决定提交事务时,必须能够保证自己的提交协议能够正确执行,即使其他事务出现故障,
    • 一个参与者能够最终提交事务,说明参与者属于事务的准备好的状态。
    • 为了保证事务能够提交,每个参与者必须将事务中发生的所有改变的对象和状态保存到持久存储器中。

提交协议的故障模型

二阶段提交协议是一种达成共识的协议。

在异步系统中,如果一个进程崩溃是不可能达成共识

二阶提交协议达成共识的原因是因为,崩溃进程被新进程替代,新进程的状态通过持久存储器的数据进行设置,从而进行响应。

分布式事务的并发和控制

分布式事务中,某个对象的锁总是在同一个服务器中,授权这些锁的是本地锁管理器决定的。

本地锁管理器决定是满足锁的需求还是让其等待。

当时本地事务为提交或放弃之前,本地锁管理器不能释放任何锁。

分布式死锁的问题。

分布式锁是一种用于保证分布式系统并发访问的一致性和可靠性的机制。在设计和实现分布式锁时,需要考虑以下几个方面:

  1. 锁管理:分布式锁需要能够管理锁的获取、释放等操作,以保证并发性和可靠性。通常可以使用类似于互斥锁的机制来实现分布式锁。
  2. 节点管理:分布式锁需要能够管理分布式环境下的节点,以保证节点的可用性和容错性。通常可以使用类似于ZooKeeper的分布式协调服务来实现节点管理。
  3. 通信协议:分布式锁需要能够使用可靠的通信协议进行节点之间的通信,以保证数据的一致性和正确性。通常可以使用类似于TCP的可靠传输协议来实现通信协议。

在实现分布式锁时,可以采用以下几种方式:

  1. 基于数据库的锁机制:可以使用数据库的锁机制来实现分布式锁,例如行锁、表锁等。这种方式相对简单,但是会影响并发性能。
  2. 基于分布式协调服务的机制:可以使用分布式协调服务来实现分布式锁,例如基于ZooKeeper的分布式锁机制。这种方式可以保证分布式锁的一致性和可靠性,但是会增加系统的复杂度和开销。
  3. 基于Redis的机制:可以使用Redis的分布式锁机制来实现分布式锁。这种方式可以保证分布式锁的一致性和可靠性,同时具有较高的性能和可扩展性。

在选择分布式锁的实现方式时,需要根据实际情况综合考虑各种因素,例如系统的复杂度、并发性能、可靠性等。同时,在实现分布式锁时,需要考虑锁的粒度、锁的超时时间、锁的重试机制等问题,以保证分布式锁的正确性和可靠性。

分布式时间戳排序并发控制

  • 分布式事务中,协调者必须保证每个事务附上全局唯一的时间戳
  • 全局唯一时间戳由事务访问的第一个协调者发送给客户。
  • 若服务器上的一个对象执行了事务中的一个操作,那么事务时间戳被传给该服务器上的协调者
  • 分布式事务中的所有服务器共同保证事务的串行等价性质。
    • 如果一个事务U访问的服务器对象版本在事务T访问后提交,而在另一个服务器上T和U又访问了另外的服务器对象,也必须按照相同次序提交对象。
    • 为了保证所有服务器上的相同排序,协调者必须就时间戳顺序达成一致
    • 时间戳比较,首先比较本地时间,然后比较服务器id,二元组数据结构

分布式系统中,时间戳排序并发控制(Timestamp Ordering Concurrency Control,TOCC)是一种用于保证并发事务的一致性和隔离性的机制。TOCC的基本思想是使用全局时间戳来对事务进行排序,从而保证事务之间的执行顺序,从而保证事务的一致性和隔离性。

TOCC的实现可以分为两个阶段:

  1. 事务提交阶段:在事务提交时,需要为每个事务分配一个全局时间戳,该时间戳可以使用递增序列号、时钟同步等方式生成。同时,需要将事务的操作序列和时间戳一起提交到协调节点进行处理。
  2. 事务处理阶段:在协调节点中,需要对事务进行时间戳排序,从而保证事务的执行顺序。同时,需要对并发访问的数据进行加锁,以保证事务的隔离性。在事务处理完成后,需要将事务的结果和时间戳一起返回给客户端。

TOCC的优点是可以保证事务的一致性和隔离性,同时可以支持高并发访问。但是,TOCC的缺点是需要进行时间戳排序和加锁等操作,会影响系统的性能和可扩展性。

在实现TOCC时,需要考虑以下几个方面:

  1. 时间戳生成方式:需要选择合适的时间戳生成方式,以保证时间戳的唯一性和递增性。
  2. 时间戳排序算法:需要选择合适的时间戳排序算法,以保证时间戳的正确排序。
  3. 锁管理:需要对并发访问的数据进行加锁,以保证事务的隔离性和正确性。
  4. 容错机制:需要考虑分布式环境下的容错机制,以保证系统的可用性和可靠性。

乐观并发控制

  • 每个事务提交之前必须首先进行验证。
  • 事务在验证开始时被贴上一个事务序号,事务的串行化是根据这些事务的序号的顺序实现的。
  • 分布式事务的验证由一组服务器共同完成,每个服务器验证自己对象的事务。

在分布式系统中,乐观并发控制(Optimistic Concurrency Control,OCC)是一种用于保证并发事务的一致性和隔离性的机制。OCC的基本思想是假设事务之间不存在冲突,即所有事务都可以并发执行。在事务提交时,需要对事务进行版本控制,以保证事务的一致性和隔离性。

OCC的实现可以分为两个阶段:

  1. 事务执行阶段:在事务执行时,需要为每个事务记录一个版本号,该版本号可以使用递增序列号、时间戳等方式生成。同时,需要对事务执行过程中访问的数据进行标记,以记录事务执行的版本号。
  2. 事务提交阶段:在事务提交时,需要检查事务访问的数据是否被其他事务修改,如果没有被修改,则提交事务。如果被修改,则需要回滚事务并重新执行。

OCC的优点是可以支持高并发访问,同时不需要进行加锁等操作,可以提高系统的性能和可扩展性。但是,OCC的缺点是需要进行版本控制和冲突检测等操作,会增加系统的复杂度和开销。

在实现OCC时,需要考虑以下几个方面:

  1. 版本控制方式:需要选择合适的版本控制方式,以保证版本号的唯一性和递增性。
  2. 冲突检测方式:需要选择合适的冲突检测方式,以保证事务的一致性和隔离性。
  3. 容错机制:需要考虑分布式环境下的容错机制,以保证系统的可用性和可靠性。

在选择OCC的实现方式时,需要根据实际情况综合考虑各种因素,例如系统的复杂度、并发性能、可靠性等。同时,在实现OCC时,需要考虑版本控制方式、冲突检测方式、容错机制等问题,以保证OCC的正确性和可靠性。

分布式死锁

分布式系统中,死锁是一种常见的问题。当多个进程或线程在分布式系统中互相等待对方释放锁资源时,就会发生死锁。分布式死锁的发生是由于分布式系统中存在多个独立的资源管理器,而这些资源管理器又相互依赖,从而导致了死锁的发生。

分布式死锁的解决方法可以分为以下几种:

  1. 超时机制:在分布式系统中,可以使用超时机制来解决死锁问题。当一个事务等待其他事务释放锁资源的时间超过一定的阈值时,就认为发生了死锁,并回滚事务。
  2. 死锁检测:在分布式系统中,可以使用死锁检测机制来解决死锁问题。死锁检测机制可以通过检查系统中的资源分配情况来判断是否发生了死锁,并采取相应的措施来解除死锁。
  3. 锁粒度控制:在分布式系统中,可以通过控制锁粒度来减少死锁的发生。例如,可以将锁粒度从表级别降低到行级别,从而减少死锁的概率。
  4. 资源分配策略:在分布式系统中,可以通过优化资源分配策略来减少死锁的发生。例如,可以采用资源预留策略,即在事务执行前就预留好所需的资源,从而避免死锁的发生。

分布式事务恢复

  • 事务的原子性要求事务访问的对象能够反映出所有已经提交事务的作用,而取消所有未完成或者放弃的事务的作用
    • 持久性:被要求对象被永久的存储在可靠存储器上并且一直可用,如果客户提交事务确认,所有对象的更新都会被保存到持久存储器
    • 故障原子性要求:即使服务器故障,事物的作用也是原子性。
  • 事务的恢复功能就是保证服务器对象的持久性和并提供故障原子性服务。
  • 恢复管理器:
    • 对于已经提交的事务,将对象保存到持久存储器
    • 服务器崩溃后恢复服务器上的对象
    • 重新组织恢复文件以提高恢复操作的性能
    • 回收存储空间

日志

  • 日志技术上,恢复文件包含了该服务器上执行的所有操作的历史
  • 操作历史由对象值,操作事务状态和意图列表组成
  • 事务中的次序反映了服务器上事务准备好,已提交或放弃的次序
  • 在服务器正常操作过程中,每次事务准备提交,提交,放弃,恢复管理器都会被调用。
  • 恢复文件的添加是原子性质的,即写入的总是完整的。
  • 如果服务器崩溃,最后一次写入可能不完整。
  • 为了提高效率可能几次缓存在一个提交恢复写入动作里。
  • 另一个就是顺序写磁盘技术比随机写的效率高
  • 所有未提交的事务在崩溃后将根据日志内容全部放弃。

分布式系统中,事务恢复是一种重要的机制,用于保证事务的一致性和可靠性。分布式事务恢复通常包括以下几个步骤:

  1. 故障检测:在分布式系统中,需要监测系统中的故障情况,例如节点故障、网络故障等。当发生故障时,需要及时检测并进行相应的处理。
  2. 日志记录:在分布式系统中,需要对事务执行过程中的操作进行日志记录。日志记录可以用于恢复事务执行过程中的数据和状态。
  3. 事务回滚:当发生故障时,需要对未完成的事务进行回滚操作。回滚操作可以通过撤销事务的操作来恢复数据和状态。
  4. 事务重放:在故障恢复过程中,需要对已经提交的事务进行重放操作,以保证数据和状态的一致性和可靠性。

在实现分布式事务恢复时,需要考虑以下几个方面:

  1. 日志记录方式:需要选择合适的日志记录方式,以保证数据和状态的可靠性和一致性。
  2. 回滚机制:需要设计合适的回滚机制,以保证事务的一致性和可靠性。
  3. 重放策略:需要选择合适的重放策略,以保证数据和状态的一致性和可靠性。
  4. 容错机制:需要考虑分布式环境下的容错机制,以保证系统的可用性和可靠性。

在实现分布式系统时,需要考虑事务恢复机制,并采取相应的措施来保证系统的稳定性和可靠性。同时,需要进行事务恢复测试和调试,以保证系统的正确性和可靠性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“微商城”项目(5登录和注册)

1.我的信息 在pages\User.vue文件中编写HTML结构代码&#xff0c;示例代码如下。 <template><div class"member"><div class"header-con"><router-link :to"{ name: login }" class"mui-navigate-right">&l…

Spring Cloud Alibaba - Sentinel(一)

目录 一、Sentinel介绍 1、什么是Sentinel 2、Sentinel好处 3、Sentinel下载和安装 二、搭建Sentinel项目 1、创建项目cloudalibaba-sentinel-service8401 三、Sentinel流控规则 1、流控规则基本介绍 2、新增流控 2.1、QPS直接失败案例 2.2、线程数直接失败案例 3、…

容器(第一篇)docker安装、基础操作命令

docker是什么&#xff1f; docker是一个go语言开发的应用容器引擎。 docker的作用&#xff1f; ①运行容器里的应用&#xff1b; ②docker是用来管理容器和镜像的一种工具。 容器 与 虚拟机 的区别&#xff1f; 容器 虚拟机所有容器共享宿主机…

【论文阅读】Neuralangelo:高保真神经表面重建

【论文阅读】Neuralangelo&#xff1a;高保真神经表面重建 Abstract1. Introduction2. Related work3. Approach3.1.预备工作3.2.数值梯度计算3.3.渐进细节层次3.4.优化 4. Experiments4.1. DTU Benchmark4.2. Tanks and Temples4.3.细节水平4.4.消融 5. Conclusion paper proj…

深度学习基础知识-tf.keras实例:衣物图像多分类分类器

参考书籍&#xff1a;《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition (Aurelien Geron [Gron, Aurlien])》 本次使用的数据集是tf.keras.datasets.fashion_mnist&#xff0c;里面包含6w张图&#xff0c;涵盖10个分类。 import tensorflo…

Jmeter性能测试 (入门)

Jmeter是一款优秀的开源测试工具&#xff0c; 是每个资深测试工程师&#xff0c;必须掌握的测试工具&#xff0c;熟练使用Jmeter能大大提高工作效率。 熟练使用Jmeter后&#xff0c; 能用Jmeter搞定的事情&#xff0c;你就不会使用LoadRunner了。 本文将通过一个实际的测试例…

IPV6地址基础

IPv6是英文“Internet Protocol Version 6”&#xff08;互联网协议第6版&#xff09;的缩写&#xff0c;是互联网工程任务组&#xff08;IETF&#xff09;设计的用于替代IPv4的下一代IP协议。其地址数量号称可以为全世界的每一粒沙子编上一个地址 1. ipv6地址表示方法 IPv6的…

MQTT与EMQ

文章目录 1 MQTT协议与EMQ中间件1.1 物联网消息协议MQTT1.1.1 什么是MQTT1.1.2 MQTT相关概念1.1.3 消息服务质量QoS——信息的可靠投递1.1.3.1 QoS0——消息服务质量为0&#xff0c;消息发送至多一次1.1.3.2 QoS1——消息发送至少一次1.1.3.3 QoS2——消息发送仅一次1.1.3.4 不…

Oracle中的数据导出(4)

目录 法一&#xff1a;使用SQL plus命令脚本 法二&#xff1a;使用PLSQL Developer工具 前几篇文章描述了如何将Oracle中的数据导出到库外&#xff0c;但是导出的数据结果都是文本文档&#xff0c;这样页面查看不和谐&#xff0c;编辑又略显麻烦。因此这篇文章将描述如何将Or…

Pb协议的接口测试

【摘要】 Protocol Buffers 是谷歌开源的序列化与反序列化框架。它与语言无关、平台无关、具有可扩展的机制。用于序列化结构化数据&#xff0c;此工具对标 XML &#xff0c;支持自动编码&#xff0c;解码。比 XML 性能好&#xff0c;且数据易于解析。更多有关工具的介绍可参考…

氟化物选择吸附树脂Tulsimer ®CH-87 ,锂电行业废水行业矿井水除氟专用树脂

氟化物选择吸附树脂 Tulsimer CH-87 是一款去除水溶液中氟离子的专用的凝胶型选择性离子交换树脂。它是具有氟化物选择性官能团的交联聚苯乙烯共聚物架构的树脂。 去除氟离子的能力可以达到 1ppm 以下的水平。中性至碱性的PH范围内有较好的工作效率&#xff0c;并且很容易再生…

Vue.js 中的过渡动画是什么?如何使用过渡动画?

Vue.js 中的过渡动画是什么&#xff1f;如何使用过渡动画&#xff1f; 在 Vue.js 中&#xff0c;过渡动画是一种在元素插入、更新或删除时自动应用的动画效果&#xff0c;可以为应用程序增加一些动态和生动的效果。本文将介绍 Vue.js 中过渡动画的概念、优势以及如何使用过渡动…

Nginx正则表达式、location、rewrite

目录 一、常用的Nginx正则表达式 二&#xff1a;localtion 1、location 分类 2、 location 常用的匹配规则 3、location 优先级 4、 location 示例 5、优先级总结 6、实际网站使用中&#xff0c;至少有三个匹配规则定义 &#xff08;1&#xff09;第一个必选规则 &…

chatgpt赋能python:将一行数变成列——Python简单实现

将一行数变成列——Python简单实现 在数据处理时&#xff0c;我们常常会遇到将一行的数据转换成列的情况&#xff0c;例如将多个数据在Excel表格中拆分为不同的列。这时候&#xff0c;Python可以帮助我们快速实现这个功能。 什么是Python&#xff1f; Python是一种高级&…

N-propargyloxycarbonyl-L-lysine,1215204-46-8,是一种基于赖氨酸的非天然氨基酸 (UAA)

产品描述&#xff1a; N-ε-propargyloxycarbonyl-L-lysine (H-L-Lys(Poc)-OH) 是一种基于赖氨酸的非天然氨基酸 (UAA)。 广泛用于多种生物体中荧光探针的生物偶联。 N- ε- Propargyloxycarbonyl-L-lysine (H-L-Lys (Poc) - OH) is a non natural amino acid (UAA) based on …

IDEA 终端命令行设置

一、说明 在使用 IDEA 进行程序开发时&#xff0c;需要使用到终端 Terminal 的功能&#xff0c;便于能够快速使用 shell 命令&#xff0c;进行各种相关的操作。 这些操作可以包括代码的版本控制、程序的打包部署等等 比如&#xff0c;前后端的集成开发环境&#xff08;IDEA、We…

.gitignore忽略文件不生效

前言 .gitignore忽略文件时git仓库很重要的一个配置&#xff0c;在创建仓库时就会有模板选择和忽略文件。 .gitignore忽略文件意思是在上传到代码仓库时&#xff0c;控制把哪些代码文件不上传到代码仓库。 在实际开发中其实写的代码是没有多大的&#xff0c;主要的是插件本地…

基于牛顿拉夫逊的配电网潮流计算研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Symfony v6.2.11 正式发布,经典 PHP Web 开发框架

导读Symfony v6.2.11 发布了&#xff01;Symfony 是一款基于 MVC 架构的 PHP 框架&#xff0c;致力于减少重复代码的编写&#xff0c;以加速 Web 应用的开发和维护。Symfony 与许多关系型数据库集成的也非常好&#xff0c;成本也较小。 此外&#xff0c;Symfony 致力于在企业背…

技术赋能-混流编排功能,助力京东618直播重保 | 京东云技术团队

每每到618、双11这样的大型活动的时候&#xff0c;每天都有几个重要的大v或者品牌直播需要保障。 以往的重点场次监播方式是这么造的&#xff1a; 对每路直播的源流、各档转码流分别起一个ffplay播放窗口&#xff0c;再手动调整尺寸在显示器桌面进行布局&#xff0c;排到一屏…