准备
创建临时容器复制配置文件到宿主机,方便后面持久化
docker run -d --name seata-temp apache/seata-server:2.5.0
创建持久化目录
mkdir -p /data/seata/resources
拷贝配置文件到本地
docker cp seata-temp:/seata-server/resources/application.yml /data/seata/resources/application.yml
#复制完成后删除临时容器
docker rm -f seata-temp
创建docker-compose文件,直接 vim /data/seata/docker-compose.yml
services:
seata-server:
image: apache/seata-server:2.5.0
container_name: seata-server
restart: always
ports:
- "8091:8091" # 2.0以下版本Seata Server 核心通信端口
- "7091:7091" # 2.0以下版本Seata 控制台 (Console) 端口,2.3.0以上不可用
environment:
- TZ=Asia/Shanghai
- SEATA_PORT=8091
- SEATA_IP=你的IP
#数据存储到数据库
- STORE_MODE=db
- SEATA_CONFIG_NAME=file:/seata-server/resources/application.yml
volumes:
# 挂载自定义配置文件
- /data/seata/resources/application.yml:/seata-server/resources/application.yml
#如果使用MySQL存储需要添加下面的扩展
- /data/seata/mysql-connector-java-8.0.30.jar:/seata-server/libs/mysql-connector-java-8.0.30.jar
application.yml配置文件内容(仅供参考)
server:
port: 7091
spring:
application:
name: seata-server
main:
web-application-type: none
logging:
config: classpath:logback-spring.xml
file:
path: ${log.home:${user.home}/logs/seata}
extend:
logstash-appender:
# off by default
enabled: false
destination: 127.0.0.1:4560
kafka-appender:
# off by default
enabled: false
bootstrap-servers: 127.0.0.1:9092
topic: logback_to_logstash
producer:
acks: 0
linger-ms: 1000
max-block-ms: 0
metric-appender:
# off by default
enabled: false
seata:
config:
# support: nacos, consul, apollo, zk, etcd3
type: file
#nacos:
# application: seata-server
# server-addr: NACOS的IP:8848
# namespace: ""
# group: SEATA_GROUP
# username: nacos
# password: nacos
registry:
# support: nacos, eureka, redis, zk, consul, etcd3, sofa
type: nacos
nacos:
application: seata-server
server-addr: NACOS的IP:8848
namespace: ""
group: SEATA_GROUP
username: nacos
password: Zh1Pegqy9t2AFi6CJu
store:
# support: file 、 db 、 redis 、 raft
mode: db
db:
datasource: druid
dbType: mysql
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://数据库IP:3306/seata?useUnicode=true&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
user: root
password: 你的密码
#server:
# service-port: 8091 #If not configured, the default is '${server.port} + 1000'
如果使用MySQL存储需要在启动前创建数据库并初始化
-- 1. 全局事务表 (记录全局事务的状态、超时时间等)
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;
-- 2. 分支事务表 (记录各个微服务分支事务的执行状态)
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;
-- 3. 全局锁表 (防止不同全局事务并发修改同一行数据,即防止脏写)
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` (`xid`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
-- 4. 分布式锁表 (用于集群部署时,多节点间的异步提交、重试等任务的互斥)
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),
('RetryCommitting', ' ', 0),
('RetryRollbacking', ' ', 0),
('TxTimeoutCheck', ' ', 0);
数据库扩展下载地址:https://dev.mysql.com/downloads/connector/j/
- 操作步骤:
- 在 “Select Operating System” 下拉菜单中,选择 Platform Independent(平台无关)。
- 推荐选择 ZIP Archive 格式,点击 “Download” 按钮。
- 在跳转的页面中,无需登录账号,直接点击底部的 “No thanks, just start my download” 即可开始下载。
- 下载完成后,解压压缩包,里面名为
mysql-connector-j-8.x.x.jar或mysql-connector-java-8.x.x.jar的文件就是你需要挂载的驱动包。
到此为止准备工作基本完成
启动服务
在/data/seata 目录中启动容器
docker compose up -d
使用命令查看启动日志,没有报错就是启动成功了
docker logs -f seata-server
说明
Seata的2.0版本以后貌似就不再支持Web Console了,我试了很多办法都无法开启,我搜了一些Blog里也都是部署的1.7.0左右的版本,如果有2.0以上版本开启Web Console的方法也欢迎给我发邮件,我会更新文档