Seata 環境搭建

2022-10-27 18:01:30

在使用微服務中,單體事務註解@Transactional 就不適用了,需要採用分散式事務解決方案,本文介紹分散式事務Seata的安裝。Seata一款開源的分散式事務解決方案,致力於在微服務架構下提供高效能和簡單易用的分散式事務服務。

seata版本: 1.5.2

前提準備

Seata是一個分散式事務,seata伺服器端也是一個微服務,需要和其他微服務一樣需要註冊中心設定中心。同時事務回滾,需要資料庫紀錄檔記錄。

  • 註冊中心和設定中心: nacos
  • 資料庫: mysql

1.下載

進入Seata官網下載,下載版本是1.5.2,找到seata-server-1.5.1.tar.gz下載。解壓檔案後進入seata檔案。

2.建表

新建資料庫seata,然後在seata資料夾裡面的script檔案,找到server —> db —> mysql.sql,在資料庫中執行sql語句:

-- 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);

全域性事務對談由:全域性事務、分支事務、全域性鎖,對應表分別為global_tablebranch_tablelock_table

3.設定 nacos

nacos控制檯新增新的名稱空間:

新增一條seata名稱空間ID在後面需要用到:

3.1 上傳設定至Nacos設定中心

進到seata目錄中,找到nacos-config.sh檔案,路徑:script -> config-center -> nacos -> nacos-config.sh。執行nacos-config.sh指令碼:

sh nacos-config.sh -h 127.0.0.1 -p 8848 -g SEATA_GROUP -t xxxx -u username -w password

引數詳解:

  • -h nacos服務IP
  • -p nacos伺服器埠
  • -u nacos登入名
  • -w nacos登入密碼
  • -g nacos 設定的分組名稱,預設設定SEATA_GROUP
  • -t 上一步設定的名稱空間ID

執行指令碼之後,輸出以下指令碼:

Set server.maxCommitRetryTimeout=-1 successfully 
Set server.maxRollbackRetryTimeout=-1 successfully 
Set server.rollbackRetryTimeoutUnlockEnable=false successfully 
Set server.distributedLockExpireTime=10000 successfully 
Set server.xaerNotaRetryTimeout=60000 successfully 
Set server.session.branchAsyncQueueSize=5000 successfully 
Set server.session.enableBranchAsyncRemove=false successfully 
Set server.enableParallelRequestHandle=false successfully 
Set metrics.enabled=false successfully 
Set metrics.registryType=compact successfully 
Set metrics.exporterList=prometheus successfully 
Set metrics.exporterPrometheusPort=9898 successfully 

再去nacos控制檯檢視設定:

說明設定上傳成功。上傳不成功,大部分原因是設定沒有設定成功,比如名稱空間ID沒設定正確。

4.修改 appplication.yml

找到appplication.yml檔案,路徑為:seata -> conf -> application.yml,以下三個小節分別設定storeconfigregistry:

4.1 seata.store

seata.store設定seata的儲存,修改store.mode="db":

seata:
  store:
    # support: file 、 db 、 redis
    mode: db

修改資料庫連線,將 seata -> conf -> application.example.yml中附帶額外設定,將其db相關設定複製至application.yml,修改store.db相關屬性。資料庫是步驟一設定的資料庫:

seata:
  store:
    # support: file 、 db 、 redis
    mode: db
    db:
      datasource: druid
      db-type: mysql
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://xxxxx:3306/seata?rewriteBatchedStatements=true
      user: xxxx
      password: xxx
      min-conn: 5
      max-conn: 100
      global-table: global_table
      branch-table: branch_table
      lock-table: lock_table
      distributed-lock-table: distributed_lock
      query-limit: 100
      max-wait: 5000

4.2 seata.config

seata.config是設定nacos設定中心相關的設定。將seata.config.type修改成nacos

seata:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: nacos

然後新增seata.config.nacos相關的設定:

seata:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      group : "SEATA_GROUP"
      namespace: "xxxxx"
      username: "xxx"
      password: "xxx"

其中namespace是步驟3中的名稱空間ID

4.3 seata.registry

seata.registry是設定註冊中心相關欄位,將seata服務作為一個微服務註冊到註冊中心。將registry.type改成nacos,設定如下:

seata:
  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: nacos
    nacos:
      application: "seata-server"
      serverAddr: 127.0.0.1:8848
      group: "SEATA_GROUP"
      namespace: "xxxxxx"
      username: "xxxx"
      password: "xxx"

namespace也是步驟3中的名稱空間ID

啟動

找到seata檔案中的bin目錄,執行啟動命令:

seata-server.sh -h 127.0.0.1 -p 8091 -m db

控制檯輸出:

apm-skywalking not enabled
seata-server is starting, you can check the /opt/seata/logs/start.out

開啟start.out紀錄檔:

系統啟動成功,再登入 http://127.0.0.1:7091,就能看到seata控制檯資訊。

nacos控制檯服務列表新增了一個服務,說明seata服務成功註冊到了nacos註冊中心:

總結

  • seata安裝版本是1.5.2,版本不同,安裝流程也可能不同,這裡的版本需要保持一致
  • 執行sql建立資料表
  • 使用指令碼新增設定到nacos設定中心
  • 修改application.yml檔案,分別修改storeconfigregistry相關設定。
  • 啟動服務,成功登陸seata控制檯。
  • 檢視nacos控制檯,服務列表新增seata服務。

參考