Apache Seata 2.6 配置参数详解

详解 Apache Seata 2.6.0 服务端 application.yml 与客户端全部配置参数:config/registry/server/store/metrics/transport 六大板块逐键说明默认值,附生产 db 模式配置模板与常见问题排查

Apache SeataSeata分布式事务Java2026/10/15

Apache Seata 2.6 配置参数详解

目标:逐键讲清 Apache Seata 2.6.0 的全部配置项——服务端 conf/application.yml 的 config、registry、server、store、metrics、transport 六大板块,以及客户端(seata-spring-boot-starter)的事务组、undo_log、重试等核心参数。所有默认值均取自发行包内的 application.example.yml 与 script/config-center/config.txt 实测文件,配置生效方式均经真实启动验证。

一、环境信息

  • 操作系统:Ubuntu 22.04(x86_64)
  • Java:OpenJDK 17(seata-server 主程序支持 JDK 8~17;namingserver 控制台需 JDK 25+)
  • Seata 版本:2.6.0(孵化器发行包 apache-seata-2.6.0-incubating-bin.tar.gz)
  • 安装目录:/opt/seata/seata-server
  • 配置文件:/opt/seata/seata-server/conf/application.yml
  • 数据库(db 存储模式):MySQL 8,地址 seata-db:3306,库名 seata,账号 root/q1w2e3r4
  • 端口:8091(TC 服务)、9898(Prometheus 指标导出,默认占用)

二、前置条件

本文是配置详解篇,默认你已按《Ubuntu 22.04 安装 Apache Seata 2.6 指南》完成安装。若尚未安装,先确认以下最小环境即可继续阅读并逐段实操:

ls /opt/seata/seata-server/conf/
java -version 2>&1 | head -1

实测输出:

application.example.yml  application.raft.example.yml  application.yml  logback  logback-spring.xml
openjdk version "17.0.13" 2024-10-15

三、参数查看与修改方式

3.1 配置文件的加载位置

seata-server 的 JVM 参数集中在 bin/seata-setup.sh 与 bin/seata-server.sh 两个脚本中。查看启动脚本如何指定配置文件:

grep -n 'spring.config' /opt/seata/seata-server/bin/seata-server.sh

实测输出:

JAVA_OPT="${JAVA_OPT} -Dspring.config.additional-location=${BASEDIR}/conf/ -Dspring.config.location=${BASEDIR}/conf/application.yml -Dlogging.config=${BASEDIR}/conf/logback-spring.xml -Dproduction.deploy.output=true"

即服务端固定读取 /opt/seata/seata-server/conf/application.yml(BASEDIR 由脚本自动解析为安装目录)。conf 目录下三个文件的作用:

文件作用
application.yml生效配置,服务端启动唯一读取的配置文件
application.example.yml官方参数样例,覆盖 config/registry/server/store/metrics/transport 全部键及默认值
application.raft.example.ymlraft 存储模式专用样例,含 seata.store.raft 完整键

3.2 启动命令行参数(覆盖少量高频项)

seata-server.sh 支持命令行参数覆盖端口与存储模式。查看帮助:

bash /opt/seata/seata-server/bin/seata-server.sh --help

实测输出:

apm-skywalking not enabled
[INFO] Auto set JVM heap to 716m (total memory: 1024MB, heap%: 70%)
JMX disabled
  Usage: sh seata-server.sh(for linux and mac) or cmd seata-server.bat(for
            windows) [options]
  Options:
  --host, -h
    The ip to register to registry center.
  --port, -p
    The port to listen.
    Default: 0
  --storeMode, -m
    log store mode : file, db, redis
  --serverNode, -n
    server node id, such as 1, 2, 3.it will be generated according to the
    snowflake by default
  --seataEnv, -e
    The name used for multi-configuration isolation.
  --sessionStoreMode, -ssm
    session log store mode : file, db, redis
  --lockStoreMode, -lsm
    lock log store mode : file, db, redis
  --help

参数说明:

