分布式事务——CAP理论 解决分布式事务的思路 Seata组件初识 和 部署

在这里插入图片描述

前言

事务(TRANSACTION)是一个不可分割的逻辑单元,包含了一组数据库操作命令,并且把所有的命令作为一个整体向系统提交,要么都执行、要么都不执行。

事务作为系统中必须考虑的问题,无论是在单体项目还是在分布式项目中都需要进行处理,而尤其在分布式微服务调用的情况下,事务的处理就变得复杂。

本篇博客介绍分布式事务产生的场景,阐述了CAP理论,分析了分布式事务的解决思路,初步介绍了Alibaba分布式事务组件Seata,给出了部署方法。

目录

  • 前言
  • 引出
  • 一、分布式事务
  • 二、CAP定理
    • 1、Consistency(一致性)
    • 2、Availability(可用性)
    • 3、Partition tolerance(分区容错性)
  • 三、解决分布式事务的思路
  • 四、Alibaba分布式事务组件Seata
  • 五、部署Seata
    • 准备工作
    • 启动
  • 总结

引出


1.介绍分布式事务产生的场景,阐述了CAP理论;
2.分析了分布式事务的解决思路;
3.初步介绍了Alibaba分布式事务组件Seata,给出了部署方法。

一、分布式事务

分布式事务,就是指不是在单个服务或单个数据库架构下,产生的事务,例如:

  • 跨数据源的分布式事务
  • 跨服务的分布式事务

在数据库水平拆分、服务垂直拆分之后,一个业务操作通常要跨多个数据库、服务才能完成。例如电商中比较常见的下单付款案例

  • 创建新订单
  • 扣减商品库存
  • 扣减会员积分

完成上面的操作需要访问三个不同的微服务和三个不同的数据库。
订单的创建、库存的扣减、扣减会员积分在每一个服务和数据库内是一个本地事务,可以保证ACID原则。

但是当我们把三件事情看做一个"业务",要满足保证“业务"的原子性,要么所有操作全部成功,要么全部失败,不允许出现部分成功部分失败的现象,此时ACID难以满足,就需要分布式系统下的事务管理

二、CAP定理

解决分布式事务问题,需要一些分布式系统的基础知识作为理论指导。

1998年,加州大学的计算机科学家Eric Brewer提出,分布式系统有三个指标。

  • Consistency(一致性)
  • Availability(可用性)
  • Partition tolerance(分区容错性)

1、Consistency(一致性)

用户访问分布式系统中的任意节点,得到的数据必须一致。

比如现在包含两个节点,其中的初始数据是一致的。用户向节点1发起一个写操作,将其改为data1=2。

在这里插入图片描述

接下来,用户的读操作就会得到2。这就叫一致性。

在这里插入图片描述

问题是,用户有可能向节点2发起读操作,由于节点2的值没有发生变化,因此返回的是dta1=1。节点1和节点 2读操作的结果不一致,这就不满足一致性了。

在这里插入图片描述

为了让节点2也能变为2,就要在节点1写操作的时候,让节点1向节点2发送一条消息,要求节点2也改成data1=2。

在这里插入图片描述

这样的话,用户向节点2发起读操作,也能得到data1=2。因此要想保住一致性,就必须实现节点1到节点2的数据同步。

2、Availability(可用性)

用户访问集群中的任意健康节点,必须能得到响应,而不是超时或拒绝

如图,有三个节点的集群,访问任何一个都可以及时得到响应:

在这里插入图片描述

当有部分节点因为网络故障或其它原因无法访问时,代表节点不可用,但其他可用节点可以继续提供服务。

在这里插入图片描述

3、Partition tolerance(分区容错性)

Partition(分区):因为网络故障或其它原因导致分布式系统中的部分节点与其它节点失去连接,形成独立分区。

Tolerance(容错):容错表示在集群出现分区时,整个系统也要持续对外提供服务。

在这里插入图片描述

在分布式系统中,系统间的网络不能100%保证健康,一定会有故障的时候,而服务又必须对外保证服务。因此分区容错性不可避免。

