docker-compose 实现Seata Server高可用部署 | Spring Cloud 51

一、前言

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 ATTCCSAGAXA 事务模式,为用户打造一站式的分布式解决方案。

在这里插入图片描述

  • TC (Transaction Coordinator) - 事务协调者
    维护全局和分支事务的状态,驱动全局事务提交或回滚。

  • TM (Transaction Manager) - 事务管理器
    定义全局事务的范围:开始全局事务、提交或回滚全局事务。

  • RM (Resource Manager) - 资源管理器
    管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

其中 TC(Server端)为单独服务端部署,TM和RM(Client端)由业务系统集成。

Seata Server高可用部署说明:

  • Seata Server高可用依赖于注册中心、数据库,可不依赖配置中心。
  • 请保证多个Seata Server使用同一个注册中心和同一个存储中心,这样才能形成高可用部署

本章对TC(Server端) —— Seata Server(1.6.1版本)的高可用部署方式进行讲解。

  • 基于db存储模式
  • 使用nacos注册中心和配置中心

二、Seata Server存储模式

Seata Server存储模式(store.mode)现有filedbredis三种(后续将引入raft,mongodb

  • file模式为单机模式,无需改动,直接启动即可,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高

  • db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些

  • redis模式性能较高,存在事务信息丢失风险,请提前配置合适当前场景的redis持久化配置

    redis模式Seata-Server 1.3及以上版本支持

三、部署

以下全部操作均基于Seata-Server 1.6.1版本

3.1 准备数据库

已完成数据库安装和创建,可参照:Mysql8 数据库安装及主从配置 | Spring Cloud 2

数据库脚本下载地址:https://github.com/seata/seata/blob/1.6.1/script/server/db/mysql.sql

3.2 准备nacos

已完成nacos搭建,可参照:Nacos 单机集群搭建及常用生产环境配置 | Spring Cloud 3

3.2.1 新建namespace

nacos新建namespace命名空间:

在这里插入图片描述

3.2.2 配置中心配置

  • 手动配置

在上述namespace下新建配置,此处dataIdseataServer.properties

#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
# 此处的mygroup名字可以自定义,只修改这个值即可
service.vgroupMapping.mygroup=default
#If you use a registry, you can ignore it
#service.default.grouplist=192.168.0.31: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=true
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.
# 默认为file,一定要改为db,我们自己的服务启动会连接不到seata
store.mode=db
store.lock.mode=db
store.session.mode=db
#Used for password encryption

#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.
# 修改mysql的配置
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
# 指定seata的数据库,下面会提
store.db.url=jdbc:mysql://192.168.0.35:3306/seata-server?useUnicode=true&rewriteBatchedStatements=true
store.db.user=root
store.db.password=1qaz@WSX
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


#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
server.enableParallelRequestHandle=false

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

注意事项:

  • 修改service.vgroupMapping.mygroup=default该值,其中mygroup为事务分组名称可以自定义,后面我们自己的服务(TM和RM)启动时,配置文件中需要指定该事务分组。
  • 修改store.modestore.lock.modestore.session.mode这三个值为db,才能让Seata-Server连接到下面的数据库中。
  • 修改store.db配置项下的配置,连接到自己的数据库。
  • 配置源文件:https://github.com/seata/seata/blob/develop/script/config-center/config.txt

seata更多配置说明,请见官网:http://seata.io/zh-cn/docs/user/configurations.html

seata事务分组介绍,请见官网:http://seata.io/zh-cn/docs/user/txgroup/transaction-group.html

seata事务分组与高可用介绍,请见官网:http://seata.io/zh-cn/docs/user/txgroup/transaction-group-and-ha.html

  • 脚本同步

脚本位于 releases发布包 中,在线地址:https://github.com/seata/seata/tree/develop/script/config-center/nacos

sh ${SEATAPATH}/script/config-center/nacos/nacos-config.sh -h 192.168.0.31 -p 8848 -g DEFAULT_GROUP -t a4c150aa-fd09-4595-9afe-c87084b22105

参数说明:

  • -h: host,默认值 localhost
  • -p: port,默认值 8848
  • -g: 配置分组,默认值为 SEATA_GROUP
  • -t: 租户信息,对应nacos的命名空间id字段,默认值为空
  • 配置源文件:https://github.com/seata/seata/blob/develop/script/config-center/config.txt

3.2.2 最终效果

在这里插入图片描述

3.3 准备Seata配置

3.3.1 准备自定义配置文件

为了获取Seata-Server的配置文件,我们需要先启动一个Seata-Server的服务,然后再从启动的容器实例中把默认的配置文件复制出来,再进行修改。

docker run --name seata-server -p 8091:8091 -p 7091:7091 seataio/seata-server:1.6.1
docker cp seata-server:/seata-server/resources /root/apps/seata-server/
docker rm -f seata-server

3.3.2 application.yml配置文件

我的application.yml配置文件位于:/root/apps/seata-server/resources,该位置由3.3.1 章节操作决定

application.yml

server:
  port: 7091

spring:
  application:
    name: seata-server

logging:
  config: classpath:logback-spring.xml
  file:
    path: ${user.home}/logs/seata

console:
  user:
    username: seata
    password: seata

seata:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: nacos
    nacos:
      server-addr: 192.168.0.31:8848,192.168.0.41:8848,192.168.0.42:8848
      namespace: a4c150aa-fd09-4595-9afe-c87084b22105
      group: DEFAULT_GROUP
      username: nacos
      password: nacos
      data-id: seataServer.properties

  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: nacos
    nacos:
      application: seata-server
      server-addr: 192.168.0.31:8848,192.168.0.41:8848,192.168.0.42:8848
      group: DEFAULT_GROUP
      namespace: a4c150aa-fd09-4595-9afe-c87084b22105
      # tc集群名称
      cluster: default
      username: nacos
      password: nacos
#  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

注意事项:

  • seata.config.typeseata.registry.type均修改为nacos
  • 修改configregistrynacos的配置,其中namespacegroup须与3.2章节一致
  • Seata-Server默认用户名与密码为seata,请在console.user中修改

3.4 准备docker-compose.yml文件

version: "3.8"
# 通用日志设置
x-logging:
    &default-logging
    # 日志大小和数量
    options:
        max-size: "100m"
        max-file: "3"
    # 文件存储类型
    driver: json-file
services:
  seata-server:
    container_name: seata-server
    image: seataio/seata-server:1.6.1
    ports:
      - "7091:7091"
      - "8091:8091"
    environment:
      - STORE_MODE=db
      # 以SEATA_IP作为host注册seata server
      - SEATA_IP=192.168.0.31
      - SEATA_PORT=8091
    volumes:
      - "/usr/share/zoneinfo/Asia/Shanghai:/etc/localtime"  #设置系统时区
      - "/usr/share/zoneinfo/Asia/Shanghai:/etc/timezone"  #设置时区
      # 假设我们通过docker cp命令把资源文件拷贝到相对路径`./seata-server/resources`中
      # 如有问题,请阅读上面的[注意事项]以及[准备自定义配置文件]
      - "/root/apps/seata-server/resources:/seata-server/resources"
    logging: *default-logging

Seata-Server 支持以下环境变量:

  • SEATA_IP 可选,指定Seata-Server启动的IP, 该IP用于向注册中心注册时使用, 如nacos
  • SEATA_PORT 可选,指定Seata-Server启动的端口, 默认为 8091
  • STORE_MODE 可选,指定Seata-Server的事务日志存储方,默认是 file
  • SERVER_NODE 可选,用于指定Seata-Server节点ID, 如 1、2、3..., 默认为根据ip生成
  • SEATA_ENV 可选,指定Seata-Server运行环境, 如 devtest 等,服务启动时会使用registry-dev.conf 这样的配置或从配置中心拉取对应的配置
  • SEATA_CONFIG_NAME 可选,指定配置文件位置,如 file:/root/registry,将会加载 /root/registry.conf 作为配置文件,如果需要同时指定 file.conf文件,需要将registry.confconfig.file.name的值改为类似file:/root/file.conf

3.5 启动服务

docker-compose up -d

至此Seata-Server单机部署完,高可用配置即:部署多个Seata-Server使用同一个注册中心和同一个存储中心即可,请自行根据上述章节进行适当修改部署即可。

在这里插入图片描述

3.6 事务分组与高可用

关于事务分组与高可用,请参照官网最佳实践:http://seata.io/zh-cn/docs/user/txgroup/transaction-group-and-ha.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/21763.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

看模型、做技术交底、做项目汇报,图新说数字化汇报平台引领交互式汇报新模式

现场汇报效果不好,导致丢了一个项目! 项目汇报平淡无奇,方案屡次被毙! 面对专家质疑,回答苍白无力! 估计大家都有过这种经历和感受。 详细分析一下,基本上有以下几个方面的原因: …

虚幻or现实?堆区、栈区真实存在吗?是操作系统在骗你罢了...

文章目录 💐专栏导读💐文章导读🐧引例 🐦进程地址空间🐦虚拟地址与物理内存的联系🔔回答引例中的问题🔓写时拷贝 🐦虚拟地址存在的意义🔓malloc的本质 💐专栏…

装饰者设计模式解读

问题引进 星巴克咖啡订单项目(咖啡馆): 1) 咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡) 2) 调料:Milk、Soy(豆浆)、Chocolate 3) 要求在扩展新的咖啡种类时&#x…