参数说明实测注意
-h, --host注册到注册中心使用的 IP(多网卡时必填)不带值直接运行 -h 会报 Error: Host value is required 并打印上述 usage
-p, --portTC 监听端口,覆盖 seata.server.service-portDefault: 0 表示不指定时回落到 server.port(8091)
-m, --storeMode存储模式 file/db/redis,覆盖 seata.store.moderaft 模式不支持命令行指定,须改 yml
-n, --serverNode节点 ID,不指定时按雪花算法生成TC 集群多节点时建议显式指定 1/2/3
-e, --seataEnv多环境配置隔离名加载 application-{env}.yml
-ssm, --sessionStoreMode会话存储模式,覆盖 seata.store.session.mode与 -lsm 配合实现会话/锁分开存储
-lsm, --lockStoreMode锁存储模式,覆盖 seata.store.lock.mode同上
--help打印用法旧文档写的 -h 打印帮助在 2.6.0 已不成立(-h 是 host)

命令行参数优先级高于 application.yml,但仅覆盖端口与存储模式这几项,其余参数一律以 yml 为准。

3.3 JVM 堆内存参数

JVM 参数同样集中在 bin/seata-setup.sh。堆内存的取值优先级为:显式环境变量 > 按内存自动计算 > 默认 2048m。实测在 1GB 内存机器上启动时脚本自动计算并打印:

[INFO] Auto set JVM heap to 716m (total memory: 1024MB, heap%: 70%)

显式指定堆大小(生产推荐,避免自动计算不可控):

export JVM_XMS=512m JVM_XMX=512m
bash /opt/seata/seata-server/bin/seata-server.sh -p 8091 > /tmp/seata-start.log 2>&1 &

验证生效:

ps -ef | grep '[j]ava' | head -1

实测输出(节选,-Xmx512m -Xms512m 即覆盖生效的证据):

/usr/bin/java  -Dlog.home=/root/logs/seata -server -Dloader.path=/opt/seata/seata-server/lib -Xmx512m -Xms512m -Xss640k -XX:SurvivorRatio=10 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -jar /opt/seata/seata-server/target/seata-server.jar -p 8091

3.4 配置中心方式(批量管理服务端参数)

当 seata.config.type 配置为 nacos/consul/apollo/zk/etcd3 时,服务端参数不再写在 yml,而是平铺键(camelCase)存入配置中心。发行包自带键清单与推送脚本:

ls /opt/seata/seata-server/script/config-center/

实测输出:

README.md  apollo  config.txt  consul  etcd3  nacos  zk

config.txt 即全部平铺键的官方模板(如 store.mode=db、server.recovery.committingRetryPeriod=1000),配合 nacos/nacos-config.sh 等脚本一键推送。平铺键与 yml 键的对应规则:seata.store.mode ↔ store.mode、seata.server.recovery.committingRetryPeriod ↔ server.recovery.committingRetryPeriod,yml 的 kebab-case(max-conn)对应平铺的 camelCase(maxConn)。

3.5 修改生效方式

Seata 服务端无热加载,任何 yml 修改都必须重启进程生效:

ps -ef | grep '[s]eata-server.jar' | awk '{print $2}' | xargs -r kill
sleep 3
export JVM_XMS=512m JVM_XMX=512m
bash /opt/seata/seata-server/bin/seata-server.sh -p 8091 > /tmp/seata-start.log 2>&1 &

重启后从日志确认新配置被应用(以 db 模式为例):

grep -E 'store mode|Server started' /root/logs/seata/seata-server.8091.all.log | tail -2

实测输出:

[i]o.seata.server.ParameterParser: store mode: db
[main] [rpc.netty.NettyServerBootstrap] [start] : Server started, service listen port: 8091

四、参数总览

服务端 yml 顶层结构为 server + spring + logging + seata 四块,seata 下再分六个板块。按作用端划分总览如下:

配置板块作用端核心作用
server / spring / logging仅服务端端口、应用名、日志路径与扩展 appender
seata.config双端配置中心接入方式(file/nacos/consul/apollo/zk/etcd3)
seata.registry双端注册中心接入方式(file/seata/nacos/eureka/redis/zk/consul/etcd3/sofa)
seata.server仅服务端事务协调核心:端口、恢复线程、undo 清理、限流
seata.store仅服务端事务存储:file/db/redis/raft 四种模式
seata.metrics仅服务端Micrometer 指标与 Prometheus 导出
seata.transport双端Netty RPC 超时、线程池、批量响应
seata.client.*(客户端 yml)仅客户端TM/RM 重试、undo_log、TCC fence
seata.service.vgroup-mapping 等仅客户端事务组映射与 TC 集群寻址
seata.data-source-proxy-mode仅客户端数据源代理模式 AT/XA(2.x 新键)

