Seata基础知识与安装

一、Seata的基础知识

官方文档:https://seata.io/zh-cn/docs/overview/what-is-seata.html

1、Seata的四种事务模式:

Seata是分布式事务的一站式解决方案,提供了AT、TCC、SAGA、XA四种事务模式,都属于2PC提交;

  • AT(最终一致性,无业务侵入,有undo log,存在中间状态):代码无侵入,是我们最常用的方案!AT = Auto Transactional

  • TCC(最终一致性,强业务侵入,需要自己实现三个方法,存在中间状态):代码有侵入,得自己实现自定义的 prepare/commit/rollback逻辑;TCC = Try-Confirm-Cancel

  • SAGA(最终一致性,补偿型,需要编写Saga模总业务逻辑服务,存在中间状态):长事务解决方案,一阶段直接提交本地事务(无锁,高性能),二阶段rollback逻辑得业务开发者实现;

  • XA(强一致性,无业务侵入,无undo log,无中间状态,依赖于数据库的本地事务):主流的数据库对XA规范都提供了支持;

2PC提交(两阶段提交):第一阶段:prepare行为;第二阶段:commit或者rollback行为;生产中80%场景都是使用AT模式。

image.png

2、Seata通过TC、TM、RM完成了对四种事务模型的封装:

  • TC —— 事务协调者:就是我们安装的 seata-server,维护全局和分支事务的状态,驱动全局事务的提交或回滚;

  • TM —— 事务管理者:通过大事务入口方法的 @GlobalTransactional 注解,开启全局事务,提交或回滚全局事务;

  • RM —— 资源管理者:在业务侧管理分支事务的资源,向TC注册分支事务并汇报分支事务状态,驱动分支事务的提交或回滚;

3、AT/TCC/SAGA 与 XA模式的本质区别:

  • AT/TCC/SAGA 本质上,都是“补偿型”的,遵循最终一致性,存在undoLog,存在中间状态;

    • 第一阶段,创建undoLog后,就直接提交数据库的本地事务,并对本条数据添加行级锁;

    • 第二阶段:如果是commit,则异步删除undoLog;如果是rollback,则通过undoLog进行“反向补偿”更新;

    但是,这过程中存在中间状态,会被别的程序读取到,存在“脏读”问题;

image.png

  • XA模式,就是为了解决“强一致性”的应用场景,不依赖于undoLog,而是依赖于数据库的“本地事务”和主流数据库对XA协议的支持

    • 第一阶段:无需创建undoLog,直接依赖于数据库对XA协议的支持,使用数据库的“本地事务”;

    • 第二阶段:如果是commit,则执行XA分支的commit;如果是rollback,则执行XA分支的rollback;

    这过程不存在对外可见的中间状态,不存在“脏读风险”,也不存在undoLog反向补偿日志;

    其中XA Prepare阶段:通过数据源代理向TC报告XA分支的执行情况!

image.png

4、AT 和 TCC的本质区别?

都是“补偿型”二阶段事务模式,都是最终一致性;

AT:第一阶段提交数据库事务,二阶段删除undoLog或补偿;(中间状态有数据库行锁)

TCC:第一阶段执行try(prepare方法)中的逻辑,二阶段执行confirm(conmit方法)或者cancel(rollback方法);(中间状态无数据库行锁)

5、在“补偿型”事务模式下已经有了AT和TCC,为什么还要有SAGA模式?

对于一些封闭的、无法修改的老系统或其他公司的系统,他们也没有引入任何分布式事务框架,甚至语言都不一样;

这个时候,如果真要实现分布式事务,只能从外部着手,这个时候就得使用SAGA模式:

image.png

SAGA是Seata提供的“长事务”解决方案,提供了“异构系统得事务统一处理模型”,基于SAGA状态机 + 状态机引擎完成。

业务模型是一个json文件,以下是状态机设计器和教程地址,工作中非常少用,真的需要使用的时候,再学习不迟~:

image.png


二、seata-server的安装

1、下载seata-server:

https://github.com/seata/seata/releases

我本次下载的是v1.4.2

2、修改 ./conf/registry.conf 文件中的注册中心和配置中心:

image.png

3、如果配置中心选择的是“file”,那么就修改 ./conf/file.conf 中Seata的存储模式为“db”并修改 jdbc 链接信息:

## transaction log store, only used in seata-server
store {
  ## store mode: file、db、redis
  mode = "db"
  ## rsa decryption public key
  publicKey = ""
  ## file store property
  file {
    ## store location dir
    dir = "sessionStore"
    # branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions
    maxBranchSessionSize = 16384
    # globe session size , if exceeded throws exceptions
    maxGlobalSessionSize = 512
    # file buffer size , if exceeded allocate new buffer
    fileWriteBufferCacheSize = 16384
    # when recover batch read size
    sessionReloadReadSize = 100
    # async, sync
    flushDiskMode = async
  }

  ## database store property
  db {
    ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.
    datasource = "druid"
    ## mysql/oracle/postgresql/h2/oceanbase etc.
    dbType = "mysql"
    driverClassName = "com.mysql.jdbc.Driver"
    ## if using mysql to store the data, recommend add rewriteBatchedStatements=true in jdbc connection param
    url = "jdbc:mysql://localhost:3306/seata?rewriteBatchedStatements=true"
    user = "root"
    password = "xxxxxxxx"
    minConn = 5
    maxConn = 100
    globalTable = "global_table"
    branchTable = "branch_table"
    lockTable = "lock_table"
    queryLimit = 100
    maxWait = 5000
  }

  ## redis store property
  redis {
    ## redis mode: single、sentinel
    mode = "single"
    ## single mode property
    single {
      host = "127.0.0.1"
      port = "6379"
    }
    ## sentinel mode property
    sentinel {
      masterName = ""
      ## such as "10.28.235.65:26379,10.28.235.65:26380,10.28.235.65:26381"
      sentinelHosts = ""
    }
    password = ""
    database = "0"
    minConn = 1
    maxConn = 10
    maxTotal = 100
    queryLimit = 100
  }
}

4、如果配置中心中选择的是nacos,那么就需要将配置写入nacos的配置中心中:

官方推荐的配置文件:https://github.com/seata/seata/tree/develop/script/config-center/config.txt

如果选择的是mysql数据库,则修改该文件:image.png

另外需要注意的地方是“事务分组”的配置,也可以不修改:

service.vgroupMapping.default_tx_group=default
# default这里必须等于 registry.conf 中的cluster="default"(当然可以更改 )
# 事务分组:用于防护机房停电,来启用备用机房,或者异地机房,容错机制,当然如果Seata-Server配置了对应的事务分组,Client也需要配置相同的事务分组

最后在nacos的配置中心中手动创建一个dataId = seataServer.properties 的配置:

image.png

如果保存时候提示语法错误,是因为有些没用的配置值为null,直接删掉即可!

另外,这种dataId = seataServer.properties 单个配置文件的方式,是v1.4.2后刚开始支持的配置模式,之前的特繁琐,涉及到非常多的配置文件,需要借助官方的 nacos-config.sh 来完成!

4、在数据库中初始化seata-server的表结构:

官方指引的部署资源目录:https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html

v1.4.2用到的seata-server的数据库脚本:https://github.com/seata/seata/blob/1.4.2/script/server/db/mysql.sql

image.png

5、启动seata-server(默认8091端口):

Linux下:

$ sh ./bin/seata-server.sh

Windows下:

bin\seata-server.bat

image.png

6、补充,特别推荐使用nacos作为注册中心和配置中心,因为方便seata-server集群部署:

Seata-Server的默认端口为:8091,如果我们想集群部署,则直接修改每个服务的启动端口即可!

支持的启动参数如下:

参数 全写 作用 备注
-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 这样的配置
# 我们分别在8091、8092、8093三个端口起三个服务:
seata-server.bat -p 8091 -n 1
seata-server.bat -p 8092 -n 2
seata-server.bat -p 8093 -n 3

image.png

具体成功与否,我们还是去Nacos看看seata-server的服务列表,才最有说服力:

image.png

Seata-Server集群部署就算是完成啦!

jiguiquan@163.com

文章作者信息...

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

相关推荐