当节点接收到新的数据变更时,就会出现问题了:

在这里插入图片描述

如果此时要保证一致性,就必须等待网络恢复,完成数据同步后,整个集群才对外提供服务,服务处于阻塞状态,不可用。

如果此时要保证可用性,就不能等待网络恢复,那节点1、节点2与节点3之间就会出现数据不一致。

综上所述,无法同时做到一致性和可用性。系统设计时只能选择一个目标,在P一定会出现的情况下,A和C之间只能实现一个。这就是CAP定理。

CP: 强一致性,弱可用性,牺性部分机器的可用性,保证数据一致性,如zookeeper、es
AP: 强可用性,弱一致性,牺牲一致性,保证可用性,如Eureka

三、解决分布式事务的思路

分布式事务最大的问题是各个子事务的一致性问题,因此可以借鉴CAP定理,有两种解决思路:

  • AP模式:各子事务分别执行和提交,允许出现结果不一致,然后采用弥补措施恢复数据即可,实现最终一致。
  • CP模式:各个子事务执行后互相等待,同时提交,同时回滚,达成强一致。但事务等待过程中,处于弱可用状态。

但不管是哪一种模式,都需要在各个子系统事务之间互相通讯,协调事务状态,也就是需要一个事务协调者

在这里插入图片描述

这里的子系统事务,称为分支事务,如上图中的订单服务、库存服务都为一个子事务,有关联的各个分支事务组织在一起称为全局事务

四、Alibaba分布式事务组件Seata

http://seata.io/zh-cn

在这里插入图片描述

Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。

1、Seata提供了四种不同的分布式事务解决方案:

  • XA 模式:强一致性分阶段事务模式,牺性了一定的可用性,无业务侵入
  • TCC模式:最终一致的分阶段事务模式,有业务侵入
  • AT模式:最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式
  • SAGA模式:长事务模式,有业务侵入

无论哪种方案,都离不开事务协调者

2、Seata事务管理中有三个重要的角色:

  • TC(Transaction Coordinator))·事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。
  • TM(Transaction Manager)-事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。
  • RM(Resource Manager)-资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

在这里插入图片描述

具体的执行流程如下:

在这里插入图片描述

五、部署Seata

http://seata.io/zh-cn/docs/download

准备工作

创建数据库

在这里插入图片描述

用seata提供的MySQL脚本进行数据库表的创建

在这里插入图片描述

进行seata的配置,在1.4版本下主要修改下面两个文件

在这里插入图片描述

修改registry.conf文件,主要设置注册方式为nacos,配置nacos相关的地址,组名,用户名密码等,让seata注册到nacos中

在这里插入图片描述
)

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  # 第一步 把type="file"修改为nacos
  # 第二步 除了nacos之外的注册配置都删除
  # 第三步 修改nacos的配置
  type = "nacos"
  loadBalance = "RandomLoadBalance"
  loadBalanceVirtualNodes = 10

  nacos {
    application = "seata-server"
    serverAddr = "119.3.162.127:8848" # http://119.3.162.127/
    group = "DEV"
    namespace = "my-tianju"
    cluster = "default"
    username = "naocsPet5620"
    password = "nacos"
  }
}
# 第四步,删除除fi1e以外的配置
config {
  # file、nacos 、apollo、zk、consul、etcd3
  type = "file"
  file {
    name = "file.conf"
  }
}

修改file.conf文件,配置事务日志的存储方案,这里设置为MySQL数据库,需要设置url,用户名和密码登参数

在这里插入图片描述

## transaction log store, only used in seata-server
# 第一步修T改mode="file"为db
# 第二步删除除db以外的配置
# 第三步修改db的配置
store {
  ## store mode: file、db、redis
  mode = "db"

  ## database store property
  db {
    ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.
    datasource = "druid"
    ## mysql/oracle/postgresql/h2/oceanbase etc.
    dbType = "mysql"
    driverClassName = "com.mysql.cj.jdbc.Driver"
    url: "jdbc:mysql://192.168.150.101:3306/seata?serverTimezone=GMT%2B8"
    user = "root"
    password = "123"
    minConn = 5
    maxConn = 100
    globalTable = "global_table"
    branchTable = "branch_table"
    lockTable = "lock_table"
    queryLimit = 100
    maxWait = 5000
  }
}

