分布式事务篇-2.2 Seata存储模式,配置模式,注册模式

文章目录

  • 前言
  • 一、存储模式:
    • 1.1 存储模式的作用:
    • 1.2 File 存储模式:
      • 1.2.1 映射数据存储文件:
      • 1.2.3 file存储优缺点:
    • 1.3 db 存储模式:
      • 1.3.1 application.yml 配置db 信息:
      • 1.3.1 拷贝驱动jar:
      • 1.3.2 创建 seata 数据库并执行脚本:
      • 1.3.3 重启seata-server:
      • 1.3.4 db 存储模式优缺点:
    • 1.4 redis 存储模式:
  • 二、配置和注册:
    • 2.1 配置中心:
    • 2.2 注册中心:
      • 2.2.1 注册中心的作用:
      • 2.2.2 注册中心配置(nacos):
  • 总结:
  • 参考:


前言

在对Seata 进行部署后,发现Seata 的使用需要配置:存储模式,配置模式,注册模式 ;他们的作用是什么,又应该怎么进行配置?


提示:以下是本篇文章正文内容,下面案例可供参考

一、存储模式:

1.1 存储模式的作用:

存储模式指定了Seata Server用于存储事务和元数据的方式。Seata Server支持三种存储模式:file、db和Redis。列如 当开始事务时需要生成全局事务id Xid ,在生成后就需要Seata 服务进行存储,所以他是Seata Server的重要组成部分;

1.2 File 存储模式:

1.2.1 映射数据存储文件:

-v /root/seata/sessionStore:/seata-server/sessionStore   \

其中 /sessionStore 为容器内数据存储的位置,通过查看application.example.yml 可知为:

分布式事务篇-2.2 Seata存储模式,配置模式,注册模式_第1张图片

1.2.3 file存储优缺点:

优点:

  • 易于部署和使用:相比于其他存储模式(如数据库存储模式),文件存储模式更加简单和易于部署。不需要额外的依赖或配置,只需通过配置文件指定存储路径即可。

  • 高性能:使用文件系统来存储数据可以提供较高的性能。文件系统通常具有快速的读写速度和较低的延迟,可以满足高并发事务的需求。

  • 低延迟:由于文件系统的本地读写,存储和读取数据的时延较低,可以加速事务的执行速度。

  • 简化维护:使用文件存储模式可以避免额外的数据库配置和维护工作,减少了数据库管理的复杂性和维护成本。

缺点:

  • 单点故障:文件存储模式下,如果使用单个文件系统来存储所有Undo log和Branch Sessions的数据,那么一旦该文件系统出现故障,会造成数据丢失和无法恢复的风险。

  • 有限的扩展性:文件存储模式相对于数据库存储模式来说,扩展性较差。当需要水平扩展时,可能需要考虑文件系统的共享和同步机制,以确保所有节点都可以正确读取和写入数据。

  • 数据备份和恢复的复杂性:文件存储模式的数据备份和恢复相对复杂。需要定期对存储文件进行备份,并在需要时进行还原和恢复。

综上所述,文件存储模式在简化部署和维护、提供高性能和低延迟方面具有优势。但同时需要注意单点故障和有限的扩展性。在选择存储模式时,需要根据具体需求和场景综合考虑,并权衡各种优缺点。

1.3 db 存储模式:

1.3.1 application.yml 配置db 信息:

注意:因为mysql 的版本 需要使用 com.mysql.cj.jdbc.Driver 作为链接驱动

seata:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    # type: file
    type: file
  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: file
  store:
    # support: file 、 db 、 redis
    # mode: file
    mode: db
    db:
      datasource: druid
      db-type: mysql
      # driver-class-name: com.mysql.jdbc.Driver
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://127.0.01:3306/seata?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useAffectedRows=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
      user: root
      password: 123456
      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

1.3.1 拷贝驱动jar:

docker cp /root/xxx/mysql-connector-java-8.0.21.jar seata-server1.5:/seata-server/libs

/root/xxx/mysql-connector-java-8.0.21.jar 为宿主机目录
seata-server1.5:/seata-server/libs 为容器内目录

1.3.2 创建 seata 数据库并执行脚本:

原脚本地址: https://github.com/seata/seata/blob/1.5.0/script/server/db/mysql.sql,可能git 打开比较慢这里直接粘贴一份:

-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- 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);

1.3.3 重启seata-server:

docker restart seata-server1.5

1.3.4 db 存储模式优缺点:

优点:

  • 可靠性:关系型数据库通常具备较高的数据持久性和可靠性,能够提供数据的可靠存储和保护。这意味着在发生故障或宕机时,数据不会丢失。

  • ACID 特性:关系型数据库支持 ACID(原子性、一致性、隔离性和持久性)特性,可以确保事务在执行过程中的一致性和可靠性。

  • 成熟性:关系型数据库在数据管理方面具备较高的成熟度,拥有广泛的应用场景和丰富的工具生态系统。

缺点:

  • 性能瓶颈:关系型数据库在处理大量事务和并发请求时,可能会遇到性能瓶颈。由于事务数据需要写入和读取数据库,因此在高负载场景下,数据库可能成为性能瓶颈。

  • 扩展性限制:关系型数据库在水平扩展方面存在一定的限制。当事务负载增加时,随着数据量的增加,需要更强大的硬件和数据库调优,以保持性能。

  • 配置和管理复杂:关系型数据库的配置和管理需要经验和专业知识。你需要正确地配置和调整数据库参数,以满足 Seata Server 的要求,并确保数据库的稳定性和性能。

