Seata简介
Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA事务模式,为用户大致一站式的分布式解决方案。
- 对业务无侵入:即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入。
- 高性能 :减少分布式事务解决方案所带来的性能消耗。
官方站点: - 源码:https://github.com/seata/seata
- 文档:http://seata.io/zh-cn/index.html
Seata术语
TC(Transaction Coordinator:事务协调者):维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM(Transaction Manager:事务管理器):定义全局事务的范围,开始全局事务、提交或回滚全局事务。
RM(Resource Manager:资源管理器):管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
undo_log表
undo_log用于回滚日志。
- undo_log必须在每个业务数据库中创建,用于保存回滚操作数据。
- 当全局提交时,undo_log记录直接删除。
- 当全局回滚时,将现有数据撤销,还原至操作前的状态,详见:beforeImage和afterImage
-- the table to store seata xid data
-- 0.7.0+ add context
-- you must to init this sql for you business databese. the seata server not need it.
-- 此脚本必须初始化在你当前的业务数据库中,用于AT 模式XID记录。与server端无关(注:业务数据库)
-- 注意此处0.3.0+ 增加唯一索引 ux_undo_log
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
`ext` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
搭建Seata TC协调者
存储模式使用DB,使用Nacos作为配置中心。
部署包下载
https://seata.io/zh-cn/blog/download.html
下载相应的版本,作者本人下载的是seata-server-1.2.0版本。
修改conf/logback.xml的文件(可选操作)
修改日志目录是为了自定义日志目录,方便日志查看。
将${user.home}改为具体的seata目录,我这里是:D:/tools/seata-server-1.2.0-nacos-mode/seata
<property name="LOG_HOME" value="D:/tools/seata-server-1.2.0-nacos-mode/seata/logs/seata"/>
使用Nacos作为Seata的配置中心
如果不用Nacos,那Seata的默认配置中心在哪呢?
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "file"
nacos {
......
}
-- 重点
file {
name = "file.conf"
}
}
没错,就是file.conf文件,接下来我们不再依靠file.conf文件而是nacos,要让seata使用nacos作为配置中心,我们需要按照以下步骤进行操作。
- 保证你的Nacos服务已经启动,且可以正常连接。
- 添加命名空间seata,获取namespace的id,我这里是62f0ae5b-38ea-4a2d-bb71-70ccbc0a8c10
- 修改registry.conf文件
这个文件内容分为registry和config两部分,我们使用nacos注册中心,可以可以采用默认的file方式。
- 将registry和config部分的type=”file”都换成type=“nacos”(注意是2处地方)。
- 将两处的nacos配置根据实际情况需要调整参数,本机启动nacos则不需要调整。
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "nacos"
nacos {
application = "seata-server"
serverAddr = "192.168.230.128:8848"
group = "SEATA_GROUP"
# 根据自己创建的seata命名空间来设置
namespace = "62f0ae5b-38ea-4a2d-bb71-70ccbc0a8c10"
cluster = "default"
username = "nacos"
password = "nacos"
}
}
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "nacos"
nacos {
serverAddr = "192.168.230.128:8848"
namespace = "62f0ae5b-38ea-4a2d-bb71-70ccbc0a8c10"
group = "SEATA_GROUP"
username = "nacos"
password = "nacos"
}
}
- 下载nacos-config脚本和config.txt,点击进入下载页
- nacos-config.sh和nacos-config.py选择一个。
- 在seata目录下创建一个script目录,将nacos-config.sh放入script目录下。
- 下载config.txt文件,把文件放在seata目录下,与conf、lib目录同级,可通过nacos-config.sh脚本推送到nacos配置中心。
- 修改config.txt的内容。
将store.mode改成db;
mysql连接改为你自己的数据库。
注意如果是mysql8版本,采用cj驱动,url后缀需要加serverTimezone=Asia/Shanghai
driverClassName = “com.mysql.cj.jdbc.Driver”
- 数据库对应上述配置新建seata的DB,并分配给指定的用户权限。
- 初始化table,注意此处一定要初始化,并且1.0之后的版本没有sql脚本,这里我贴出来。
-- the table to store GlobalSession data
drop table if exists `global_table`;
create table `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`)
);
-- the table to store BranchSession data
drop table if exists `branch_table`;
create table `branch_table` (
`branch_id` bigint not null,
`xid` varchar(128) not null,
`transaction_id` bigint ,
`resource_group_id` varchar(32),
`resource_id` varchar(256) ,
`lock_key` varchar(128) ,
`branch_type` varchar(8) ,
`status` tinyint,
`client_id` varchar(64),
`application_data` varchar(2000),
`gmt_create` datetime,
`gmt_modified` datetime,
primary key (`branch_id`),
key `idx_xid` (`xid`)
);
-- the table to store lock data
drop table if exists `lock_table`;
create table `lock_table` (
`row_key` varchar(128) not null,
`xid` varchar(96),
`transaction_id` long ,
`branch_id` long,
`resource_id` varchar(256) ,
`table_name` varchar(32) ,
`pk` varchar(36) ,
`gmt_create` datetime ,
`gmt_modified` datetime,
primary key(`row_key`)
);
- 打开git bash或类Linux命令行工具,执行shell脚本(注意脚本是否有执行的权限)
$ cd script
# -h 主机,你可以使用localhost,-p 端口号 ,-t 命名空间ID,-u 用户名,-p 密码
$ sh nacos-config.sh -h 192.168.230.128 -p 8848 -g SEATA_GROUP -t 62f0ae5b-38ea-4a2d-bb71-70ccbc0a8c10
-u nacos -p nacos
参考
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/100053.html