部署指南
Seata新手部署指南(1.4.0版本)
Seata分TC、TM和RM三个角色,TC(Server端)为单独服务端部署,TM和RM(Client端)由业务系统集成。
资源目录介绍
点击查看
- client
存放client端sql脚本 (包含 undo_log表) ,参数配置
- config-center
各个配置中心参数导入脚本,config.txt(包含server和client,原名nacos-config.txt)为通用参数文件
- server
server端数据库脚本 (包含 lock_table、branch_table 与 global_table) 及各个容器配置
注意事项
- seata-spring-boot-starter
内置GlobalTransactionScanner自动初始化功能,若外部实现初始化,请参考SeataAutoConfiguration保证依赖加载顺序
默认开启数据源自动代理,可配置seata.enable-auto-data-source-proxy: false关闭
- spring-cloud-starter-alibaba-seata
查看版本说明 2.1.0内嵌seata-all 0.7.1,2.1.1内嵌seata-all 0.9.0,2.2.0内嵌seata-spring-boot-starter 1.0.0, 2.2.1内嵌seata-spring-boot-starter 1.1.0
2.1.0和2.1.1兼容starter解决方案:
@SpringBootApplication注解内exclude掉spring-cloud-starter-alibaba-seata内的com.alibaba.cloud.seata.GlobalTransactionAutoConfiguration
- spring-cloud-starter-alibaba-seata推荐依赖配置方式
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>最新版</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>2.2.1.RELEASE</version>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
启动Server
Server端存储模式(store.mode)现有file、db、redis三种(后续将引入raft,mongodb),file模式无需改动,直接启动即可,下面专门讲下db和redis启动步骤。
注: file模式为单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高;
db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些;
redis模式Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置合适当前场景的redis持久化配置.
步骤一:启动包
步骤二:建表(仅db)
全局事务会话信息由3块内容构成,全局事务–>分支事务–>全局锁,对应表global_table、branch_table、lock_table
步骤三:修改store.mode
启动包: seata–>conf–>file.conf,修改store.mode=“db或者redis”
源码: 根目录–>seata-server–>resources–>file.conf,修改store.mode=“db或者redis”
步骤四:修改数据库连接|redis属性配置
启动包: seata–>conf–>file.conf,修改store.db或store.redis相关属性。
源码: 根目录–>seata-server–>resources–>file.conf,修改store.db或store.redis相关属性。
步骤五:启动
- 源码启动: 执行Server.java的main方法
- 命令启动: seata-server.sh -h 127.0.0.1 -p 8091 -m db -n 1 -e test
-h: 注册到注册中心的ip
-p: Server rpc 监听端口
-m: 全局事务会话信息存储模式,file、db、redis,优先读取启动参数 (Seata-Server 1.3及以上版本支持redis)
-n: Server node,多个Server时,需区分各自节点,用于生成不同区间的transactionId,以免冲突
-e: 多环境配置参考 http://seata.io/en-us/docs/ops/multi-configuration-isolation.html
注: 堆内存建议分配2G,堆外内存1G
业务系统集成Client
步骤一:添加seata依赖(建议单选)
- 依赖seata-all
- 依赖seata-spring-boot-starter,支持yml、properties配置(.conf可删除),内部已依赖seata-all
- 依赖spring-cloud-alibaba-seata,内部集成了seata,并实现了xid传递
步骤二:undo_log建表、配置参数
步骤三:数据源代理(不支持自动和手动配置并存)
-
如果使用seata-all
-
0.9.0版本开始seata支持自动代理数据源
1.1.0: seata-all取消属性配置,改由注解@EnableAutoDataSourceProxy开启,并可选择jdk proxy或者cglib proxy 1.0.0: client.support.spring.datasource.autoproxy=true 0.9.0: support.spring.datasource.autoproxy=true
如果采用XA模式,
@EnableAutoDataSourceProxy(dataSourceProxyMode = "XA")
-
手动配置可参考下方的例子
@Primary @Bean("dataSource") public DataSource dataSource(DataSource druidDataSource) { //AT 代理 二选一 return new DataSourceProxy(druidDataSource); //XA 代理 return new DataSourceProxyXA(druidDataSource) }
-
-
如果使用seata-starter
-
使用自动代理数据源时,如果使用XA模式还需要调整配置文件
application.propertiesseata.data-source-proxy-mode=XA
application.yml
seata: data-source-proxy-mode: XA
-
如何关闭seata-spring-boot-starter的数据源自动代理?
application.propertiesseata.enable-auto-data-source-proxy=false
application.yml
seata: enable-auto-data-source-proxy: false
-
步骤四:初始化GlobalTransactionScanner
- 手动
@Bean
public GlobalTransactionScanner globalTransactionScanner() {
String applicationName = this.applicationContext.getEnvironment().getProperty("spring.application.name");
String txServiceGroup = this.seataProperties.getTxServiceGroup();
if (StringUtils.isEmpty(txServiceGroup)) {
txServiceGroup = applicationName + "-fescar-service-group";
this.seataProperties.setTxServiceGroup(txServiceGroup);
}
return new GlobalTransactionScanner(applicationName, txServiceGroup);
}
- 自动,引入seata-spring-boot-starter、spring-cloud-starter-alibaba-seata等jar
步骤五:实现xid跨服务传递
- 手动 参考源码integration文件夹下的各种rpc实现 module
- 自动 springCloud用户可以引入spring-cloud-starter-alibaba-seata,内部已经实现xid传递
部署 Server
Server支持多种方式部署:直接部署,使用 Docker, 使用 Docker-Compose, 使用 Kubernetes, 使用 Helm.
直接部署
- 在RELEASE页面下载相应版本并解压
- 直接启动
在 Linux/Mac 下
$ sh ./bin/seata-server.sh
在 Windows 下
bin\seata-server.bat
支持的启动参数
参数 | 全写 | 作用 | 备注 |
---|---|---|---|
-h | –host | 指定在注册中心注册的 IP | 不指定时获取当前的 IP,外部访问部署在云环境和容器中的 server 建议指定 |
-p | –port | 指定 server 启动的端口 | 默认为 8091 |
-m | –storeMode | 事务日志存储方式 | 支持file ,db ,redis ,默认为 file 注:redis需seata-server 1.3版本及以上 |
-n | –serverNode | 用于指定seata-server节点ID | 如 1 ,2 ,3 …, 默认为 1 |
-e | –seataEnv | 指定 seata-server 运行环境 | 如 dev , test 等, 服务启动时会使用 registry-dev.conf 这样的配置 |
如:
$ sh ./bin/seata-server.sh -p 8091 -h 127.0.0.1 -m file
容器部署
容器部署当前支持三种方式:
使用 Docker 部署 Seata Server
注意事项
- 避免直接拉取latest版本镜像,latest版本并不一定是released版本,为避免不必要的问题,请到docker镜像仓库确定要拉取的镜像版本。
快速开始
启动seata-server实例
$ docker run --name seata-server -p 8091:8091 seataio/seata-server:1.4.2
指定seata-server IP和端口 启动
$ docker run --name seata-server \
-p 8091:8091 \
-e SEATA_IP=192.168.1.1 \
-e SEATA_PORT=8091 \
seataio/seata-server
Docker compose 启动
docker-compose.yaml
示例
version: "3"
services:
seata-server:
image: seataio/seata-server:${latest-release-version}
hostname: seata-server
ports:
- "8091:8091"
environment:
- SEATA_PORT=8091
- STORE_MODE=file
容器命令行及查看日志
$ docker exec -it seata-server sh
$ docker logs -f seata-server
使用自定义配置文件
自定义配置文件需要通过挂载文件的方式实现,将宿主机上的 registry.conf
和 file.conf
挂载到容器中相应的目录
- 指定 registry.conf
使用自定义配置文件时必须指定环境变量 SEATA_CONFIG_NAME
, 并且值需要以file:
开始, 如: file:/root/seata-config/registry
$ docker run --name seata-server \
-p 8091:8091 \
-e SEATA_CONFIG_NAME=file:/root/seata-config/registry \
-v /User/seata/config:/root/seata-config \
seataio/seata-server
其中 -e
用于配置环境变量, -v
用于挂载宿主机的目录
- 指定 file.conf
如果需要同时指定 file.conf
配置文件,则需要在 registry.conf
文件中将 config
配置改为以下内容,name
的值为容器中对应的路径
config {
type = "file"
file {
name = "file:/root/seata-config/file.conf"
}
}
环境变量
seata-server 支持以下环境变量:
- SEATA_IP
可选, 指定seata-server启动的IP, 该IP用于向注册中心注册时使用, 如eureka等
- SEATA_PORT
可选, 指定seata-server启动的端口, 默认为
8091
- STORE_MODE
可选, 指定seata-server的事务日志存储方式, 支持
db
,file
,redis(Seata-Server 1.3及以上版本支持), 默认是file
- SERVER_NODE
可选, 用于指定seata-server节点ID, 如
1
,2
,3
…, 默认为根据ip生成
- SEATA_ENV
可选, 指定 seata-server 运行环境, 如
dev
,test
等, 服务启动时会使用registry-dev.conf
这样的配置
- SEATA_CONFIG_NAME
可选, 指定配置文件位置, 如
file:/root/registry
, 将会加载/root/registry.conf
作为配置文件,如果需要同时指定file.conf
文件,需要将registry.conf
的config.file.name
的值改为类似file:/root/file.conf
:
使用 docker-compose 部署 Seata Server
注意事项
- 避免直接拉取latest版本镜像,latest版本并不一定是released版本,为避免不必要的问题,请到docker镜像仓库确定要拉取的镜像版本。
快速开始
无注册中心,file存储
该模式下,不需要注册中心,也不需要任何第三方存储中心。
docker-compose.yaml
version: "3.1"
services:
seata-server:
image: seataio/seata-server:${latest-release-version}
hostname: seata-server
ports:
- "8091:8091"
environment:
- SEATA_PORT=8091
- STORE_MODE=file
无注册中心,DB存储
db模式需要在数据库创建对应的表结构,[建表脚本]。
(1)准备file.conf配置文件
更多存储模式支持可参考更多存储模式
# 存储模式
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
# 需要根据mysql的版本调整driverClassName
# mysql8及以上版本对应的driver:com.mysql.cj.jdbc.Driver
# mysql8以下版本的driver:com.mysql.jdbc.Driver
store.db.driverClassName=com.mysql.cj.jdbc.Driver
# 注意根据生产实际情况调整参数host和port
store.db.url=jdbc:mysql://127.0.0.1:3306/seata-server?useUnicode=true&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
# 数据库用户名
store.db.user=
# 用户名密码
store.db.password=
(2)准备registry.conf文件
更多注册中心支持可参考注册中心
更多配置中心支持可参考配置中心
直连模式(无注册中心)
registry {
type = "file"
}
config {
type = "file"
file {
name="file:/root/seata-config/file.conf"
}
}
(3)准备docker-compose.yaml文件
version: "3.1"
services:
seata-server:
image: seataio/seata-server:${latest-release-version}
hostname: seata-server
ports:
- "8091:8091"
environment:
- SEATA_PORT=8091
- SEATA_CONFIG_NAME=file:/root/seata-config/registry
volumes:
# 需要把file.conf和registry.conf都放到./seata-server/config文件夹中
- "./seata-server/config:/root/seata-config"
nacos注册中心,db存储
db模式需要在数据库创建对应的表结构,[建表脚本]。
(1)准备registry.conf文件
nacos注册中心。
更多注册中心支持可参考注册中心
更多配置中心支持可参考配置中心
registry {
type = "nacos"
nacos {
# seata服务注册在nacos上的别名,客户端通过该别名调用服务
application = "seata-server"
# 请根据实际生产环境配置nacos服务的ip和端口
serverAddr = "127.0.0.1:8848"
# nacos上指定的namespace
namespace = ""
cluster = "default"
username = "nacos"
password = "nacos"
}
}
config {
type = "nacos"
nacos {
# 请根据实际生产环境配置nacos服务的ip和端口
serverAddr = "127.0.0.1:8848"
# nacos上指定的namespace
namespace = ""
group = "SEATA_GROUP"
username = "nacos"
password = "nacos"
# 从v1.4.2版本开始,已支持从一个Nacos dataId中获取所有配置信息,你只需要额外添加一个dataId配置项
dataId: "seataServer.properties"
}
}
(2)准备nacos配置中心配置
更多存储模式支持可参考更多存储模式
你需要在nacos新建配置,此处dataId为seataServer.properties
# 存储模式
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
# 需要根据mysql的版本调整driverClassName
# mysql8及以上版本对应的driver:com.mysql.cj.jdbc.Driver
# mysql8以下版本的driver:com.mysql.jdbc.Driver
store.db.driverClassName=com.mysql.cj.jdbc.Driver
# 注意根据生产实际情况调整参数host和port
store.db.url=jdbc:mysql://127.0.0.1:3306/seata-server?useUnicode=true&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
# 数据库用户名
store.db.user=
# 用户名密码
store.db.password=
(3)准备docker-compose.yaml文件
version: "3.1"
services:
seata-server:
image: seataio/seata-server:${latest-release-version}
hostname: seata-server
ports:
- "8091:8091"
environment:
# 指定seata服务启动端口
- SEATA_PORT=8091
# 注册到nacos上的ip。客户端将通过该ip访问seata服务。
# 注意公网ip和内网ip的差异。
- SEATA_IP=127.0.0.1
- SEATA_CONFIG_NAME=file:/root/seata-config/registry
volumes:
# 因为registry.conf中是nacos配置中心,只需要把registry.conf放到./seata-server/config文件夹中
- "./seata-server/config:/root/seata-config"
高可用部署
seata高可用依赖于注册中心、数据库,可不依赖配置中心。
db模式需要在数据库创建对应的表结构,[建表脚本]。
(1)准备file.conf配置文件
更多存储模式支持可参考更多存储模式
# 存储模式
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
# 需要根据mysql的版本调整driverClassName
# mysql8及以上版本对应的driver:com.mysql.cj.jdbc.Driver
# mysql8以下版本的driver:com.mysql.jdbc.Driver
store.db.driverClassName=com.mysql.cj.jdbc.Driver
# 注意根据生产实际情况调整参数host和port
store.db.url=jdbc:mysql://127.0.0.1:3306/seata-server?useUnicode=true&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
# 数据库用户名
store.db.user=
# 用户名密码
store.db.password=
(2)准备registry.conf文件
nacos注册中心。
更多注册中心支持可参考注册中心
更多配置中心支持可参考配置中心
registry {
type = "nacos"
nacos {
# seata服务注册在nacos上的别名,客户端通过该别名调用服务
application = "seata-server"
# nacos服务的ip和端口
serverAddr = "127.0.0.1:8848"
# nacos上指定的namespace
namespace = ""
cluster = "default"
username = "nacos"
password = "nacos"
}
}
config {
type = "file"
file {
name="file:/root/seata-config/file.conf"
}
}
(3)准备docker-compose.yaml文件
只要保持配置一致,seata服务可在一台机器上部署多实例,也可同时部署在多台不同的主机下面实现服务高可用。 高可用部署
version: "3.1"
services:
# seata服务1
seata-server-1:
image: seataio/seata-server:${latest-release-version}
hostname: seata-server
ports:
- "8091:8091"
environment:
# 指定seata服务启动端口
- SEATA_PORT=8091
# 注册到nacos上的ip。客户端将通过该ip访问seata服务。
# 注意公网ip和内网ip的差异。
- SEATA_IP=127.0.0.1
- SEATA_CONFIG_NAME=file:/root/seata-config/registry
volumes:
# 需要把file.conf和registry.conf都放到./seata-server/config文件夹中
- "./seata-server/config:/root/seata-config"
# seata服务2
seata-server-2:
image: seataio/seata-server:${latest-release-version}
hostname: seata-server
ports:
- "8092:8092"
environment:
# 指定seata服务启动端口
- SEATA_PORT=8092
# 注册到nacos上的ip。客户端将通过该ip访问seata服务。
# 注意公网ip和内网ip的差异。
- SEATA_IP=127.0.0.1
- SEATA_CONFIG_NAME=file:/root/seata-config/registry
volumes:
# 需要把file.conf和registry.conf都放到./seata-server/config文件夹中
- "./seata-server/config:/root/seata-config"
# seata服务3......seata服务N
环境变量
seata-server 支持以下环境变量:
- SEATA_IP
可选, 指定seata-server启动的IP, 该IP用于向注册中心注册时使用, 如eureka等
- SEATA_PORT
可选, 指定seata-server启动的端口, 默认为
8091
- STORE_MODE
可选, 指定seata-server的事务日志存储方式, 支持
db
,file
,redis
(Seata-Server 1.3及以上版本支持), 默认是file
- SERVER_NODE
可选, 用于指定seata-server节点ID, 如
1
,2
,3
…, 默认为根据ip生成
- SEATA_ENV
可选, 指定 seata-server 运行环境, 如
dev
,test
等, 服务启动时会使用registry-dev.conf
这样的配置
- SEATA_CONFIG_NAME
可选, 指定配置文件位置, 如
file:/root/registry
, 将会加载/root/registry.conf
作为配置文件,如果需要同时指定file.conf
文件,需要将registry.conf
的config.file.name
的值改为类似file:/root/file.conf
:
使用 Kubernetes 部署 Seata Server
快速启动
创建 seata-server.yaml
apiVersion: v1
kind: Service
metadata:
name: seata-server
namespace: default
labels:
k8s-app: seata-server
spec:
type: NodePort
ports:
- port: 8091
nodePort: 30091
protocol: TCP
name: http
selector:
k8s-app: seata-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: seata-server
namespace: default
labels:
k8s-app: seata-server
spec:
replicas: 1
selector:
matchLabels:
k8s-app: seata-server
template:
metadata:
labels:
k8s-app: seata-server
spec:
containers:
- name: seata-server
image: docker.io/seataio/seata-server:latest
imagePullPolicy: IfNotPresent
env:
- name: SEATA_PORT
value: "8091"
- name: STORE_MODE
value: file
ports:
- name: http
containerPort: 8091
protocol: TCP
$ kubectl apply -f seata-server.yaml
自定义配置
环境变量
支持的环境变量和 Docker 相同,可以参考 使用 Docker 部署 Seata Server
使用自定义配置文件
指定配置文件可以通过挂载文件或使用 ConfigMap 的方式实现,挂载后需要通过指定 SEATA_CONFIG_NAME
指定配置文件位置,并且环境变量的值需要以file:
开始, 如: file:/root/seata-config/registry
- Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: seata-server
namespace: default
labels:
k8s-app: seata-server
spec:
replicas: 1
selector:
matchLabels:
k8s-app: seata-server
template:
metadata:
labels:
k8s-app: seata-server
spec:
containers:
- name: seata-server
image: docker.io/seataio/seata-server:latest
imagePullPolicy: IfNotPresent
env:
- name: SEATA_CONFIG_NAME
value: file:/root/seata-config/registry
ports:
- name: http
containerPort: 8091
protocol: TCP
volumeMounts:
- name: seata-config
mountPath: /root/seata-config
volumes:
- name: seata-config
configMap:
name: seata-server-config
---
apiVersion: v1
kind: ConfigMap
metadata:
name: seata-server-config
data:
registry.conf: |
registry {
type = "nacos"
nacos {
application = "seata-server"
serverAddr = "192.168.199.2"
}
}
config {
type = "nacos"
nacos {
serverAddr = "192.168.199.2"
group = "SEATA_GROUP"
}
}
使用 Helm 部署 Seata Server
快速启动
$ cd ./script/server/helm/seata-server
$ helm install seata-server ./seata-server
自定义配置
环境变量
支持的环境变量和 Docker 相同,可以参考 使用 Docker 部署 Seata Server
使用自定义配置文件
指定配置文件可以通过挂载的方式实现,如将/root/workspace/seata/seata-config/file
下的配置文件挂载到 pod 中,挂载后需要通过指定 SEATA_CONFIG_NAME
指定配置文件位置,并且环境变量的值需要以file:
开始, 如: file:/root/seata-config/registry
- Values.yaml
replicaCount: 1
namespace: default
image:
repository: seataio/seata-server
tag: latest
pullPolicy: IfNotPresent
service:
type: NodePort
port: 30091
env:
seataPort: "8091"
storeMode: "file"
seataIp: "127.0.0.1"
seataConfigName: "file:/root/seata-config/registry"
volume:
- name: seata-config
mountPath: /root/seata-config
hostPath: /root/workspace/seata/seata-config/file
Seata 高可用部署
Seata 的高可用依赖于注册中心、配置中心和数据库来实现
Seata-Server
Seata-Server 需要使用注册中心,并把事务数据保存到数据库中,以 Nacos 为例
- 修改
registry.conf
的注册中心配置
registry {
type = "nacos"
nacos {
application = "seata-server"
serverAddr = "192.168.199.2"
namespace = ""
cluster = "default"
username = ""
password = ""
}
}
config {
type = "nacos"
nacos {
serverAddr = "192.168.199.2"
namespace = ""
group = "SEATA_GROUP"
username = ""
password = ""
}
}
- 需要修改配置中心的以下几个配置(含db与redis,二者选其一 注:redis需seata-server 1.3版本及以上)
service.vgroupMapping.my_test_tx_group=default
store.mode=db|redis
-----db-----
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
store.db.user=root
store.db.password=123456
----redis----
store.redis.host=127.0.0.1
store.redis.port=6379
store.redis.maxConn=10
store.redis.minConn=1
store.redis.database=0
store.redis.password=null
store.redis.queryLimit=100
- db模式需要在数据库创建
global_table
,branch_table
,lock_table
表
相应的脚本在GitHub 的 /script/server/db/ 目录下
这样,启动多个seata-server,即可实现其高可用
以 Kubernetes 为例,部署文件参考:
apiVersion: v1
kind: Service
metadata:
name: seata-ha-server
namespace: default
labels:
app.kubernetes.io/name: seata-ha-server
spec:
type: ClusterIP
ports:
- port: 8091
protocol: TCP
name: http
selector:
app.kubernetes.io/name: seata-ha-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: seata-ha-server
namespace: default
labels:
app.kubernetes.io/name: seata-ha-server
spec:
replicas: 3
selector:
matchLabels:
app.kubernetes.io/name: seata-ha-server
template:
metadata:
labels:
app.kubernetes.io/name: seata-ha-server
spec:
containers:
- name: seata-ha-server
image: docker.io/seataio/seata-server:latest
imagePullPolicy: IfNotPresent
env:
- name: SEATA_CONFIG_NAME
value: file:/root/seata-config/registry
ports:
- name: http
containerPort: 8091
protocol: TCP
volumeMounts:
- name: seata-config
mountPath: /root/seata-config
volumes:
- name: seata-config
configMap:
name: seata-ha-server-config
---
apiVersion: v1
kind: ConfigMap
metadata:
name: seata-ha-server-config
data:
registry.conf: |
registry {
type = "nacos"
nacos {
application = "seata-server"
serverAddr = "192.168.199.2"
}
}
config {
type = "nacos"
nacos {
serverAddr = "192.168.199.2"
group = "SEATA_GROUP"
}
}