准备

创建临时容器复制配置文件到宿主机,方便后面持久化

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/

  • 操作步骤:
    1. 在 “Select Operating System” 下拉菜单中,选择 Platform Independent(平台无关)。
    2. 推荐选择 ZIP Archive 格式,点击 “Download” 按钮。
    3. 在跳转的页面中,无需登录账号,直接点击底部的 “No thanks, just start my download” 即可开始下载。
    4. 下载完成后,解压压缩包,里面名为 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的方法也欢迎给我发邮件,我会更新文档

发表回复