分布式事务——Seata(一)

一、分布式事务简介

(一)事务的特点

使用过关系型数据库的小伙伴肯定都知道,事物ACID的特点:

  • A(Atomic):原子性,事务是最小单元,要么全部执行,要么全部不执行。
  • C(Consistency):事务执行前后,数据库的状态是一致的。例如张三转给李四200元,张三少了200元,李四应该多了200元。
  • I(Isolation):隔离性,并发的两个事务的执行互不干扰,一个事务不能看到其他事务运行过程的中间状态。
  • D(Durability):持久性,事务完成之后,对数据的更改会被持久化到数据库,且不会被回滚。

(二)事务的分类

1.本地事务

一般指数据库和服务被部署在同一台机器上,如果某个请求执行,利用数据库自带的事务属性就能达到事务执行成功/事务执行失败并回滚的效果。

2.分布式事务

分布式事务是指一个服务被分布式部署在多台机器上,数据库也不在同一台机器,因此,使用数据库自带的事务属性无法支持事务,为了保持服务之间数据的一致性,需要一些方式来保证所有的任务全部成功或者全部失败。

3.示意图

在这里插入图片描述

(三)分布式事务两大理论依据

1.CAP定律

这个定理的内容是指的是在一个分布式系统中、Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。需要C就要牺牲A,需要A就要牺牲P。

  • C:Consistency(一致性)
    分布式中所有的数据在同一时间内访问到是同一个值,即所有的节点都访问到最新的数据。
  • A:Availability(可用性)
    即使部分节点不可用,仍能在规定时间内给出响应
  • P:Partition tolerance(分区容错性)
    这一属性是客观存在的,就是分区之间不能保证成功远程调用,因为只要RPC,就存在网络不稳定的可能性。这个属性是指,即使分区之间出现错误,不可调用,系统也不会因此崩溃。

在这里插入图片描述

2.BASE理论

BASE理论是对CAP中一致性和可用性权衡的结果,BASE理论的核心思想是:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。

  1. Basically Available(基本可用)
    当分布式系统出现不可预估的故障时,允许损失部分可用性,例如延迟响应时间,服务降级等
  2. Soft state(软状态)
    服务之间允许出现中间状态,允许数据同步延时,正处于同步过程的服务就成为软状态
  3. Eventually consistent(最终一致性)
    不追求强一致性,经过多次软状态后,微服务之间达成一致性。

示例如下:
在这里插入图片描述

(四)分布式事务解决方案——2PC协议

两阶段提交协议,P代表准备阶段,C代表提交阶段,

  • 准备阶段:事物管理器会向事物参与者发送Prepare消息,事务参与者执行事务,并记录日志;
  • 提交阶段:如果所有的事物参与者都准备好了,事物管理器发送“提交”消息,如果有部分的事务参与者准备失败,事务管理器会发送回滚命令,其他的数据库也会一同回滚。

日志有两种:

  • Undo日志是记录修改前的数据,用于数据库回滚
  • Redo日志是记录修改后的数据,用于提交事务后写入数据文件

流程示意图:
在这里插入图片描述

二、Seata

(一)Seata简介

Seata是一款开源的分布式解决方案,为用户解决分布式事务的一系列问题。
Seata官方网站

(二)Seata的相关术语

关键概念:

  • TC (Transaction Coordinator) - 事务协调者

    维护全局和分支事务的状态。

  • TM (Transaction Manager) - 事务管理器(发起者,同时也是RM的一种)

    开始全局事务、提交或回滚全局事务。

  • RM (Resource Manager) - 资源管理器(每个参与事务的微服务)

    事务参与者,即微服务。

Seata工作机制示意图:
在这里插入图片描述

(三)搭建Seata-Server

1.下载

下载1.4.2稳定版本即可下载地址

2.修改配置(支持nacos版)

打开文件registry.conf(Seata的配置文件),将register{}中的type修改为nacos,config{}的type也修改为nacos。

