マイクロサービス: Seata AT 分散トランザクションと構成方法 (パート 1)

目次

序文 はじめに:

1. シータアットをインストールする 

-> 1.1 最初にバージョンを確認し、グローバルに検索する

 -> 1.2 リリースノート · alibaba/spring-cloud-alibaba Wiki

 -> 1.3 シートアットバージョンの選択

 → 1.4 ダウンロード後、下図に従ってファイルを作成します

---> 1.4.0 まずnacosに名前空間seataを作成します。  

 ---> 1.4.1 registry.conf の変更

---> 1.4.2 file.confの変更

 → 1.4.3 config.txtファイルを変更する

---> 1.4.4 データベースはseataとundo_logテーブルを作成します

Seata の SQL は次のとおりです。 

undo_logのSQLは以下の通り

---> 1.4.5seata-push.sh/.batの修正

====> Windows 版: git bash を使用して操作します

 ====> Linux バージョン: ./seata-push.sh

 -> 1.5 設定が完了したら、seata -at を実行します。 

---> 1.5.1 Windows は Seata-server.bat を実行します 

---> 1.5.2 linux Seata-server.sh を実行

2. 以下のお知らせ:分散トランザクションを実現するために springcloud に Seata-at が導入されました

3. コンテキストプレビュー:例外が発生したATの修正方法


序文 はじめに:

Seata AT (分散トランザクション ソリューション) の利点は次のとおりです。

1. 高可用性: Seata AT は分散アーキテクチャを使用して高可用性を実現します。同時に、Seata AT は複数のストレージおよび登録センターもサポートしており、さまざまなニーズに基づいて選択できます。

2. 高性能: Seata AT は、トランザクション制御に効率的なアルゴリズムと最適化戦略を採用しており、高いパフォーマンスを実現します。

3. 統合が簡単: Seata AT は豊富なクライアント API とドキュメントを提供するため、既存のアプリケーションに簡単に統合できます。

4. 複数のシナリオのサポート: Seata AT は、マイクロサービス、分散トランザクション、データ整合性などを含む複数のシナリオに適用できます。

5. オープンソース コミュニティのサポート: Seata AT はオープンソース プロジェクトであり、それを維持およびサポートする活発なコミュニティがあり、ユーザーは十分な技術サポートとコミュニティ リソースを得ることができます。

分散トランザクションの場合は、プロジェクトにはテストコードを書かず、色々調べて、後で時間があるときに補います。

ここではインストール設定のみを記述して使用します

実際のシーンのテスト、サーバーのデプロイメントなど、基本的な穴は埋められています。問題が発生した場合は、コメント欄で指摘してください。

1. シータアットをインストールする 

-> 1.1 最初にバージョンを確認し、グローバルに検索する

 -> 1.2 リリースノート · alibaba/spring-cloud-alibaba Wiki

Spring Cloud Alibaba の各バージョンと、それが適応する各コンポーネントの対応するバージョンを次の表に示します (Spring Cloud Dubbo は 2021.0.1.0 以降トランクから削除され、トランクとともに進化しなくなることに注意してください)。

2022.0.0.0-RC2

1.8.6

2.2.1

4.9.4

1.7.0-ネイティブ-rc2

2021.0.5.0

1.8.6

2.2.0

4.9.4

1.6.1

2.2.10-RC1

1.8.6

2.2.0

4.9.4

1.6.1

2022.0.0.0-RC1

1.8.6

2.2.1-RC

4.9.4

1.6.1

2.2.9.リリース

1.8.5

2.1.0

4.9.4

1.5.2

2021.0.4.0

1.8.5

2.0.4

4.9.4

1.5.2

2.2.8.リリース

1.8.4

2.1.0

4.9.3

1.5.1

2021.0.1.0

1.8.3

1.4.2

4.9.2

1.4.2

2.2.7.リリース

1.8.1

2.0.3

4.6.1

2.7.13

1.3.0

2.2.6.リリース

1.8.1

1.4.2

4.4.0

2.7.8

1.3.0

2021.1 または2.2.5.RELEASEまたは 2.1.4.RELEASE または 2.0.4.RELEASE

1.8.0

1.4.1

4.4.0

2.7.8

1.3.0

2.2.3.リリースまたは2.1.3.リリースまたは2.0.3.リリース