客户端键写在业务应用的 application.yml(Spring Boot 键风格为 kebab-case,如 tx-service-group;写入配置中心时用平铺 camelCase,如 service.vgroupMapping)。

五、核心参数分类详解

5.1 基础框架参数(server / spring / logging)

键默认值说明
server.port8091HTTP 端口预留;2.6.0 服务端不再起 web(控制台独立),TC RPC 端口由 seata.server.service-port 决定
spring.application.nameseata-server应用名
spring.main.web-application-typenone2.6.0 固定为 none,服务端无内嵌 web
logging.configclasspath:logback-spring.xml日志框架配置
logging.file.path${log.home:${user.home}/logs/seata}日志目录,log.home 未设时落在用户家目录(root 用户即 /root/logs/seata);启动脚本实测注入 -Dlog.home=/root/logs/seata
logging.extend.logstash-appender.enabledfalse日志推送 Logstash
logging.extend.kafka-appender.enabledfalse日志推送 Kafka,配套 bootstrap-servers、topic(logback_to_logstash)、producer.acks(0)、linger-ms(1000)、max-block-ms(0)
logging.extend.metric-appender.enabledfalse指标日志独立 appender

5.2 seata.config:配置中心接入

seata:
  config:
    type: file

type 可选 file、nacos、consul、apollo、zk、etcd3(样例文件注释原文:support: nacos 、 consul 、 apollo 、 zk 、 etcd3)。file 表示配置就在本 yml,其余五种按下表接入:

子键默认值说明
nacos.server-addr127.0.0.1:8848Nacos 地址
nacos.namespace / nacos.group空 / SEATA_GROUP命名空间与分组
nacos.username / nacos.password空开源版 Nacos 鉴权
nacos.access-key / nacos.secret-key空(注释态)阿里云 MSE Nacos 专用,与用户名密码互斥
nacos.ram-role-name空(注释态)阿里云 ECS/ACK 免鉴权场景
nacos.data-idseataServer.properties服务端参数在 Nacos 中的 dataId
consul.server-addr / consul.key127.0.0.1:8500 / seata.propertiesConsul 地址与键名,acl-token 鉴权
apollo.appId / apollo-meta / apollo-config-serviceseata-server / http://192.168.1.204:8801 / http://192.168.1.204:8080Apollo 三要素,namespace: application、cluster: seata
zk.server-addr / zk.node-path127.0.0.1:2181 / /seata/seata.propertiesZooKeeper 地址与配置节点,session-timeout: 6000、connect-timeout: 2000
etcd3.server-addr / etcd3.keyhttp://localhost:2379 / seata.propertiesetcd v3 地址与键名

5.3 seata.registry:注册中心接入

seata:
  registry:
    type: file

样例文件注释原文:support: nacos 、 eureka 、 redis 、 zk 、 consul 、 etcd3 、 sofa 、 seata,另有默认 file(客户端直连 grouplist)。两种顶层通用键:

键默认值说明
preferred-networks30.240.*(注释态)多网卡时指定优先网段,如 192.168.*
metadata.weight100(注释态)附带到注册元数据的权重

各注册中心子键(均挂在 seata.registry.<type> 下):

类型关键键与默认值说明
file无子键;客户端配合 service.vgroup-mapping + service.grouplist 直连开发/测试最简方式
seata(namingserver,2.x 内置)server-addr: 127.0.0.1:8081、cluster: default、namespace: public、heartbeat-period: 5000、metadata-max-age-ms: 30000、username/password、tokenValidityInMilliseconds: 1740000实测部署时控制台账号 admin/q1w2e3r4;自注册接口存在 401 已知问题,生产建议 nacos
nacosapplication: seata-server、server-addr: 127.0.0.1:8848、group: SEATA_GROUP、namespace、cluster: default、username/password、access-key/secret-key/ram-role-name生产首选
eurekaservice-url: http://localhost:8761/eureka、application: default、weight: 1老微服务体系
redisserver-addr: localhost:6379、db: 0、password、cluster: default、timeout: 0基于 Redis 发布订阅
zkserver-addr: 127.0.0.1:2181、cluster: default、session-timeout: 6000、connect-timeout: 2000、username/passwordZooKeeper
consulserver-addr: 127.0.0.1:8500、cluster: default、acl-tokenConsul
etcd3server-addr: http://localhost:2379、cluster: defaultetcd v3
sofaserver-addr: 127.0.0.1:9603、application: default、region: DEFAULT_ZONE、datacenter: DefaultDataCenter、cluster: default、group: SEATA_GROUP、address-wait-time: 3000AntFu/SOFARegistry

