• 分布式事务之Seata介绍


    Seata历史

    1. 阿里巴巴:

      • TXC:淘宝交易系统的分布式事务框架,阿里巴巴中间件团队自2014年开始启动该项目,用于解决应用架构从单一服务向微服务转变所带来的分布式事务问题;

      • GTS:全球交易服务。TXC作为阿里云中间件产品,新名称GTS于2016年发布;

      • Fescar:2019年开始了基于TXC/GTS的开源项目Fescar,用于开源项目社区发展;最后更名为 Seata

    2. 蚂蚁金服:

      • XTS:扩展事务服务。蚂蚁金服中间件团队自2007年开始开发分布式事务中间件,该中间件在蚂蚁金服中得到广泛应用,解决了跨数据库和服务的数据一致性问题。
      • DTX:分布式事务扩展。自2013年以来,XTS已在蚂蚁金融云上发布,名称为DTX;
    3. Seata社区:

      • Seata:简单的可扩展分布式事务解决方案,蚂蚁金服将Fedscar改名为Seata并开源,使其成为一个中立、开放的分布式事务社区。

    Seata运行机制

    1. Seata包含以下几个角色

      • Transaction Coordinator(TC):独立的外部进程,不包含任何业务逻辑,主要职责是维护整个事务的全局状态,通知RM执行回滚或者提交
      • Transaction Manager™:职责是开启、回滚、提交一个全局事务。在微服务架构中对应聚合服务
      • Resource Manager(RM):对应每个微服务的事务分支,职责是执行分支事务操作
    2. Seata角色交互过程

    在这里插入图片描述

    1. 交互步骤

      • TM 开启全局事务:TM 收到请求之后,开启一个全局的事务并生成一个全局的 XID 编号,并将 XID 编号发送给 TC,同时在 TM 中通过远程调用 RM,发起具体的业务服务调用;
      • RM 完成本地操作:RM 收到 TM 发出的请求调用,RM 先完成本地操作之后(AT 与 TCC 与 Saga 模式各有不同),然后再向 TC 发起上报;
      • RM 向 TC 上报分支事务: RM 完成本地事务操作(未提交),向 TC 上报分支事务(申请全局锁)
      • TM 向 TC 提交全局事务:TM 如果顺利的完成 3 个微服务的调用(没有异常,没有超时),就向 TC 提交全局事务,如果有任何异常或超时,TM 向 TC 提交全局回滚。
      • RM 执行提交或回滚操作:RM 收到 TC 的提交或回滚后,执行具体的提交或回滚操作,事务执行完成。

    docker-compose安装

    1. 安装版本seata-server-1.4.2

    2. 采用Nacos注册中心,Mysql存储。提前准备环境

      环境版本准备IP
      Nacos2.0.4创建命名空间seata-namespace192.168.101.8:8848
      Mysql5.6创建数据库seata_server192.168.101.8:3306
      Seata1.4.2172.26.0.2:8091
    3. 步骤一:创建数据库seata_server。并执行脚本。参考https://github.com/seata/seata/blob/1.4.2/script/server/db/mysql.sql

      CREATE TABLE IF NOT EXISTS `global_table`
      (
          `xid`                       VARCHAR(128) NOT NULL,
          `transaction_id`            BIGINT,
          `status`                    TINYINT      NOT NULL,
          `application_id`            VARCHAR(32),
          `transaction_service_group` VARCHAR(32),
          `transaction_name`          VARCHAR(128),
          `timeout`                   INT,
          `begin_time`                BIGINT,
          `application_data`          VARCHAR(2000),
          `gmt_create`                DATETIME,
          `gmt_modified`              DATETIME,
          PRIMARY KEY (`xid`),
          KEY `idx_gmt_modified_status` (`gmt_modified`, `status`),
          KEY `idx_transaction_id` (`transaction_id`)
          ) ENGINE = InnoDB
          DEFAULT CHARSET = utf8mb4;
      
      -- the table to store BranchSession data
      CREATE TABLE IF NOT EXISTS `branch_table`
      (
          `branch_id`         BIGINT       NOT NULL,
          `xid`               VARCHAR(128) NOT NULL,
          `transaction_id`    BIGINT,
          `resource_group_id` VARCHAR(32),
          `resource_id`       VARCHAR(256),
          `branch_type`       VARCHAR(8),
          `status`            TINYINT,
          `client_id`         VARCHAR(64),
          `application_data`  VARCHAR(2000),
          `gmt_create`        DATETIME(6),
          `gmt_modified`      DATETIME(6),
          PRIMARY KEY (`branch_id`),
          KEY `idx_xid` (`xid`)
          ) ENGINE = InnoDB
          DEFAULT CHARSET = utf8mb4;
      
      -- the table to store lock data
      CREATE TABLE IF NOT EXISTS `lock_table`
      (
          `row_key`        VARCHAR(128) NOT NULL,
          `xid`            VARCHAR(128),
          `transaction_id` BIGINT,
          `branch_id`      BIGINT       NOT NULL,
          `resource_id`    VARCHAR(256),
          `table_name`     VARCHAR(32),
          `pk`             VARCHAR(36),
          `gmt_create`     DATETIME,
          `gmt_modified`   DATETIME,
          PRIMARY KEY (`row_key`),
          KEY `idx_branch_id` (`branch_id`)
          ) ENGINE = InnoDB
          DEFAULT CHARSET = utf8mb4;
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
    4. 步骤二:在Nacos上创建命名空间seata-namespace(ID为e489e0de-8001-41b8-83a6-3241d426a9f7)

    5. 步骤三:在Nacos的seata-group命名空间下创建DataID为seataServer.properties。Group为DEFAULT_GROUP,配置格式为properties,配置内容如下。配置参数参考地址https://seata.io/zh-cn/docs/user/configurations.html。配置config.txt地址https://github.com/seata/seata/blob/1.4.2/script/config-center/config.txt

      # 重点修改config.txt的数据库配置
      store.mode=db
      # mysql8及以上版本对应的driver:com.mysql.cj.jdbc.Driver
      # mysql8以下版本的driver:com.mysql.jdbc.Driver
      store.db.driverClassName=com.mysql.jdbc.Driver
      store.db.url=jdbc:mysql://192.168.101.8:3306/seata_server?useUnicode=true&rewriteBatchedStatements=true&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
      store.db.user=root
      store.db.password=root
      store.db.minConn=5
      store.db.maxConn=10
      # 默认是my_test_tx_group
      service.vgroupMapping.my_test_tx_group=default
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12

    在这里插入图片描述

    1. 步骤四:创建registry.conf配置文件(在./seata-server/nacos-db/config/目录下)

      registry {
        type = "nacos"
        
        nacos {
          # seata服务注册在nacos上的别名,客户端通过该别名调用服务
          application = "seata-server"
          # nacos服务的ip和端口
          serverAddr = "192.168.101.8:8848"
          # nacos上指定的namespace
          namespace = "e489e0de-8001-41b8-83a6-3241d426a9f7"
          cluster = "default"
          group = "DEFAULT_GROUP"
          username = "nacos"
          password = "nacos"
        }
      }
      
      config {
        type = "nacos"
        
        nacos {
          # nacos服务的ip和端口
          serverAddr = "192.168.101.8:8848"
          # nacos上指定的namespace
          namespace = "e489e0de-8001-41b8-83a6-3241d426a9f7"
          group = "DEFAULT_GROUP"
          username = "nacos"
          password = "nacos"
        # 从v1.4.2版本开始,已支持从一个Nacos dataId中获取所有配置信息,只需要额外添加一个dataId配置项
          dataId="seataServer.properties"
        }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
    2. 步骤五:创建docker-compose-nacos-db.yml

      version: "3"
      services:
        seata-server:
          image: seataio/seata-server:1.4.2
          hostname: seata-server
          ports:
            - "8091:8091"
          environment:
            - SEATA_PORT=8091
            - SEATA_CONFIG_NAME=file:/root/seata-config/registry
          volumes:
            - "./seata-server/nacos-db/config/:/root/seata-config/:rw"  
          restart: always
          networks:
            seata-net:
              ipv4_address: 172.26.0.2  
      networks:
        seata-net:
          driver: bridge
          ipam:
            config:
              - subnet: 172.26.0.0/16   
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
    3. 步骤六:启动

      $ docker-compose -f docker-compose-nacos-db.yml up
      ...省略...
      : Server started, listen port: 8091
      表示启动成功
      
      • 1
      • 2
      • 3
      • 4
    4. 步骤七:在Nacos中可以看到Seata Server的注册信息
      在这里插入图片描述

  • 相关阅读:
    混合云搭建-S2S VPN 连接Azure和AWS云动手实践
    Python爬虫之Js逆向案例(13)-某乎最新x-zse-96的rpc方案后续
    AtCoder Beginner Contest 263 G.Erasing Prime Pairs(二分图最大匹配-网络流)
    人工智能知识全面讲解:垃圾邮件克星——朴素贝叶斯算法
    QLineEdit 类(行编辑器)
    因为manifest.json文件引起的 android-chrome-192x192.png 404 (Not Found)
    shell 实例:检查default路由的存在
    堆排序+TOPK问题
    CoreData/数据存储管理, CoreDataRelationships/关系型数据结构存储管理 的使用
    安防监控/视频汇聚平台EasyCVR云端录像不展示是什么原因?该如何解决?
  • 原文地址:https://blog.csdn.net/usagoole/article/details/126162598