Seata部署
# 部署声明
中间件 | 版本 | 服务器IP | 端口 |
---|---|---|---|
Seata | 1.5.2 | 192.168.10.100 | 8091、7091 |
Nacos | 2.0.3 | 192.168.10.99 | 8848 |
MySQL | 8.0.27 | 192.168.10.98 | 3306 |
# 官方链接
名称 | 地址 |
---|---|
文档 | http://seata.io/zh-cn/ (opens new window) |
源码 | https://github.com/seata/seata (opens new window) |
MySQL脚本 | seata.sql (opens new window) |
Seata外置配置 | config.txt (opens new window) |
# 数据库创建
# 1. 创建用户(可忽略)
# 降低MySQL密码策略等级
set global validate_password.length=4;
set global validate_password.special_char_count=0;
set global validate_password.policy =LOW;
# 创建用户
create user 'seata'@'%' IDENTIFIED BY 'seata';
# 授权
grant all privileges on seata.* to seata@'%';
flush privileges;
# 2. Seata数据库
-- 1. 执行语句创建名为 seata 的数据库
CREATE DATABASE seata DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;
-- 2.执行脚本完成 Seata 表结构的创建
use seata;
-- 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_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);
# Seata 配置
# 1. 获取Seata外置配置
获取Seata外置配置在线地址:config.txt (opens new window)
# 2. 导入外置配置
Nacos 默认public 命名空间下 ,新建Data ID 为 seataServer.properties 的配置,Group为SEATA_GROUP的配置,并将Seata外置配置config.txt内容全量复制进来
# 3. 修改外置配置
seataServer.properties 需要修改存储模式为db和db连接配置
# 修改store.mode为db,配置数据库连接
store.mode=db
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://192.168.10.98:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=root
store.db.password=123456
- store.mode=db 存储模式选择为数据库
- 192.168.10.98 MySQL主机地址
- store.db.user=root 数据库用户名
- store.db.password=123456 数据库密码
# Seata部署
Seata 官方部署文档:https://seata.io/zh-cn/docs/ops/deploy-by-docker.html
# 1. 获取应用配置
按照官方文档描述使用自定义配置文件的部署方式,需要先创建临时容器把配置copy到宿主机
创建临时容器
docker run -d --name seata-server -p 8091:8091 -p 7091:7091 seataio/seata-server:1.5.2
创建挂载目录
mkdir -p /mnt/seata/config
复制容器配置至宿主机
docker cp seata-server:/seata-server/resources/. /mnt/seata/config
注意复制到宿主机的目录,下文启动容器需要做宿主机和容器的目录挂载
过河拆桥,删除临时容器
docker rm -f seata-server
# 2. 修改启动配置
在获取到 seata-server 的应用配置之后,因为这里采用 Nacos 作为 seata 的配置中心和注册中心,所以需要修改 application.yml 里的配置中心和注册中心地址,详细配置我们可以从 application.example.yml 拿到。
application.yml 原配置
vi /mnt/seata/config/application.yml
修改后的配置(参考 application.example.yml 示例文件),以下是需要调整的部分,其他配置默认即可
seata:
config:
type: nacos
nacos:
server-addr: 192.168.10.99:8848
namespace:
group: SEATA_GROUP
data-id: seataServer.properties
registry:
type: nacos
preferred-networks: 30.240.*
nacos:
application: seata-server
server-addr: 192.168.10.99:8848
namespace:
group: SEATA_GROUP
cluster: default
# 存储模式在外置配置(Nacos)中,Nacos 配置加载优先级大于application.yml,会被application.yml覆盖,所以此处注释
#store:
#mode: file
- 192.168.10.99 是Nacos宿主机的IP地址,Docker部署别错填 localhost 或Docker容器的IP(172.17. * . *)
- namespace nacos命名空间id,不填默认是public命名空间
- data-id: seataServer.properties Seata外置文件所处Naocs的Data ID,参考上小节的 导入配置至 Nacos
- group: SEATA_GROUP 指定注册至nacos注册中心的分组名
- cluster: default 指定注册至nacos注册中心的集群名
# 3. 启动容器
docker run -d --name seata-server --restart=always \
-p 8091:8091 \
-p 7091:7091 \
-e SEATA_IP=192.168.10.100 \
-v /mnt/seata/config:/seata-server/resources \
seataio/seata-server:1.5.2
/mnt/seata/config Seata应用配置挂载在宿主机的目录
192.168.10.100 Seata 宿主机IP地址
# 4. 启动验证
在 nacos 控制台 的 public 命名空间下服务列表里有 seata-server 说明部署启动成功
上次更新: 2023/01/05, 20:59:19