5.4 seata.server:事务协调核心参数

键默认值说明
server.service-port8091TC RPC 监听端口;不配置时取 server.port
server.max-commit-retry-timeout-1全局提交重试时限(毫秒),-1 不限;超限事务进入重试死信状态
server.max-rollback-retry-timeout-1全局回滚重试时限(毫秒),-1 不限
server.rollback-failed-unlock-enablefalse回滚失败时是否释放全局锁;false 保守(保留锁防脏写),确认无并发风险可开 true
server.enable-check-authtrue校验客户端访问权限
server.enable-parallel-request-handletrue并行处理客户端请求
server.enable-parallel-handle-branchfalse二阶段分支并行处理(回滚/提交多分支并行),分支多时可开
server.retry-dead-threshold70000超过该时长(毫秒)未完成的事务判定为重试死信,不再重试
server.xaer-nota-retry-timeout60000XA 模式 XAER_NOTA 响应的重试时限(毫秒)
server.applicationDataLimit64000客户端业务数据(applicationData)最大字节数
server.applicationDataLimitChecktrue是否校验上述限制(config.txt 平铺默认 false,yml 样例默认 true,以 yml 为准)
server.recovery.committing-retry-period1000提交中(Committing)状态恢复线程扫描周期(毫秒)
server.recovery.async-committing-retry-period1000异步提交中状态扫描周期
server.recovery.rollbacking-retry-period1000回滚中(Rollbacking)状态扫描周期
server.recovery.end-status-retry-period1000终态(Finished)清理扫描周期
server.recovery.timeout-retry-period1000超时事务检测周期(默认全局事务超时 60s,由客户端 defaultGlobalTransactionTimeout 决定)
server.undo.log-save-days7服务端 undo 日志保留天数
server.undo.log-delete-period86400000服务端 undo 日志清理任务周期(毫秒,即 1 天)
server.session.branch-async-queue-size5000分支会话异步删除队列长度
server.session.enable-branch-async-removefalse分支会话异步删除开关,大事务高并发时可开
server.ratelimit.enablefalse服务端限流开关
server.ratelimit.bucketTokenNumPerSecond999999令牌桶每秒生成令牌数
server.ratelimit.bucketTokenMaxNum999999桶容量上限
server.ratelimit.bucketTokenInitialNum999999初始令牌数
server.http.filter.xss.keywords["<script>", "</script>", "javascript:", "vbscript:"]控制台 HTTP 接口 XSS 过滤词

实测提示:recovery 五个周期的实测默认值均为 1000ms,全局事务回滚期间 TC 以约 1 秒一次的频率扫描 global_table 中 Status=4(Rollbacking)的记录,与《安装指南》第十章实测回滚日志吻合。

5.5 seata.store:存储参数(file / db / redis / raft)

seata:
  store:
    mode: file

mode 可选 file、db、redis、raft(样例注释原文:support: file 、 db 、 redis 、 raft)。另有两个独立键可将会话与锁分开存储:

键默认值说明
store.session.modefile会话存储模式,可独立于 store.mode
store.lock.modefile全局锁存储模式;集群时三者必须一致(除 file 单机)

file 模式(seata.store.file)

键默认值说明
dirsessionStore存储目录(相对启动目录)
max-branch-session-size16384单条分支会话文件记录上限(字节)
max-global-session-size512单条全局会话文件记录上限(字节)
file-write-buffer-cache-size16384写缓冲区大小(字节)
session-reload-read-size100重启恢复时每次读取行数
flush-disk-modeasync刷盘模式 async/sync

db 模式(seata.store.db)