启动

在bin目录下有两个启动的脚步,bat格式为window下启动,sh格式为Linux中启动

在这里插入图片描述

window下启动的后台打印信息

在这里插入图片描述

seata注册在nacos中成功

在这里插入图片描述

访问seata前端页面

在这里插入图片描述


总结

1.介绍分布式事务产生的场景,阐述了CAP理论;
2.分析了分布式事务的解决思路;
3.初步介绍了Alibaba分布式事务组件Seata,给出了部署方法。

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

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

相关文章

Python机器学习17——Xgboost和Lightgbm结合分位数回归(机器学习与传统统计学结合)

最近XGboost支持分位数回归了,我看了一下,就做了个小的代码案例。毕竟学术市场上做这种新颖的机器学习和传统统计学结合的方法还是不多,算的上创新,找个好数据集可以发论文。 代码实现 导入包 import numpy as np import pandas…

uni-app医院智能导诊系统源码

随着科技的迅速发展,人工智能已经逐渐渗透到我们生活的各个领域。在医疗行业中,智能导诊系统成为了一个备受关注的应用。本文将详细介绍智能导诊系统的概念、技术原理以及在医疗领域中的应用,分析其优势和未来发展趋势。 智能导诊系统通过人工…

如何训练Embedding Model

BGE的技术亮点: 高效预训练和大规模文本微调;在两个大规模语料集上采用了RetroMAE预训练算法,进一步增强了模型的语义表征能力;通过负采样和难负样例挖掘,增强了语义向量的判别力;借鉴Instruction Tuning的…

中央设备状态监控系统CMS如何帮助半导体晶圆厂提高产品良率

中央设备状态监控系统(CMS)在半导体晶圆厂中扮演着关键角色,帮助企业提高产品的良率。本文将介绍CMS是什么、当前半导体晶圆厂产品良率面临的挑战,并重点探讨CMS如何通过实时数据监控、故障预测和预警、以及统计分析和过程改进等方…

【论文阅读】(2023TPAMI)PCRLv2

目录 AbstractMethodMethodnsU-Net中的特征金字塔多尺度像素恢复多尺度特征比较从多剪切到下剪切训练目标 总结 Abstract 现有方法及其缺点:最近的SSL方法大多是对比学习方法,它的目标是通过比较不同图像视图来保留潜在表示中的不变合判别语义&#xff…

SENet 学习

ILSVRC 是一个比赛,全称是ImageNet Large-Scale Visual Recognition Challenge,平常说的ImageNet比赛指的是这个比赛。 使用的数据集是ImageNet数据集的一个子集,一般说的ImageNet(数据集)实际上指的是ImageNet的这个子…

day01_matplotlib_demo

文章目录 折线图plot多个绘图区绘制数学函数图像散点图scatter柱状图bar直方图histogram饼图pie总结 折线图plot import matplotlib.pyplot as pltplt.figure(figsize(15, 6), dpi80) plt.plot([1, 0, 9], [4, 5, 6]) plt.show()### 展现一周天气温度情况 # 创建画布 plt.figu…

NewStarCTF2023week4-More Fast(GC回收)

打开链接,存在很多个类,很明显是php反序列化漏洞利用,需要构造pop链 , 关于pop链构造的详细步骤教学,请参考我之前的博客,真的讲得很详细也容易理解: http://t.csdnimg.cn/wMYNB 如果你是刚接…

Echarts柱状图渐变色问题变通

问题背景 设计稿中给出了如下图的效果,在柱状图的最上面给出了一个白色的小块,起初我一直在思考亦或者搜索相关的问题:如何在Echarts柱状图顶部实现一个24*4的白色矩形块。始终不得其解,在一个吃饭的瞬间冒出来一个想法是否可以用…