registry {
	  # 支持 nacos 、eureka、redis、zk、consul、etcd3、sofa等中间件
	  type = "nacos"
	  nacos{
	     # 设置为nacos的配置
		  application = "seata-server"
		  serverAddr = "127.0.0.1:8848"
		  group = "SEATA_GROUP"
		  namespace = ""
		  cluster = "default"
		  username = ""
		  password = ""
	  }
	  ...
}

...

config {
  type = "nacos"
  ...
}

打开文件file.conf(Seata的储存配置),将store{}的mode修改为db,将db{}的所有配置,url,user,password修改为自己的计算机地址。

store {
	mode="db"
	#数据库相关配置
	  db {
    		datasource = "druid"
    		dbType = "mysql"
   		 	driverClassName = "com.mysql.cj.jdbc.Driver"
    		url = "jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&characterEncoding=UTF-8"
   	 		user = "root"
    		password = "root"
		    minConn = 5
		    maxConn = 100
		    globalTable = "global_table"
		    branchTable = "branch_table"
		    lockTable = "lock_table"
		    queryLimit = 100
		    maxWait = 5000
  }
}

然后,先启动nacos,再启动seater-server,

cd seata/seata-server-1.4.2/bin
sh seata-server.sh

在nacos控制台能够的看到服务,说明启动成功。
在这里插入图片描述

3.数据库搭建

Server存储模式:

  1. file:单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高(默认)
  2. DB:高可用模式,全局事务会话信息通过DB共享,相对性能差一些
  3. redis:Seata-Server1.3及以上版本支持,性能较高,存在事务信息丢失风险,需要配合实际场景使用。

之所以选择db模式,是因为现实应用中,集群部署seata时,db是可用性最高的。
官网网址sql语句

先建立seata的数据库,然后运行上述sql语句即可。

(四)Seata-server整合Nacos搭建

具体的配置过程在官网有描述的很清晰了。Seata部署到Nacos操作
Seata-server作为一个微服务注册到Nacos中,为其他的业务微服务解决分布式事务的问题,并且,Seata-Server使用数据库来储存事务运行时的数据。工作示意图如下:
在这里插入图片描述

1.注册中心配置

修改registry.config配置文件,其中的
registry{}表示注册中心的配置,修改用户名密码等参数。

registry { 
	  type = "nacos"
	  nacos {
	    application = "seata-server"
	    serverAddr = "127.0.0.1:8848"
	    group = "SEATA_GROUP"
	    namespace = ""
	    cluster = "default"
	    username = "nacos"
	    password = "nacos"
	  }
 }

2.修改配置中心

修改seata-server的配置文件

config{}标签表示对注册中心的配置

config{
	nacos {
		# nacos服务运行的ip地址和端口号
	    serverAddr = "127.0.0.1:8848"
	    # 命名空间
	    namespace = ""
	    # 分组
	    group = "SEATA_GROUP"
	    username = "nacos"
	    password = "nacos"
	    # 对应配置文件的名字
	    dataId = "seataServer.properties"
	 }
}
Seata-Server的数据库和事务分组配置上传到Nacos

将Seata-Server配置上传到Nacos上有两种方式,一种是脚本方式,一种是使用config{}标签中dataId对用的文件,个人觉得脚本上传的方式比较复杂, 所以直接使用了dataId配置文件的方式。
进入https://github.com/seata/seata/tree/develop/script/config-center 下载config.txt按照现实情况修改,需要修改的地方有:
事务分组:

service.vgroupMapping.mygroup=default # 事务分组
service.default.grouplist=127.0.0.1:8091

储存模式

store.mode=db 

数据库配置

store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=root
store.db.password=root

上传至nacos控制台即可
在这里插入图片描述
启动成功后,可以在服务列表查看到运行的seata服务。

注意:由于微服务(事务参与者)和TC(事务统筹者)需要共同协作,所以,其配置文件需要在同一个命名空间(Namspace)和一个分组(Group)中,才能保持分组的一致性。

猜你喜欢

转载自blog.csdn.net/weixin_44712778/article/details/125879567