键默认值说明
datasourcedruid连接池 druid/hikari/dbcp
db-typemysql数据库类型
driver-class-namecom.mysql.jdbc.Driver(样例默认)MySQL 8 必须改为 com.mysql.cj.jdbc.Driver,实测用旧值会告警且部分场景失败
urljdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true建议追加 useSSL=false&serverTimezone=Asia/Shanghai
user / passwordmysql / mysql数据库账号
min-conn / max-conn10 / 100连接池上下限;实测小内存机器建议 5/30
global-table / branch-table / lock-table / distributed-lock-table / vgroup-tableglobal_table / branch_table / lock_table / distributed_lock / vgroup_table五张核心表名,须与 script/server/db/mysql.sql 导入的一致
query-limit1000恢复线程单次扫描行数上限
max-wait5000获取连接最大等待(毫秒)
druid.time-between-eviction-runs-millis120000Druid 检测空闲连接周期
druid.min-evictable-idle-time-millis300000连接最小可驱逐空闲时长
druid.test-while-idle / test-on-borrow / keep-alivetrue / false / false空闲检测、借出检测、保活;生产建议 keep-alive: true
hikari.idle-timeout / keepalive-time / max-lifetime / validation-timeout600000 / 120000 / 1800000 / 5000Hikari 连接池对应项

redis 模式(seata.store.redis)

键默认值说明
modesinglesingle/sentinel
typelua数据写入方式 lua/pipeline(lua 支持分布式锁原子操作,官方推荐)
database0Redis 库号
min-conn / max-conn / max-total10 / 100 / 100连接池
query-limit1000单次扫描上限
single.host / single.port127.0.0.1 / 6379单机地址
sentinel.master-name / sentinel.sentinel-hosts / sentinel.sentinel-password空哨兵模式三键

raft 模式(seata.store.raft,取自 application.raft.example.yml)

raft 模式让 TC 集群摆脱外部数据库依赖(2.x 新特性),样例文件 application.raft.example.yml 中完整键:

键默认值说明
groupdefaultraft 分组
server-addr空集群成员列表,如 127.0.0.1:7091,127.0.0.1:7092,127.0.0.1:7093(config.txt 示例值)
snapshot-interval600快照间隔(秒)
apply-batch32批量提交日志条数
max-append-bufferSize262144复制缓冲区上限(字节)
max-replicator-inflight-msgs256单副本在途消息上限
disruptor-buffer-size16384Disruptor 环形缓冲大小
election-timeout-ms1000选主超时(config.txt 平铺默认 2000)
reporter-enabled / reporter-initial-delayfalse / 60状态上报开关与延迟(秒)
serialization / compressorjackson / none日志序列化与压缩
synctrue日志与快照同步刷盘
ssl.enabledfalse节点间 bolt 通信 TLS;配套 ssl.client.keystore.path(ssl/cbolt.pfx)、ssl.server.keystore.path(ssl/bolt.pfx)、password、type: pkcs12、kmf-algorithm/tmf-algorithm: SunX509

raft 集群要求至少 3 节点,且每个节点的 server-addr 列表一致。

5.6 seata.metrics:指标参数

键默认值说明
metrics.enabledfalse指标总开关
metrics.registry-typecompact内置精简注册表(固定值)
metrics.exporter-listprometheus导出器列表,当前支持 prometheus
metrics.exporter-prometheus-port9898Prometheus 抓取端口

实测注意:即便 metrics.enabled 为 false,2.6.0 启动时也会占用 9898 端口(Prometheus 导出器随进程启动),单机跑多实例时第二个实例会因 9898 被占而报 seata server start failed,见第七章 FAQ。

5.7 seata.transport:传输参数

键默认值说明
transport.rpc-tc-request-timeout15000客户端调用 TC 的超时(毫秒)
transport.enable-tc-server-batch-send-responsefalse服务端批量回包
transport.min-http-pool-size / max-http-pool-size10 / 100HTTP 线程池
transport.max-http-task-queue-size1000HTTP 任务队列长度
transport.http-pool-keep-alive-time500HTTP 线程保活(秒)
transport.shutdown.wait3优雅停机等待(秒)
transport.thread-factory.boss-thread-prefixNettyBossNetty 线程名前缀
transport.thread-factory.worker-thread-prefixNettyServerNIOWorkerNetty worker 线程名前缀
transport.thread-factory.boss-thread-size1boss 线程数

以下双端键未出现在 yml 样例但存在于 script/config-center/config.txt(平铺风格,客户端同样适用):