MySQL数据xtrabackup物理备份方法

目录 一、物理备份的方式二、xtrabackup物理备份1.安装xtrabackup2.完整备份/恢复流程3.增量备份流程4.差异备份流程5.物理备份总结 一、物理备份的方式 1.完整备份 每次对数据进行完整的备份,即对整个数据库的备份、数据库结构和文件结构的备份,保存的…

Docker:创建主从复制的Redis集群

一、Redis集群 在实际项目里,一般不会简单地只在一台服务器上部署Redis服务器,因为单台Redis服务器不能满足高并发的压力,另外如果该服务器或Redis服务器失效,整个系统就可能崩溃。项目里一般会用主从复制的模式来提升性能&#x…

指针相关面试题目

数组名的意义: 1. sizeof( 数组名 ) ,这里的数组名表示整个数组,计算的是整个数组的大小。 2. & 数组名,这里的数组名表示整个数组,取出的是整个数组的地址。 3. 除此之外所有的数组名都表示首元素的地址。 下…

发卡系统微信小程序源码/云盘发卡系统源码带PC端/自动发卡小程序源码(开源)

源码介绍: 最新开源的发卡系统微信小程序源码,这是一款云盘发卡系统源码,还带了电脑PC端。它是一款实用方便操作自动发卡小程序源码,它使用ERMEB云盘发卡,能为用户提供便捷的发卡服务。 源码框架: 系统采…

软考高级之系统架构师之数据流图和流程图

数据流图 概述 数据流图,DFD,用于表示业务信息系统中的数据流,它表达系统中的据传从输入到存储间所涉及的程序。采用图形方式来表达系统的逻辑功能、数据在系统内部的逻辑流向和逻辑变换过程,是结构化系统分析方法的主要表达工具…

python 查找波峰和波谷

import numpy as np import matplotlib.pyplot as plt from scipy.signal import find_peaks# 生成示例信号 x np.array([1, 3, 7, 1, 2, 6, 0, 4, 3, 2, 5, 1])# 寻找波峰 peaks, _ find_peaks(x)# 寻找波谷(使用信号的负数形式) valleys, _ find_pe…

【html】图片多矩形框裁剪

说明 由于项目中需要对一个图片进行多选择框进行裁剪&#xff0c;所以特写当前的示例代码。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><base href"/"><title>图片裁剪</tit…

第1篇 目标检测概述 —(3)目标检测评价指标

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。目标检测评价指标是用来衡量目标检测算法性能的指标&#xff0c;主要包括几个指标&#xff1a;精确率&#xff08;Precision&#xff09;、召回率&#xff08;Recall&#xff09;、交并比&#xff08;IoU&#xff09;、平均…

GitLab升级16.5.0后访问提示502

系统是兼容CentOS8的TencentOS3.1 GitLab原来的版本是16.4.1 使用yum升级时发现GitLab有新版本,决定升级。 升级过程无异常,出现升级成功的提示。 可是意外的时,访问站点时提示502. GitLab比较吃资源,启动的服务较多。之前也有等会就正常的情况。 这次没那么幸运,一…

js创建 ajax 过程

目录 前言&#xff1a;AJAX 技术的重要性 详解&#xff1a;创建 AJAX 请求的步骤 1. 创建 XMLHttpRequest 对象 2. 配置请求 3. 处理响应 4. 发送请求 5. 处理异步请求 解析&#xff1a;AJAX 请求的重要性和限制 总结&#xff1a; 前言&#xff1a;AJAX 技术的重要性 …

FastAPI 快速学习之 Flask 框架对比

目录 一、前言二、FastAPI 优势三、Hello World四、HTTP 方法五、URL 变量六、查询字符串七、POST 请求八、文件上传九、表单提交十、Cookies十一、模块化视图十二、数据校验十三、自动化文档Swagger 风格ReDoc 风格 十四、CORS跨域 一、前言 本文主要对 FastAPI 与 Flask 框架…