在对Seata 进行部署后,发现Seata 的使用需要配置:存储模式,配置模式,注册模式 ;他们的作用是什么,又应该怎么进行配置?
提示:以下是本篇文章正文内容,下面案例可供参考
存储模式指定了Seata Server用于存储事务和元数据的方式。Seata Server支持三种存储模式:file、db和Redis。列如 当开始事务时需要生成全局事务id Xid ,在生成后就需要Seata 服务进行存储,所以他是Seata Server的重要组成部分;
-v /root/seata/sessionStore:/seata-server/sessionStore \
其中 /sessionStore 为容器内数据存储的位置,通过查看application.example.yml 可知为:
优点:
易于部署和使用:相比于其他存储模式(如数据库存储模式),文件存储模式更加简单和易于部署。不需要额外的依赖或配置,只需通过配置文件指定存储路径即可。
高性能:使用文件系统来存储数据可以提供较高的性能。文件系统通常具有快速的读写速度和较低的延迟,可以满足高并发事务的需求。
低延迟:由于文件系统的本地读写,存储和读取数据的时延较低,可以加速事务的执行速度。
简化维护:使用文件存储模式可以避免额外的数据库配置和维护工作,减少了数据库管理的复杂性和维护成本。
缺点:
单点故障:文件存储模式下,如果使用单个文件系统来存储所有Undo log和Branch Sessions的数据,那么一旦该文件系统出现故障,会造成数据丢失和无法恢复的风险。
有限的扩展性:文件存储模式相对于数据库存储模式来说,扩展性较差。当需要水平扩展时,可能需要考虑文件系统的共享和同步机制,以确保所有节点都可以正确读取和写入数据。
数据备份和恢复的复杂性:文件存储模式的数据备份和恢复相对复杂。需要定期对存储文件进行备份,并在需要时进行还原和恢复。
综上所述,文件存储模式在简化部署和维护、提供高性能和低延迟方面具有优势。但同时需要注意单点故障和有限的扩展性。在选择存储模式时,需要根据具体需求和场景综合考虑,并权衡各种优缺点。
注意:因为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
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 为容器内目录
原脚本地址: 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);
docker restart seata-server1.5
优点:
可靠性:关系型数据库通常具备较高的数据持久性和可靠性,能够提供数据的可靠存储和保护。这意味着在发生故障或宕机时,数据不会丢失。
ACID 特性:关系型数据库支持 ACID(原子性、一致性、隔离性和持久性)特性,可以确保事务在执行过程中的一致性和可靠性。
成熟性:关系型数据库在数据管理方面具备较高的成熟度,拥有广泛的应用场景和丰富的工具生态系统。
缺点:
性能瓶颈:关系型数据库在处理大量事务和并发请求时,可能会遇到性能瓶颈。由于事务数据需要写入和读取数据库,因此在高负载场景下,数据库可能成为性能瓶颈。
扩展性限制:关系型数据库在水平扩展方面存在一定的限制。当事务负载增加时,随着数据量的增加,需要更强大的硬件和数据库调优,以保持性能。
配置和管理复杂:关系型数据库的配置和管理需要经验和专业知识。你需要正确地配置和调整数据库参数,以满足 Seata Server 的要求,并确保数据库的稳定性和性能。
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:
配置中心的作用:用于配置 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
Seata Server 的注册中心是用于存储和管理 Seata 事务参与者的信息的组件。它的作用可以总结为以下三个方面:
服务注册与发现:Seata Server 通过注册中心来注册和发现事务参与者。事务参与者在启动时向注册中心注册自己,并提供自己的相关信息,如应用名称、IP地址、端口号等。这样,Seata Server 就能够动态地发现可用的事务参与者,并与其进行通信和协调。
运行时配置管理:注册中心可以存储和管理 Seata Server 的运行时配置信息。例如,Seata Server 的注册中心地址、事务日志的存储模式等配置参数可以通过注册中心进行管理。这样,可以在运行时动态地修改和更新 Seata Server 的配置,而无需重新启动。
故障转移和高用:注册中心提供了故障转移和高可用的支持。当一个事务参与者发生故障或不可用时,Seata Server 可以通过注册中心来感知并移除该参与者,从而避免错误的事务协调。同时,当有新的事务参与者加入时,Seata Server 也会通过注册中心进行监测和同步。
总之,Seata Server 的注册中心在分布式事务管理中扮演着重要的角色,它通过提供服务注册与发现、运行时配置管理以及故障转移和高可用的支持,确保 Seata Server 能够高效、灵活地管理和协调分布式事务。
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: ""
本文对Seata 的存储模式,配置中心和注册中心进行了实践;存储模式可以将事务的数据进行存储防止数据的丢失,配置中心可以将一些seata-server 的参数迁移到配置中心中,注册中心可以将分支事务进行注册方便后续的通信;
1 配置中心参数配置;
2 配置中心参数详解;