平铺键默认值说明
transport.protocolseata通信协议(seata 私有协议)
transport.heartbeattrue心跳
transport.serializationseata序列化方式 seata/fastjson 等
transport.compressornone压缩 none/zip/7z/bzip2
transport.rpcRmRequestTimeout / rpcTmRequestTimeout30000RM/TM 请求超时(毫秒)
transport.enableTmClientBatchSendRequest / enableRmClientBatchSendRequestfalse / true客户端批量发请求
transport.enableClientSharedEventLoopGroupfalse客户端共享 EventLoopGroup
transport.serverSocketSendBufSize / serverSocketResvBufSize153600服务端 socket 缓冲(字节)
transport.writeBufferHighWaterMark / writeBufferLowWaterMark67108864 / 1048576Netty 写缓冲高低水位(字节)
transport.soBackLogSize1024监听 backlog
transport.serverChannelMaxIdleTimeSeconds30服务端通道最大空闲时间(秒)
transport.minServerPoolSize / maxServerPoolSize / maxTaskQueueSize / keepAliveTime50 / 500 / 20000 / 500服务端业务线程池

5.8 客户端核心参数(seata-spring-boot-starter)

客户端参数写在业务应用 application.yml,以下默认值取自发行包 script/config-center/config.txt 并经真实工程(Spring Boot 3.2.5 + seata-spring-boot-starter 2.6.0)验证。基础接入键:

Spring Boot 键平铺键默认值说明
seata.enabled-true总开关
seata.application-id-取 spring.application.name应用 ID
seata.tx-service-group-空(必填)事务组名,自拟如 demo_tx_group
seata.service.vgroup-mapping.demo_tx_groupservice.vgroupMapping.demo_tx_group-事务组 → TC 集群名映射
seata.service.grouplist.defaultservice.default.grouplist-集群名 → TC 地址(file 注册中心时必填,如 seata-tc:8091)
seata.service.disable-global-transactionservice.disableGlobalTransactionfalse全局事务总闸
seata.data-source-proxy-mode-AT数据源代理模式 AT/XA(2.x 新键;TCC/SAGA 不依赖数据源代理)
seata.registry.type / seata.config.type-file与服务端同款注册/配置中心接入
client.metadataMaxAgeMs同左30000客户端元数据刷新周期(毫秒)

TM 事务管理器参数(seata.client.tm.*):

Spring Boot 键平铺键默认值说明
client.tm.commit-retry-countclient.tm.commitRetryCount5一阶段提交结果查询重试次数
client.tm.rollback-retry-countclient.tm.rollbackRetryCount5一阶段回滚结果查询重试次数
client.tm.default-global-transaction-timeoutclient.tm.defaultGlobalTransactionTimeout60000全局事务默认超时(毫秒,@GlobalTransactional 未指定 timeoutMills 时生效)
client.tm.degrade-checkclient.tm.degradeCheckfalse降级自愈开关(连续失败自动降级为非全局事务)
client.tm.degrade-check-allow-times / degrade-check-period10 / 2000降级判定阈值与检查周期

RM 资源管理器参数(seata.client.rm.*):

Spring Boot 键平铺键默认值说明
client.rm.async-commit-buffer-limitclient.rm.asyncCommitBufferLimit10000异步提交缓冲上限
client.rm.lock.retry-intervalclient.rm.lock.retryInterval10全局锁冲突重试间隔(毫秒)
client.rm.lock.retry-timesclient.rm.lock.retryTimes30全局锁冲突重试次数
client.rm.lock.retry-policy-branch-rollback-on-conflictclient.rm.lock.retryPolicyBranchRollbackOnConflicttrue锁冲突时优先回滚分支
client.rm.report-retry-countclient.rm.reportRetryCount5一阶段结果上报重试次数
client.rm.table-meta-check-enableclient.rm.tableMetaCheckEnabletrue表结构变更检测(AT 二阶段回滚依赖前后镜像,表结构漂移会导致回滚失败,建议开启)
client.rm.table-meta-checker-intervalclient.rm.tableMetaCheckerInterval60000表结构检测周期(毫秒)
client.rm.sql-parser-typeclient.rm.sqlParserTypedruidSQL 解析器 druid
client.rm.report-success-enableclient.rm.reportSuccessEnablefalse成功结果也上报 TC(排障时可开,有性能损耗)
client.rm.saga-branch-register-enable / saga-json-parser-false / fastjsonSAGA 分支注册与 JSON 解析器