1.8.0

1.3.3

4.4.0

2.7.8

1.3.0

2.2.1.リリースまたは2.1.2.リリースまたは2.0.2.リリース

1.7.1

1.2.1

4.4.0

2.7.6

1.2.0

2.2.0.リリース

1.7.1

1.1.4

4.4.0

2.7.4.1

1.0.0

2.1.1.RELEASE または 2.0.1.RELEASE または 1.5.1.RELEASE

1.7.0

1.1.4

4.4.0

2.7.3

0.9.0

2.1.0.RELEASE または 2.0.0.RELEASE または 1.5.0.RELEASE

1.6.3

1.1.1

4.4.0

2.7.3

0.7.1

 -> 1.3 シートアットバージョンの選択

私はここに 席a-at:1.3.0 バージョン

ダウンロード アドレス (公式 Web サイトのリソース): リリース v1.3.0seata/seata

ダウンロード アドレス (pzy リソース): 自由に設定:  https://download.csdn.net/download/pingzhuyan/87803297 

【少し見直しが必要】 

 → 1.4 ダウンロード後、下図に従ってファイルを作成します

---> 1.4.0 まずnacosに名前空間seataを作成します。  

 ---> 1.4.1 registry.conf の変更

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "nacos"

  nacos {
    application = "seata-server"
    serverAddr = "172.26.2.*:8848"
    group = "SEATA_GROUP"
    namespace = "3afe4eb9-0550-4271-96c1-c005ac0ea174"
    cluster = "default"
    username = "nacos"
    password = "nacos"
  }
  eureka {
    serviceUrl = "http://localhost:8761/eureka"
    application = "default"
    weight = "1"
  }
  redis {
    serverAddr = "localhost:6379"
    db = 0
    password = ""
    cluster = "default"
    timeout = 0
  }
  zk {
    cluster = "default"
    serverAddr = "127.0.0.1:2181"
    sessionTimeout = 6000
    connectTimeout = 2000
    username = ""
    password = ""
  }
  consul {
    cluster = "default"
    serverAddr = "127.0.0.1:8500"
  }
  etcd3 {
    cluster = "default"
    serverAddr = "http://localhost:2379"
  }
  sofa {
    serverAddr = "127.0.0.1:9603"
    application = "default"
    region = "DEFAULT_ZONE"
    datacenter = "DefaultDataCenter"
    cluster = "default"
    group = "SEATA_GROUP"
    addressWaitTime = "3000"
  }
  file {
    name = "file.conf"
  }
}

config {
  # file、nacos 、apollo、zk、consul、etcd3
  type = "nacos"

  nacos {
    serverAddr = "172.26.2.*:8848"
    namespace = "3afe4eb9-0550-4271-96c1-c005ac0ea174"
    group = "SEATA_GROUP"
    username = "nacos"
    password = "nacos"
  }
  consul {
    serverAddr = "127.0.0.1:8500"
  }
  apollo {
    appId = "seata-server"
    apolloMeta = "http://192.168.1.204:8801"
    namespace = "application"
  }
  zk {
    serverAddr = "127.0.0.1:2181"
    sessionTimeout = 6000
    connectTimeout = 2000
    username = ""
    password = ""
  }
  etcd3 {
    serverAddr = "http://localhost:2379"
  }
  file {
    name = "file.conf"
  }
}

---> 1.4.2 file.confの変更


## transaction log store, only used in seata-server
store {
  ## store mode: file、db、redis
  mode = "db"

  ## file store property
  file {
    ## store location dir
    dir = "sessionStore"
    # branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions
    maxBranchSessionSize = 16384
    # globe session size , if exceeded throws exceptions
    maxGlobalSessionSize = 512
    # file buffer size , if exceeded allocate new buffer
    fileWriteBufferCacheSize = 16384
    # when recover batch read size
    sessionReloadReadSize = 100
    # async, sync
    flushDiskMode = async
  }

  ## database store property
  db {
    ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.
    datasource = "druid"
    ## mysql/oracle/postgresql/h2/oceanbase etc.
    dbType = "mysql"
    driverClassName = "com.mysql.jdbc.Driver"
    url = "jdbc:mysql://172.26.2.*:3306/seata"
    user = "root"
    password = "root"
    minConn = 5
    maxConn = 30
    globalTable = "global_table"
    branchTable = "branch_table"
    lockTable = "lock_table"
    queryLimit = 100
    maxWait = 5000
  }

  ## redis store property
  redis {
    host = "127.0.0.1"
    port = "6379"
    password = ""
    database = "0"
    minConn = 1
    maxConn = 10
    queryLimit = 100
  }

}

 → 1.4.3 config.txtファイルを変更する

