Seata分布式事务框架(1.4.2版)
Seata分布式事务框架(1.4.2版)
Seata 概念
1、Seata : 是⼀款开源的分布式事务解决⽅案,致⼒于在微服务架构下提供⾼性能和简单易⽤的分布式事务服务。
仓储(库存)服务:对给定的商品扣除库存。
订单服务:根据采购需求创建订单。
账户服务:从⽤户账号中扣除余额。
Seata 简介
⼀、⼀个经典的分布式事务过程:XID(Transaction ID)+三个组件模型。
1、XID(TranSaction ID):全局唯⼀的事务 ID 。
2、三个组件模型概念:
(1)TC(Transaction Coordinator):事务协调器。维护全局事务的运⾏状态,负责协调并驱动全局事务的提交和回滚。
(2)TM(Transaction Manager):事务管理器。定义全局事务的范围:开始全局事务、提交或回滚全局事务。
(3)RM(Resource Manager):资源管理器。管理分⽀事务处理的资源,与 TC(事务协调器)交互,注册分⽀事务和状态汇报。接受 TC 的指令,并驱动分⽀(本地)事务的提交或回滚。
3、分布式事务处理过程:
(1)TM 向 TC 申请开启⼀个全局事务,全局事务创建成功并⽣成⼀个全局唯⼀的 XID;
(2)XID 在微服务调⽤链路的上下⽂中传播;
(3)RM 向 TC 注册分⽀事务,将其纳⼊ XID 对应的全局事务管辖;
(4)TM 向 TC 发起针对 XID 的全局提交或回滚决议;
(5)TC 调度 XID 管辖的全部分⽀事务完成提交或回滚的请求。
Seata 集⾼可⽤部署
seata-server 的安装配置
配置⽂件以及seata_server数据库表结构:下载 ,在解压⽬录下的script/ ⽬录 有配置⽂件脚本以及seata_server数据库表脚本等信息。将整个 script ⽂件夹拷贝放到 seata-server 的解压⽬录,便于后
续操作。【重要】
## transaction log store, only used in seata-server
store {
## store mode: file、db、redis
mode ="db"
## rsa decryption public key
publicKey =""
## 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 ="sql.jdbc.Driver"
## if using mysql to store the data, recommend add rewriteBatchedStatements=true in jdbc connection param
url ="jdbc:mysql://127.0.0.1:3306/seata_server?rewriteBatchedStatements=true"
user ="root"
password ="123456"
minConn =5
maxConn =100
globalTable ="global_table"
branchTable ="branch_table"
lockTable ="lock_table"
queryLimit =100
maxWait =5000
}
}
3、创建数据库【MySQL5.7.+】:seata_server 。
-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
CREATE TABLE IF NOT EXISTS`global_table`
(
`xid`VARCHAR(128)NOT NULL,
`transaction_id`BIGINT,
`status`TINYINT NOT NULL,
`application_id`VARCHAR(32),
`transaction_service_group`VARCHAR(32),
`transaction_name`VARCHAR(128),
`timeout`INT,
`begin_time`BIGINT,
`application_data`VARCHAR(2000),
`gmt_create`DATETIME,
`gmt_modified`DATETIME,
PRIMARY KEY(`xid`),
KEY`idx_gmt_modified_status`(`gmt_modified`,`status`),
KEY`idx_transaction_id`(`transaction_id`)
)ENGINE=InnoDB
DEFAULT CHARSET= utf8;
-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS`branch_table`
(
`branch_id`BIGINT NOT NULL,
`xid`VARCHAR(128)NOT NULL,
`transaction_id`BIGINT,
`resource_group_id`VARCHAR(32),
`resource_id`VARCHAR(256),
`branch_type`VARCHAR(8),
`status`TINYINT,
`client_id`VARCHAR(64),
`application_data`VARCHAR(2000),
`gmt_create`DATETIME(6),
`gmt_modified`DATETIME(6),
PRIMARY KEY(`branch_id`),
KEY`idx_xid`(`xid`)
)ENGINE=InnoDB
DEFAULT CHARSET= utf8;
-
- the table to store lock data
CREATE TABLE IF NOT EXISTS`lock_table`
(
`row_key`VARCHAR(128)NOT NULL,
`xid`VARCHAR(96),
`transaction_id`BIGINT,
`branch_id`BIGINT NOT NULL,
`resource_id`VARCHAR(256),
`table_name`VARCHAR(32),
`pk`VARCHAR(36),
`gmt_create`DATETIME,
`gmt_modified`DATETIME,
PRIMARY KEY(`row_key`),
KEY`idx_branch_id`(`branch_id`)
)ENGINE=InnoDB
DEFAULT CHARSET= utf8;
4、修改 conf ⽬录下的 f 配置⽂件(先备份⽂件)。修改注册中⼼和配置中⼼,此处使⽤的 nacos。
# 注册中⼼:将 Seata 注册到 nacos 注册中⼼,供客户端访问
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type="nacos"
nacos {
application ="seata-server"
serverAddr ="127.0.0.1:8848"
group ="SEATA_GROUP"
namespace ="0b0b9b5d-4e28-44c1-a359-8975169fb30b"
cluster ="default"
username ="nacos"
password ="nacos"
}
}
# 配置中⼼:将 seata 服务的配置发布到 nacos 配置中⼼
config {
# file、nacos 、apollo、zk、consul、etcd3
type="nacos"
nacos {
serverAddr ="127.0.0.1:8848"
namespace ="0b0b9b5d-4e28-44c1-a359-8975169fb30b"
group ="SEATA_GROUP"
username ="nacos"
password ="nacos"
dataId ="seataServer.properties"
}
}
5、配置中⼼配置(复制后删除注释)
(1)修改数据源配置,与 f 配置⽂件的数据源配置⼀致。
(2)修改事务分组
transport.server=NIO
transport.heartbeat=true
transport.threadFactory.bossThreadPrefix=NettyBoss
transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
transport.threadFactory.shareBossWorker=false
transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
transport.threadFactory.clientSelectorThreadSize=1
transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
transport.threadFactory.bossThreadSize=1
transport.threadFactory.workerThreadSize=default
transport.shutdown.wait=3
# (复制后删除注释)事务分组:my_test_tx_group ⾃定事务分组名称,客户端配置访问事务分组需要与此处名称⼀致,此处的default和客户端配置⽂件中的注册中⼼的 cluster ⼀致
_test_tx_group=default
uplist=127.0.0.1:8091
service.disableGlobalTransaction=false
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论