金石原创 |【分布式技术专题】「分布式技术架构」一文带你厘清分布式事务协议及分布式一致性协议的算法原理和核心流程机制(上篇)

简介: 金石原创 |【分布式技术专题】「分布式技术架构」一文带你厘清分布式事务协议及分布式一致性协议的算法原理和核心流程机制(上篇)

背景介绍

最近大家都相比遇到了就业瓶颈了,很多公司要不就是不招人了,要不就是把门槛抬的很高,所以针对于一些分布式角度而言的技术知识点,更是必备条件以及重中之重了。那么今天笔者就针对于分布式协议以及一些算法原理进行详细的分析和原理介绍。

分布式体系

分布式体系管理的主要内容是面对于分布式节点进行执行事务的操作流程。



整个分布式体系主要包含了几个要素:

  • 分布式节点
  • 本地操作
  • 分布式组合操作

如何可以将分布式节点的每个本地操作达成整齐划一,并且实现统一化的数据状态管理,这将是分布式协议 的重点管理目标和方向。

执行失败状态将会不一致

但是如果一旦出现了其中某一个节点的本地执行出现错误,如下图所示。



就会出现很严重的问题,导致分布式节点的执行不完整,最终造成了数据状态不一致的问题。

分布式协议(2PC+3PC)

每一个分布式节点明确的知道自己执行的事务结果是成功还是失败,但无法知道其他节点的执行结果, 因此为了保持事务的ACI特性, 需要引入一个“协调者”(Coordinator)来调度所有的分布式节点称为“参与者”(Participant) 。基于这种思想衍生出了二阶提交与三阶提交两种协议。

二阶提交(Two-Phase Commit,2PC)

概念介绍

使基于分布式架构下的所有节点在进行事务处理过程中保持原子性与一致性而设计的一种算法。

执行流程

  • 阶段一:提交事务请求
  • 阶段二:执行事务提交


阶段一:提交事务请求

  1. 事务询问:协调者向所有的参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各个参与者响应。


  1. 执行事务:各参与者节点执行事务操作, 并将undo与redo信息写入事务日志中。

  1. 各参与者向协调者反馈事务询问的响应如果参与者成功执行了事务, 就返回YES,如果不成功,就返回NO。

该阶段相当于各个参与者对协调者发送的事务内容进行是否可以执行的投票。

阶段二:执行事务提交

根据参与者的响应,正常情况下有两种情况:

  • 成功:YES
  • 失败:NO
执行事务提交(响应都为YES)
  1. 发送提交请求
  2. 事务提交,协调者向所有参与者节点发出Commit请求,参与者接收到Commit请求后,会正式执行事务提交操作,并在完成后释放事务,执行期间占用的资源
  3. 反馈事务提交结果,参与者完成事务提交以后,向协调者发送Ack消息
  4. 完成事务,收到所有参与者节点的Ack消息后,完成事务


中断事务(响应有NO,或有超时)
  1. 发送回滚请求,协调者向所有参与者节点发出Rollback请求
  2. 事务回滚,参与者接收到Rollback请求后,会根据undo信息执行执行事务回滚操作,并在完成后释放事务执行期间占用的资源。
  3. 反馈事务回滚结果,参与者完成事务回滚以后,向协调者发送Ack消息。
  4. 中断事务,收到所有参与者节点的Ack消息后,完成事务中断


优点

  • 原理简单
  • 实现方便

缺点

同步阻塞(性能较差)

在二段提交过程中,所有参与该事务操作的逻辑都处于阻塞状态,也就是各个参与者在等待其他参与者响应的过程中都无法执行其他操作。

单点问题(容易造成崩溃)

协调者的角色在整个二段提交协议中起到了非常重要的作用,如果协调者出现问题,参与者将锁定事务资源无法继续完成事务操作。

数据不一致(在二阶段的问题)

在阶段二过程中, 有可能因为网络等原因出现只有部分参与者收到了Commit请求。而出现各个节点数据不一致的问题。

从太过保守

没有容错机制,任何一个节点的失败都会导致整个事务的中断。


三阶提交(Three-Phase Commit,3PC)

概述

2PC的改进版本,将2PC二阶段提交的过程一分为二, 形成了Can Commit, Pre Commit, Do Commit三个阶段组成的事务协议。


Can Commit阶段

1. 事务询问

事务协调者向所有的分布式节点发送一个包含事务内容的can Commit请求, 询问是否可以执行事务提交操作,并开始等待各个参与者响应。

2.各参与者向协调者反馈事务询问的响应

如果参与者认为可以顺利执行事务, 就反馈YES, 并进入预备状态, 否则反馈NO


该阶段相当于各个参与者对协调者发送的事务内容进行是否可以执行的投票

Pre Commit阶段

根据参与者的响应,正常情况下有两种情况:

1. 执行事务提交(响应都为YES)

  1. 发送预提交请求,协调者向所有参与者节点发出pre Commit请求, 并进入prepared阶段
  2. 预事务提交,参与者接收到Pre Commit请求后, 会执行事务, 并将undo与redo信息写入事务日志中
  3. 反馈事务提交结果,参与者完成事务提交以后, 向协调者发送Ack消息, 等待最终的指令:提交(Commit)或终止(abort)


2. 中断事务(响应存在NO,或有超时)

  1. 发送回滚,请求协调者向所有参与者节点发出abort请求
  2. 中断事务,收到所有参与者节点的Ack消息后, 或者等待协调者响应超时, 都会中断事务

Do Commit阶段

根据参与者的响应,正常情况下有两种情况:

执行提交(响应都为YES)

  1. 发送提交请求,协调者向所有参与者节点发出do Commit请求
  2. 事务提交,参与者接收到do Commit请求后, 会正式执行事务, 并在完成后释放事务执行期间占用的资源
  3. 反馈事务提交结果,参与者完成事务提交以后, 向协调者发送Ack消息
  4. 完成事务,收到所有参与者节点的Ack消息后, 完成事务


中断事务(二阶段提交后,参与者响应有NO, 或有超时)

  1. 发送回滚请求,协调者向所有参与者节点发出abort请求
  2. 事务回滚,参与者接收到abort请求后, 会根据undo信息执行事务回滚操作, 并在完成后释放事务执行期间占用的资源
  3. 反馈事务回滚结果,参与者完成事务回滚以后, 向协调者发送Ack消息
  4. 中断事务,收到所有参与者节点的Ack消息后, 或者等待协调者响应超时, 都会中断事务


优点

降低了二阶段提交的阻塞范围。

缺点

  • 参与者收到pre Commit消息后, 一旦无法与协调者通信, 将在超时后提交事务, 在这种情况下,可能会出现数据的不一致性
  • 协调者出现故障,协调者与参与者之间的网络出现故障(旦参与者接收不到协调者的请求超时以后,都会进行事务提交)

敬请期待: 【分布式技术专题】「分布式技术架构」一文带你厘清分布式事务协议及分布式一致性协议的算法原理和核心流程机制(下篇)

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
12天前
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
22天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
26天前
|
人工智能 前端开发 编译器
【AI系统】LLVM 架构设计和原理
本文介绍了LLVM的诞生背景及其与GCC的区别,重点阐述了LLVM的架构特点,包括其组件独立性、中间表示(IR)的优势及整体架构。通过Clang+LLVM的实际编译案例,展示了从C代码到可执行文件的全过程,突显了LLVM在编译器领域的创新与优势。
46 3
|
29天前
|
运维 持续交付 云计算
深入解析云计算中的微服务架构:原理、优势与实践
深入解析云计算中的微服务架构:原理、优势与实践
64 1
|
15天前
|
监控 安全 API
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
本文详细介绍了PaliGemma2模型的微调流程及其在目标检测任务中的应用。PaliGemma2通过整合SigLIP-So400m视觉编码器与Gemma 2系列语言模型,实现了多模态数据的高效处理。文章涵盖了开发环境构建、数据集预处理、模型初始化与配置、数据加载系统实现、模型微调、推理与评估系统以及性能分析与优化策略等内容。特别强调了计算资源优化、训练过程监控和自动化优化流程的重要性,为机器学习工程师和研究人员提供了系统化的技术方案。
135 77
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
|
22天前
|
运维 Cloud Native 持续交付
云原生技术深度探索:重塑现代IT架构的无形之力####
本文深入剖析了云原生技术的核心概念、关键技术组件及其对现代IT架构变革的深远影响。通过实例解析,揭示云原生如何促进企业实现敏捷开发、弹性伸缩与成本优化,为数字化转型提供强有力的技术支撑。不同于传统综述,本摘要直接聚焦于云原生技术的价值本质,旨在为读者构建一个宏观且具体的技术蓝图。 ####
|
25天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
29天前
|
Cloud Native 持续交付 云计算
云原生技术在现代IT架构中的转型力量####
本文深入剖析了云原生技术的精髓,探讨其在现代IT架构转型中的关键作用与实践路径。通过具体案例分析,展示了云原生如何赋能企业实现更高效的资源利用、更快的迭代速度以及更强的系统稳定性,为读者提供了一套可借鉴的实施框架与策略。 ####
24 0
|
2月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
24天前
|
存储 NoSQL Java
使用lock4j-redis-template-spring-boot-starter实现redis分布式锁
通过使用 `lock4j-redis-template-spring-boot-starter`,我们可以轻松实现 Redis 分布式锁,从而解决分布式系统中多个实例并发访问共享资源的问题。合理配置和使用分布式锁,可以有效提高系统的稳定性和数据的一致性。希望本文对你在实际项目中使用 Redis 分布式锁有所帮助。
70 5