Linux部署Seata详细过程记录

2023-10-27

Seata服务搭建

Seata官方文档地址
Seata安装包下载地址
依赖版本说明地址

SpringCloudAlibaba版本对应组件版本说明,详细参考官网文档。
在这里插入图片描述

当前使用Spring-cloud-alibaba对应的seata版本为v1.3.0,所以需要下载v1.3.0版本安装包

  1. 将安装包上传到服务器上,个人默认存储地址

/usr/local/lib/java

  1. 解压安装包,移动安装包至/usr/local目录下

tar -zxvf seata-server-1.3.0.tar.gz

mv seata /usr/local/seata

Seata的三大角色

在Seata的架构中,一共有三个角色:

  • TC - 事务协调者

维护全局和分支事务的状态,驱动全局事务提交和回滚

  • TM - 事务管理器

定义全局事务的范围:开始全局事务、提交或回滚全局事务

  • RM - 资源管理器

管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

其中,TC为单独部署的server服务器,TM和RM为嵌入到应用中的Client客户端

在Seata中,一个分布式事务的生命周期如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uQo35f82-1665807994566)(https://note.youdao.com/yws/api/personal/file/D697E953ACEC40CB8622B61907673B21?method=download&shareKey=bf89b6bb0ec172008c89ed2c9a80a688)]

  1. TM请求TC开启一个全局事务。TC会生成一个XID作为该全局事务的编号。XID会在微服务的调用链路中传播,保证多个微服务的子事务关联在一起。
  2. RM请求TC将本地事务注册为全局事务的分支事务,通过全局事务的XID进行关联。
  3. TM请求TC告诉XID对应的全局事务是进行提交还是回滚。

Server端存储模式(store.mode)支持三种

  • file:(默认)单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高
  • db:(数据库版本需使用5.7+版本)高可用模式,全局事务会话信息通过db共享,相对性能差些。
  • redis:Seata-Server1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置适合当前场景的redis持久化配置

采用使用db模式

  1. 修改配置文件模式选择,默认为file
cd /seata/conf
vi file.conf
将mode="file" 修改为mode="db"

修改配置文件中db对应的连接池信息

# 注意这里需要新建一个seata的数据库
driverClassName = "com.mysql.cj.jdbc.Driver"
url = "jdbc:mysql://ip:3306/seata"
user = "xx"
password = "xx"
  1. 初始化seata表结构sql脚本

选择对应的数据库脚本文件,这里使用mysql


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_status_gmt_modified` (`status` , `gmt_modified`),
    KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

-- 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 = utf8mb4;

-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(
    `row_key`        VARCHAR(128) NOT NULL,
    `xid`            VARCHAR(128),
    `transaction_id` BIGINT,
    `branch_id`      BIGINT       NOT NULL,
    `resource_id`    VARCHAR(256),
    `table_name`     VARCHAR(32),
    `pk`             VARCHAR(36),
    `status`         TINYINT      NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
    `gmt_create`     DATETIME,
    `gmt_modified`   DATETIME,
    PRIMARY KEY (`row_key`),
    KEY `idx_status` (`status`),
    KEY `idx_branch_id` (`branch_id`),
    KEY `idx_xid_and_branch_id` (`xid` , `branch_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `distributed_lock`
(
    `lock_key`       CHAR(20) NOT NULL,
    `lock_value`     VARCHAR(20) NOT NULL,
    `expire`         BIGINT,
    primary key (`lock_key`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);

  1. db存储模式+Nacos(注册&配置中心)部署 (高可用集群部署方式

配置Nacos注册中心,负责事务参与者(微服务)和TC通讯。将Seata Server注册到Nacos,修改conf目录下的registry.conf配置

cd /seata/conf
vi registry.conf

# 修改注册方式
type="file" 修改为 type="nacos"

# 修改注册中心nacos配置(registry)
nacos {
    application = "seata-server"
    
    # nacos服务地址
    serverAddr = "xx:xx:xx:xx:port"
    # 可以设置负载均衡策略,默认轮询
    # loadBalance = "RandomLoadBalance"
    # loadBalanceVirtualNodes = 10
    group = "SEATA_GROUP"
    namespace = ""
    cluster = "default"
    # 用户名密码
    username = "xxxx"
    password = "xxxx"
  }

# 修改配置中心方式
type="file" 修改为 type="nacos"

# 修改配置中心nacos配置
nacos {
    # nacos服务地址
    serverAddr = "xx:xx:xx:xx:port"
    namespace = ""
    group = "SEATA_GROUP"
    username = "xxxx"
    password = "xxxx"
  }

  1. 下载源码包,复制源码下的script文件夹放到现有seata安装环境下。
  • 将源码安装包下载并上传至服务器
  • 解压并移动到对应文件夹下
tar -zxvf seata-1.3.0.tar.gz
mv seata-1.3.0 /usr/local/seata-1.3.0
  • 复制script文件夹放到现有seata安装目录下
cp -r /usr/local/seata-1.3.0/script/ /usr/local/seata/
  1. 修改script文件夹下默认配置
cd /usr/local/seata/script/config-center
vi config.txt

# 修改模式为db,修改数据库链接配置

store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://ip:3306/seata?useUnicode=true
store.db.user=xx
store.db.password=xx

  1. 配置事务分组,要与客户端配置的事务分组保持一致(不设置分组,可以直接跳过)

service.vgroupMapping.my_test_tx_group=default

my_test_tx_group需要与客户保持一致,default需要跟客户端和registry.conf中registry中的cluster保持一致

(客户端properties配置:spring.cloud.alibaba.seata.tx-service-group=my_test_tx_group)

事务分组:解决异地机房、机房断电等容错问题

my_test_tx_group可以i自定义,比如(beijing、shanghai),对应的client也要去设置

seata.service.vgroup-mapping.projectA=beijing
  1. 配置参数同步nacos

shell:

sh ${SEATAPATH}/script/config-center/nacos/nacos-config.sh -h 47.92.158.60 -p 8854 -g SEATA_GROUP -t xxxxxxxxx -u nacos -w nacos

参数说明:

-h:host,默认值localhost

-p:port,默认8848

-g:配置分组,默认值为‘SEATA_GROUP’

-t:租户信息,对应Nacos的命名空间ID字段,默认值为空‘’

-u:用户名

-w:密码

手动修改sh脚本文件配置:

cd /usr/local/seata/script/config-center/nacos
vi nacos-config.sh

# 修改配置
if [[ -z ${host} ]]; then
    host=xx.xx.xx.xx
fi
if [[ -z ${port} ]]; then
    port=xxxx
fi
if [[ -z ${group} ]]; then
    group="SEATA_GROUP"
fi
if [[ -z ${tenant} ]]; then
    tenant=""
fi
if [[ -z ${username} ]]; then
    username="nacos"
fi
if [[ -z ${password} ]]; then
    password="xxxx"
fi

  1. 运行脚本,同步配置至nacos
# 如果sh脚本没有执行权限,先增加权限
chmod +x nacos-config.sh

# 两种方式运行
1、配置文件已修改
./nacos-config.sh
2、 配置文件无修改
sh ${SEATAPATH}/script/config-center/nacos/nacos-config.sh -h 47.92.158.60 -p 8854 -g SEATA_GROUP -t xxxxxxxxx -u nacos -w nacos
  1. 刷新nacos,配置已经同步成功了。

启动Seata

cd /usr/local/seata/bin
./seata-server.sh

启动参数:

参数 全写 作用 备注
-h –host 指定在注册中心注册的IP 不指定时获取当前的IP,外部访问部署在云环境和容器中的server建议指定
-p –port 指定server启动的端口 默认为8091
-m –storeMode 事务日志存储方式 支持file,db,redis,默认为file,注:redis需seata-server1.3版本以上
-n –serverNode 用于指定seata-server节点ID 如1,2,3…默认为1
-3 –seataEnv 指定seata-server运行环境 如dev,test等,服务启动时会使用registry-dev.conf这样的配置
# 举例:指定端口启动
./seata-server.sh -p 8091

# 如果部署集群,指定端口和节点启动
./seata-server.sh -p 8091 -n 1
./seata-server.sh -p 8092 -n 2
./seata-server.sh -p 8093 -n 3

启动成功并注册到nacos

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux部署Seata详细过程记录 的相关文章

随机推荐