docker(十八)docker-compose部署seata

261 阅读4分钟

Sentinel初步研究的差不多了,今儿研究分布式事务seata。

 

Apache Seata(incubating) 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。

 

老规矩,先放官方文档:

seata.io/zh-cn/docs/…

 

一:生成seata配置文件

如题,这玩意该怎么生成呢?很简单。用docker创建一个seata容器。将容器中的配置文件复制出来不就行了嘛。

 

真是神操作……

 

1:创建临时seata容器

docker run -d \
--name seata \
seataio/seata-server:1.5.2

 

2:将配置文件从容器中复制出来

docker cp seata:/seata-server/resources /opt/docker/seata

 

3:删除临时容器

至此,临时seata容器的作用就结束了,可以将他删除了,我这里使用图形化界面操作。当然,你也可以使用docker命令删除。

 

二:导入seata配置到nacos

我这里使用nacos作为配置中心。

 

1:下载配置文件

配置中心的配置,我们需要先行导入,先访问以下网站,下载config.txt文件

github.com/seata/seata…

 

2:配置导入配置中心

(1):创建命名空间seata,如下图所示:

1.png.jpg

 

(2):在seata命名空间下创建配置文件seata-server.properties,如下图所示:

2.png.jpg

 

(3):将配置导入seata-server.properties中

官网提供的是全套的配置,但是呢,我们不需要那些玩意,我们只需要配置重点的就可以了。

 

seata 的 TC 端的事务信息存储模式(store.mode)现有file、db、redis三种,file模式无需改动,直接启动即可。

 

我这里使用的事DB模式,具体配置如下:重点的基本上就是下方有注释中的部分。修改对应的部分就可以。

service.vgroupMapping.default-tx-group=default
store.mode=db  # 采用DB的形式存储。还可选redis 和file
 
store.lock.mode=db
store.session.mode=db
 
store.db.datasource=druid         # 数据库连接池
store.db.dbType=mysql              # 数据库类型
store.db.driverClassName=com.mysql.jdbc.Driver          # 数据库驱动
store.db.url=jdbc:mysql://localhost:3306/seata?useUnicode=true&rewriteBatchedStatements=true               # 数据库链接信息
store.db.user=root              # 用户名
store.db.password=root      # 密码
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
 
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
 
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
 
tcc.fence.logTableName=tcc_fence_log
tcc.fence.cleanPeriod=1h
 
log.exceptionRate=100
 
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898
 
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

 

(4):redis模式

redis模式 Seata-Server 1.3 及以上版本支持,性能较高,但存在事务信息丢失风险,所以需要提前配置合适当前场景的redis持久化配置,该模式需改动以下配置:

store.mode=redis
store.redis.host=127.0.0.1
store.redis.port=6379
store.redis.password=123456

 

三:修改application.yml配置文件

server:
  port: 7091
 
spring:
  application:
    name: seata-server
 
logging:
  config: classpath:logback-spring.xml
  file:
    path: ${user.home}/logs/seata
  extend:
    logstash-appender:
      destination: 127.0.0.1:4560
    kafka-appender:
      bootstrap-servers: 127.0.0.1:9092
      topic: logback_to_logstash
 
console:
  user:
    username: xxxx     # web 控制台登录账号
    password: xxxx    # web 控制台登录密码
 
seata:
  config: # 配置配置中心
    # support: nacos 、 consul 、 apollo 、 zk  、 etcd3
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848                 # nacos地址
      username: xxx                                 # 用户名
      password: xxx                                 # 密码
      namespace: 60f677d3-3d41-4ffb-ae1f-931af47f93bb # 命名空间
      data-id: seata-server.properties                # 配置文件名称
  registry: # 配置注册中心
    # support: nacos 、 eureka 、 redis 、 zk  、 consul 、 etcd3 、 sofa
    type: nacos
    nacos:
      application: seata-server
      server-addr: 127.0.0.1:8848                 # nacos地址
      username: xxx                                # 用户名
      password: xxx                                 # 密码
      namespace: 60f677d3-3d41-4ffb-ae1f-931af47f93bb # 命名空间
  store:
    # support: file 、 db 、 redis
    mode: file
#  server:
#    service-port: 8091 #If not configured, the default is '${server.port} + 1000'
  security:
    secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
    tokenValidityInMilliseconds: 1800000
    ignore:
      urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login

 

如果你想修改到时候生成的web登陆的账号密码,就修改console里的username和password即可。

 

四:创建seata所需mysql数据库及对应数据表

数据库sql文件下载地址:

github.com/apache/incu…

我这里使用的是mysql,需要下载mysql.sql。

导入数据库之后,数据表如下图所示:

3.jpg

²  global_table:全局事务表,每当有一个全局事务发起后,就会在该表中记录全局事务的ID

²  branch_table:分支事务表,记录每一个分支事务的ID,分支事务操作的哪个数据库等信息

²  lock_table:全局锁

²  distributed_lock:分布式锁

 

五:使用docker-compose创建容器

1:docker-compose.yml

version: '3.8'
 
services:
  seata:
    image: seataio/seata-server:1.5.2
    container_name: seata
    ports:
      - "8091:8091"
      - "7091:7091"
    restart: always
    environment:
      - SEATA_IP=39.99.144.212
    volumes:
      - /opt/docker/seata/resources:/seata-server/resources

 

2:还可以配置以下参数:

SEATA_IP:可选,指定seata-server启动的IP,该IP用于向注册中心注册时使用

SEATA_PORT:可选,指定seata-server启动的端口,默认为 8091

STORE_MODE:可选,指定seata-server的事务日志存储方式,支持 db、file、redis,默认是 file

SERVER_NODE:可选, 用于指定seata-server节点ID, 如 1,2,3…,默认根据IP生成

SEATA_ENV:可选,指定 seata-server 运行环境,如 dev、test 等,服务启动时会使用 registry-dev.conf 这样的配置

 

3:运行docker-compose.yml文件

docker compose up -d

 

4:访问nacos控制台

登录nacos控制台,如下图所示:

4.png.jpg

我们发现,seata已经咋nacos注册成功。说明配置没有问题。

 

5:访问seata控制台

浏览器访问:

http://39.99.144.212:7091/

 

输入账号密码:默认都是seata

 

如下图所示:

5.png.jpg

 

至此,docker部署seata到这里就完成了。

 

有好的建议,请在下方输入你的评论。