最も重要な設定は (巨大な穴の場所) です。service.vgroupMapping はこれに注意する必要があります。 

他の場所では、db データベースを変更するだけで済みます。

transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableClientBatchSendRequest=false
transport.threadFactory.bossThreadPrefix=NettyBoss
transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
transport.threadFactory.shareBossWorker=false
transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
transport.threadFactory.clientSelectorThreadSize=1
transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
transport.threadFactory.bossThreadSize=1
transport.threadFactory.workerThreadSize=default
transport.shutdown.wait=3

# 此处可以修改为自己项目的分组
#service.vgroup_mapping.my_test_tx_group=default
## 1.0之后需要换成  vgroupMapping
## 可以写多个配置,只需要相关联的group统一就行


service.vgroupMapping.seata_group=default

service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false
client.rm.asyncCommitBufferLimit=10000
client.rm.lock.retryInterval=10
client.rm.lock.retryTimes=30
client.rm.lock.retryPolicyBranchRollbackOnConflict=true
client.rm.reportRetryCount=5
client.rm.tableMetaCheckEnable=false
client.rm.tableMetaCheckerInterval=60000
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.defaultGlobalTransactionTimeout=60000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000

#此处配置file.conf一致
store.mode=db

store.publicKey=
store.file.dir=file_store/data
store.file.maxBranchSessionSize=16384
store.file.maxGlobalSessionSize=512
store.file.fileWriteBufferCacheSize=16384
store.file.flushDiskMode=async
store.file.sessionReloadReadSize=100

store.db.datasource=druid
store.db.dbType=mysql
#配置数据库相关信息
##store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://172.26.4.*:3306/seata?useUnicode=true
store.db.user=root
store.db.password=*3
icKeyRetrieval=true
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000

store.redis.mode=single
store.redis.single.host=127.0.0.1
store.redis.single.port=6379
store.redis.maxConn=10
store.redis.minConn=1
store.redis.maxTotal=100
store.redis.database=0
store.redis.password=
store.redis.queryLimit=100
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
client.undo.dataValidation=true
client.undo.logSerialization=jackson
client.undo.onlyCareUpdateColumns=true
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
client.undo.logTable=undo_log
client.undo.compress.enable=true
client.undo.compress.type=zip
client.undo.compress.threshold=64k
log.exceptionRate=100
transport.serialization=seata
transport.compressor=none
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898

---> 1.4.4 データベースはseataとundo_logテーブルを作成します

Seata の SQL は次のとおりです。 

/*
Navicat MySQL Data Transfer
Source Server         : mysql
Source Server Version : 80020
Source Host           : localhost:3306
Source Database       : seata
Target Server Type    : MYSQL
Target Server Version : 80020
File Encoding         : 65001
Date: 2022-07-27 18:35:46
*/
 
SET FOREIGN_KEY_CHECKS=0;
 