undo_log 与 TCC fence 参数:

Spring Boot 键平铺键默认值说明
client.undo.log-tableclient.undo.logTableundo_logAT 模式回滚日志表名,每个业务库都要建
client.undo.log-serializationclient.undo.logSerializationjackson镜像序列化方式;实测必须引入 jackson-databind 与 jackson-datatype-jsr310,否则运行时报 NoClassDefFoundError
client.undo.data-validationclient.undo.dataValidationtrue回滚前校验后镜像与当前数据一致(不一致说明脏写,拒绝回滚)
client.undo.only-care-update-columnsclient.undo.onlyCareUpdateColumnstrue仅记录变更列(减小 undo_log 体积)
client.undo.compress.enable / compress.type / compress.threshold同左true / zip / 64k镜像压缩开关、算法、触发阈值
tcc.fence.logTableName同左tcc_fence_logTCC 防悬挂记录表名
tcc.fence.cleanPeriod同左1hfence 记录清理周期
tcc.contextJsonParserType同左fastjsonTCC 上下文解析器
log.exceptionRate同左100异常日志采样率(1/100)

实测提醒:undo_log 建表语句在业务库执行(本专栏安装指南实测采用官方 MySQL 版),字段含 branch_id、xid、context、rollback_info(longblob)、log_status、log_created、log_modified,联合主键 (branch_id, xid)。

六、生产配置模板

6.1 生产 db 模式 application.yml 模板(MySQL,4C8G,堆 1~2GB)

以下模板在本专栏实验环境(MySQL 8 + JDK 17)验证过 db 模式启动与 AT 回滚全流程,按 4C8G 生产机调整了连接池与保活参数:

server:
  port: 8091
spring:
  application:
    name: seata-server
  main:
    web-application-type: none
logging:
  config: classpath:logback-spring.xml
  file:
    path: /var/log/seata
  extend:
    logstash-appender:
      enabled: false
      destination: 127.0.0.1:4560
    kafka-appender:
      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:
      enabled: false

seata:
  config:
    type: file
  registry:
    type: nacos
    nacos:
      application: seata-server
      server-addr: 127.0.0.1:8848
      group: SEATA_GROUP
      cluster: default
      username: nacos
      password: nacos
  server:
    service-port: 8091
    max-commit-retry-timeout: -1
    max-rollback-retry-timeout: -1
    rollback-failed-unlock-enable: false
    enable-check-auth: true
    enable-parallel-request-handle: true
    enable-parallel-handle-branch: false
    retry-dead-threshold: 70000
    xaer-nota-retry-timeout: 60000
    applicationDataLimit: 64000
    applicationDataLimitCheck: true
    recovery:
      committing-retry-period: 1000
      async-committing-retry-period: 1000
      rollbacking-retry-period: 1000
      end-status-retry-period: 1000
      timeout-retry-period: 1000
    undo:
      log-save-days: 7
      log-delete-period: 86400000
    session:
      branch-async-queue-size: 5000
      enable-branch-async-remove: false
    ratelimit:
      enable: false
      bucketTokenNumPerSecond: 999999
      bucketTokenMaxNum: 999999
      bucketTokenInitialNum: 999999
  store:
    mode: db
    db:
      datasource: druid
      db-type: mysql
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true&useSSL=false&serverTimezone=Asia/Shanghai
      user: root
      password: q1w2e3r4
      min-conn: 10
      max-conn: 100
      global-table: global_table
      branch-table: branch_table
      lock-table: lock_table
      distributed-lock-table: distributed_lock
      vgroup-table: vgroup_table
      query-limit: 1000
      max-wait: 5000
      druid:
        time-between-eviction-runs-millis: 120000
        min-evictable-idle-time-millis: 300000
        test-while-idle: true
        test-on-borrow: false
        keep-alive: true
  metrics:
    enabled: true
    registry-type: compact
    exporter-list: prometheus
    exporter-prometheus-port: 9898
  transport:
    rpc-tc-request-timeout: 15000
    enable-tc-server-batch-send-response: false
    min-http-pool-size: 10
    max-http-pool-size: 100
    max-http-task-queue-size: 1000
    http-pool-keep-alive-time: 500
    shutdown:
      wait: 3
    thread-factory:
      boss-thread-prefix: NettyBoss
      worker-thread-prefix: NettyServerNIOWorker
      boss-thread-size: 1