接口测试全流程扫盲,让我看看有哪些漏网之鱼

目录 扫盲内容: 1.什么是接口? 2.接口都有哪些类型? 3.接口的本质及其工作原理是什么? 4.什么是接口测试? 5.问什么要做接口测试? 6.怎样做接口测试? 7.接口测测试点是什么?…

一些云原生开源安全工具介绍

本博客地址:https://security.blog.csdn.net/article/details/130789465 一、Kubernetes安全监测工具kube-bench kube-bench是一个用Golang开发的、由Aqua Security发布的自动化Kubernetes基准测试工具,它运行CIS Kubernetes基准中的测试项目。这些测试…

MySQL高级篇第一天

目录 一、索引 二、索引结构 三、索引分类 四、索引语法 五、索引设计原则 六、视图 七、存储过程与概述 八、触发器 九、总结 一、索引 (一)索引概述 索引是一种能够帮组Mysql高效的从磁盘上查询数据的一种数据结构,这些数据结构以某…

用WaveNet预测(Adapted Google WaveNet-Time Series Forecasting)

目录 剧情简介: 数据来源 加载数据 分割数据和可视化 时间序列的多元波网模型:实现(多步预测) 创建模型 创建数据集 数据准备 1- Training dataset preparation 2- Validation dataset preparation Train the Model with TPU: 使用经过训练的适应Google WaveNet预测…