-- ----------------------------
-- Table structure for `branch_table`
-- ----------------------------
DROP TABLE IF EXISTS `branch_table`;
CREATE TABLE `branch_table` (
  `branch_id` bigint NOT NULL,
  `xid` varchar(128) NOT NULL,
  `transaction_id` bigint DEFAULT NULL,
  `resource_group_id` varchar(32) DEFAULT NULL,
  `resource_id` varchar(256) DEFAULT NULL,
  `branch_type` varchar(8) DEFAULT NULL,
  `status` tinyint DEFAULT NULL,
  `client_id` varchar(64) DEFAULT NULL,
  `application_data` varchar(2000) DEFAULT NULL,
  `gmt_create` datetime(6) DEFAULT NULL,
  `gmt_modified` datetime(6) DEFAULT NULL,
  PRIMARY KEY (`branch_id`),
  KEY `idx_xid` (`xid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Records of branch_table
-- ----------------------------
 
-- ----------------------------
-- Table structure for `global_table`
-- ----------------------------
DROP TABLE IF EXISTS `global_table`;
CREATE TABLE `global_table` (
  `xid` varchar(128) NOT NULL,
  `transaction_id` bigint DEFAULT NULL,
  `status` tinyint NOT NULL,
  `application_id` varchar(32) DEFAULT NULL,
  `transaction_service_group` varchar(32) DEFAULT NULL,
  `transaction_name` varchar(128) DEFAULT NULL,
  `timeout` int DEFAULT NULL,
  `begin_time` bigint DEFAULT NULL,
  `application_data` varchar(2000) DEFAULT NULL,
  `gmt_create` datetime DEFAULT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`xid`),
  KEY `idx_gmt_modified_status` (`gmt_modified`,`status`),
  KEY `idx_transaction_id` (`transaction_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Records of global_table
-- ----------------------------
 
-- ----------------------------
-- Table structure for `lock_table`
-- ----------------------------
DROP TABLE IF EXISTS `lock_table`;
CREATE TABLE `lock_table` (
  `row_key` varchar(128) NOT NULL,
  `xid` varchar(96) DEFAULT NULL,
  `transaction_id` bigint DEFAULT NULL,
  `branch_id` bigint NOT NULL,
  `resource_id` varchar(256) DEFAULT NULL,
  `table_name` varchar(32) DEFAULT NULL,
  `pk` varchar(36) DEFAULT NULL,
  `gmt_create` datetime DEFAULT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`row_key`),
  KEY `idx_branch_id` (`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Records of lock_table
-- ----------------------------

undo_logのSQLは以下の通り

<分散トランザクションを使用するライブラリをどのライブラリに作成する>

-- the table to store seata xid data
-- 0.7.0+ add context
-- you must to init this sql for you business databese. the seata server not need it.
-- 此脚本必须初始化在你当前的业务数据库中,用于AT 模式XID记录。与server端无关(注:业务数据库)
-- 注意此处0.3.0+ 增加唯一索引 ux_undo_log

-- drop table `undo_log`;
CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  `ext` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

---> 1.4.5seata-push.sh/.batの修正

sh nacos-config.sh -h 172.26.2.* -p 8848 -g SEATA_GROUP -t 3afe4eb9-0550-4271-96c1-c005ac0ea174 -u nacos -w nacos
-h IP アドレス (サーバー イントラネット IP は Windows ローカルにすることができます)リモートのパブリック ネットワーク IP) を使用します。

-p は nacos のポート番号を指定します;
-g は設定されたグループを指定します、これは設定されたグループ <SEATA_GROUP である必要があります> (午後に紹介されます) であることに注意してください;
-t は名前空間 ID、nacos で作成されたデフォルト ID を指定します;
- u -w を指定します nacos のユーザー名とパスワードは、nacos の登録と構成認証が有効な場合にのみ指定する必要があります。

====> Windows 版: git bash を使用して操作します

以下の図に示すように、bat を使用してファイルをコピーすることはできません。操作するには、ここで git bash コンソールを使用します。

[かなりすっきりしましたね、へへ] 

 ====> Linux バージョン: ./seata-push.sh

shでファイルをコピーできない場合は、Linuxコンソール上で操作してください(図のように)

 -> 1.5 設定が完了したら、seata -at を実行します。 

---> 1.5.1 Windows は Seata-server.bat を実行します 

---> 1.5.2 linux Seata-server.sh を実行

フォアグラウンド開始: ./seata-server.sh

バックグラウンド開始: nohup ./seata-server.sh >log.out 2>1 &


この時点で、seata-at のすべての設定が完了しました。

2. 以下のお知らせ:分散トランザクションを実現するために springcloud に Seata-at が導入されました

 設定ファイル XML 基本コードなど

ポータル: => マイクロサービス: Seata AT springCloud は構成モードで分散トランザクションを統合します (パート 2)

3. コンテキスト プレビュー: AT で発生した例外の解決策

例外に対する解決策のソース コード分析の一部 (ほとんどの問題は修復可能です)  

ポータル: => マイクロサービス: Seata AT 分散トランザクション構成の例外解決 (非常に包括的) (パート 2)

おすすめ

転載: blog.csdn.net/pingzhuyan/article/details/130781186