启动时固定堆大小(4C8G 建议堆 1~2GB):

export JVM_XMS=1024m JVM_XMX=1024m
bash /opt/seata/seata-server/bin/seata-server.sh -p 8091 > /tmp/seata-start.log 2>&1 &

6.2 按场景调整建议

场景建议调整
1C2G 测试机堆 512m(JVM_XMS/JVM_XMX);store.db.min-conn: 5、max-conn: 30;metrics.enabled: false 减少噪音
一般生产(4C8G)堆 1~2GB;连接池 10/100;druid keep-alive: true 防 MySQL 空闲断连
高并发大事务enable-parallel-handle-branch: true、session.enable-branch-async-remove: true;store.db.query-limit 保持 1000
单机 2 实例(不推荐)端口必须错开(-p 8091/8092),且 9898 指标端口会冲突,仅可用于临时验证
undo 磁盘紧张server.undo.log-save-days 调小(如 3);log-delete-period 保持 1 天
raft 集群(无外部 DB)复制 application.raft.example.yml 为 application.yml,填 store.raft.server-addr 三节点列表,堆 1~2GB

七、常见问题(FAQ)

Q1:修改了 application.yml 重启后不生效?

先确认改的文件路径正确(固定是 conf/application.yml,启动脚本用 -Dspring.config.location 锁定);再用 ps -ef 检查启动命令是否带了 -p/-m 参数——命令行参数优先级高于 yml,带 -m db 启动时 yml 里写 mode: file 不会生效。最后确认进程真的重启了(ps -ef | grep '[s]eata-server.jar' 的启动时间)。

Q2:db 模式启动报 The driver {com.mysql.cj.jdbc.Driver} cannot be found in the path /opt/seata/seata-server/lib/jdbc

发行包不带 JDBC 驱动。下载 mysql-connector-j 放入即可(实测用 8.4.0):

wget -P /opt/seata/seata-server/lib/jdbc/ https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.4.0/mysql-connector-j-8.4.0.jar

Q3:db 模式启动报 Unknown database 'seata' 或 Table 'seata.global_table' doesn't exist

官方 script/server/db/mysql.sql 不含建库语句,需先建库再导表,且库中必须有 global_table、branch_table、lock_table、distributed_lock、vgroup_table 五张表:

mysql -h seata-db -uroot -pq1w2e3r4 -e "CREATE DATABASE IF NOT EXISTS seata DEFAULT CHARACTER SET utf8mb4;"
mysql -h seata-db -uroot -pq1w2e3r4 seata < /opt/seata/seata-server/script/server/db/mysql.sql

Q4:启动报 seata server start failed,日志显示 9898 端口被占用

2.6.0 的 Prometheus 指标导出器固定绑定 9898。单机残留旧进程(或另一个实例)占着 9898 时新实例启动失败。实测清理方式:

ss -lntp | grep 9898
ps -ef | grep '[s]eata-server' | awk '{print $2}' | xargs -r kill
sleep 3
bash /opt/seata/seata-server/bin/seata-server.sh -p 8091 > /tmp/seata-start.log 2>&1 &

Q5:启动日志打印 Auto set JVM heap to 716m,堆大小不符合预期

这是 seata-setup.sh 按总内存 70% 自动计算的值。显式覆盖即可:

export JVM_XMS=512m JVM_XMX=512m

并用 ps -ef | grep '[j]ava' 确认 -Xmx512m -Xms512m 出现在进程参数里。

Q6:yml 键与 config.txt 平铺键怎么互转

规则:yml 里 seata. 前缀去掉后按下划线合并,kebab-case 转 camelCase。例如 seata.store.max-conn ↔ store.db.maxConn、seata.server.recovery.committing-retry-period ↔ server.recovery.committingRetryPeriod、seata.service.vgroup-mapping.demo_tx_group ↔ service.vgroupMapping.demo_tx_group。注意个别键两端默认值不同(如 applicationDataLimitCheck:yml true、config.txt false),以你实际生效的配置载体为准。

八、参考链接