YOLO NAS note 1

Git Hub: https://github.com/Deci-AI/super-gradients Yolo-Nas 的代码比YOLO v8 还恐怖。之前的YOLO数据可以通过: coco_detection_yolo_format_train, 和 coco_detection_yolo_format_val 自动转。 这里写目录标题 Train数据获取数据增强训练criteri…

ChatGPT 提问,软件杂项部分

堆内存与栈内存一般分别 有多少 ChatGPT 堆内存和栈内存的大小取决于操作系统和编译器的限制以及程序的运行环境。以下是一些常见的默认大小范围,但请注意这些值可以因环境而异: 栈内存大小: Windows平台:默认情况下&#xff…

CNN实现手写数字识别(Pytorch)

CNN结构 CNN(卷积神经网络)主要包括卷积层、池化层和全连接层。输入数据经过多个卷积层和池化层提取图片信息后,最后经过若干个全连接层获得最终的输出。 CNN的实现主要包括以下步骤: 数据加载与预处理模型搭建定义损失函数、优…

应用现代化中的弹性伸缩

作者:马伟,青云科技容器顾问,云原生爱好者,目前专注于云原生技术,云原生领域技术栈涉及 Kubernetes、KubeSphere、KubeKey 等。 2019 年,我在给很多企业部署虚拟化,介绍虚拟网络和虚拟存储。 2…