1.4 redis 存储模式:

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

    redis:
      # 单机模式
      mode: single
      # 使用第几个库
      database: 0
      min-conn: 1
      max-conn: 10
      # 访问密码
      password: 123456
      max-total: 100
      query-limit: 100
      single:
      	#  redis 地址和端口
        host: 127.0.0.1
        port: 6379
      sentinel:
        master-name:
        sentinel-hosts:

二、配置和注册:

2.1 配置中心:

配置中心的作用:用于配置 Seata Server的相关参数;以nacos 为例
nacos 中创建seat 的命名空间 后在seata-server 下application.yml 中 config 配置 nacos 的地址信息

seata:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    # type: file
    type: nacos
    nacos:
      server-addr: localhost:8828
      namespace: 7f2765bc-d8c1-4b49-b706-8c292d2ffac9
      group: SEATA_GROUP
      username: nacos
      password: nacos
      ##if use MSE Nacos with auth, mutex with username/password attribute
      #access-key: ""
      #secret-key: ""
      data-id: seataServer.properties

可以将 config.txt 的参数 在nacos 中进行配置,原文地址:https://github.com/seata/seata/blob/develop/script/config-center/config.txt
git 可能打开较慢,这里粘贴一份:参数详解可以参照:https://seata.io/zh-cn/docs/user/configurations.html

#For details about configuration items, see https://seata.io/zh-cn/docs/user/configurations.html
#Transport configuration, for client and server
transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableTmClientBatchSendRequest=false
transport.enableRmClientBatchSendRequest=true
transport.enableTcServerBatchSendResponse=false
transport.rpcRmRequestTimeout=30000
transport.rpcTmRequestTimeout=30000
transport.rpcTcRequestTimeout=30000
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
transport.serialization=seata
transport.compressor=none

#Transaction routing rules configuration, only for the client
service.vgroupMapping.default_tx_group=default
#If you use a registry, you can ignore it
service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false

#Transaction rule configuration, only for the client
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=true
client.rm.tableMetaCheckerInterval=60000
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.rm.sagaJsonParser=fastjson
client.rm.tccActionInterceptorOrder=-2147482648
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.defaultGlobalTransactionTimeout=60000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000
client.tm.interceptorOrder=-2147482648
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
#For TCC transaction mode
tcc.fence.logTableName=tcc_fence_log
tcc.fence.cleanPeriod=1h

#Log rule configuration, for client and server
log.exceptionRate=100

#Transaction storage configuration, only for the server. The file, DB, and redis configuration values are optional.
store.mode=file
store.lock.mode=file
store.session.mode=file
#Used for password encryption
store.publicKey=

#If `store.mode,store.lock.mode,store.session.mode` are not equal to `file`, you can remove the configuration block.
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

#These configurations are required if the `store mode` is `db`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `db`, you can remove the configuration block.
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=username
store.db.password=password
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.distributedLockTable=distributed_lock
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000

#These configurations are required if the `store mode` is `redis`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `redis`, you can remove the configuration block.
store.redis.mode=single
store.redis.single.host=127.0.0.1
store.redis.single.port=6379
store.redis.sentinel.masterName=
store.redis.sentinel.sentinelHosts=
store.redis.maxConn=10
store.redis.minConn=1
store.redis.maxTotal=100
store.redis.database=0
store.redis.password=
store.redis.queryLimit=100

#Transaction rule configuration, only for the server
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
server.distributedLockExpireTime=10000
server.xaerNotaRetryTimeout=60000
server.session.branchAsyncQueueSize=5000
server.session.enableBranchAsyncRemove=false

#Metrics configuration, only for the server
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898

2.2 注册中心:

2.2.1 注册中心的作用:

Seata Server 的注册中心是用于存储和管理 Seata 事务参与者的信息的组件。它的作用可以总结为以下三个方面:

  • 服务注册与发现:Seata Server 通过注册中心来注册和发现事务参与者。事务参与者在启动时向注册中心注册自己,并提供自己的相关信息,如应用名称、IP地址、端口号等。这样,Seata Server 就能够动态地发现可用的事务参与者,并与其进行通信和协调。

  • 运行时配置管理:注册中心可以存储和管理 Seata Server 的运行时配置信息。例如,Seata Server 的注册中心地址、事务日志的存储模式等配置参数可以通过注册中心进行管理。这样,可以在运行时动态地修改和更新 Seata Server 的配置,而无需重新启动。

  • 故障转移和高用:注册中心提供了故障转移和高可用的支持。当一个事务参与者发生故障或不可用时,Seata Server 可以通过注册中心来感知并移除该参与者,从而避免错误的事务协调。同时,当有新的事务参与者加入时,Seata Server 也会通过注册中心进行监测和同步。

总之,Seata Server 的注册中心在分布式事务管理中扮演着重要的角色,它通过提供服务注册与发现、运行时配置管理以及故障转移和高可用的支持,确保 Seata Server 能够高效、灵活地管理和协调分布式事务。

2.2.2 注册中心配置(nacos):

seata-sever 的 application.yml 对注册中心进行配置:

  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    # type: file
    type: nacos
    nacos:
      application: seata-server
      server-addr: localhost:8828
      group: SEATA_GROUP
      namespace: 7f2765bc-d8c1-4b49-b706-8c292d2ffac9
      cluster: default
      username: nacos
      password: nacos
      ##if use MSE Nacos with auth, mutex with username/password attribute
      #access-key: ""
      #secret-key: ""

重启后可以在nacos 中查看是否已经完成注册:
在这里插入图片描述


总结:

本文对Seata 的存储模式,配置中心和注册中心进行了实践;存储模式可以将事务的数据进行存储防止数据的丢失,配置中心可以将一些seata-server 的参数迁移到配置中心中,注册中心可以将分支事务进行注册方便后续的通信;

参考:

1 配置中心参数配置;
2 配置中心参数详解;

你可能感兴趣的:(java工具篇,分布式)