微服务架构初探

大家好,我是易安!我们今天来谈一谈微服务架构的前世今生。 我们先来看看维基百科是如何定义微服务的。微服务的概念最早是在2014年由Martin Fowler和James Lewis共同提出,他们定义了微服务是由单一应用程序构成的小服务,拥有自己的…

建立在Safe生态的—GameFi SocialFi双赛道项目No.1头号玩家

最近大家关注的重点在BRC-20和MEME项目,人们似乎更在意短期的投机回报。而在这之外,一个web3的游戏——No.1头号玩家却得到了大量的玩家支持。 据了解,No.1是一个GameFi & SocialFi的双赛道web3游戏,中文名称为头号玩家。它是…

光纤衰减器作用及使用说明

在光纤通信中,光信号的强度过大或过小都会对信号的传输和接收产生不良的影响,因此光衰减器在光通信系统中起到了重要的作用。那什么是光衰减器呢?它又有什么作用呢?下面跟着小易一起来了解一下吧! 一、什么是光纤衰减…

HUSTOJ中添加初赛练习系统

文章目录 0. 基于hustoj二开的初赛练习系统,QQ4705852261. 主界面2. 练习界面3. 模拟考试界面4. 查看试卷回放5. 后台操作界面6. 后台试题分类-列表7.后台试题-列表8. 后台试题-添加9. 后台试卷结构-设置 0. 基于hustoj二开的初赛练习系统,QQ470585226 …

[笔记]渗透测试工具Burpsuit《一》Burpsuit介绍

文章目录 前言一、安装配置1.1 环境1.2 安装过程1.3 科技过程 二、常用功能2.1 Manual penetration testing features2.2 Advanced/custom automated attacks2.3 Automated scanning for vulnerabilities2.4 Productivity tools2.5 Extensions 三、拓展功能 前言 Burp Suite(b…

一、预约挂号微服务模块搭建

文章目录 一、预约挂号微服务模块搭建1、项目模块构建2、sql资源3、构建父工程(yygh-parent)3.1、添加配置pom.xml 4、搭建common父模块4.1、搭建common4.2、修改配置pom.xml 5、搭建common-util模块5.1、搭建common-util5.2、修改配置pom.xml5.3、添加公…

ELK的安装部署与使用

ELK的安装与使用 安装部署 部署环境:Elasticsearch-7.17.3 Logstash-7.17.3 Kibana-7.17.3 一、安装部署Elasticsearch 解压目录,进入conf目录下编辑elasticsearch.yml文件,输入以下内容并保存 network.host: 127.0.0.1 http.port: 9200…

计算机网络实验(ensp)-实验10:三层交换机实现VLAN间路由

目录 实验报告: 实验操作 1.建立网络拓扑图并开启设备 2.配置主机 1.打开PC机 配置IP地址和子网掩码 2.配置完成后点击“应用”退出 3.重复步骤1和2配置每台PC 3.配置交换机VLAN 1.点开交换机 2.输入命名:sys 从用户视图切换到系统视图…

Jenkins版本升级

Jenkins版本过低的时候,一些插件无法升级,会引发一系列错误,这个时候我们就要升级版本了 一、下载更新包 第一种方式:Jenkins页面下载最新包 第二种官网上下载war包(Jenkins官网) 二、打开服务器搜索jenkins.war路径 1、如果Jenk…