seata整合nacos完成分布式的部署

一、背景

最近在学习Seata,此处简单记录一下Seata Server的分布式部署,其中的注册中心和配置中心使用nacos来完成,默认的file方式无法实现分布式部署。其中 nocos和mysql默认认为在机器上已经部署好了。

二、部署机器

机器ip 部署资源 机器类型
192.168.56.101 seata server 虚拟机
192.168.56.102 seata server 虚拟机
192.168.56.103 seata server 虚拟机
10.1.206.169 nacos / mysql 宿主机

三、部署步骤

1、在seata上创建命名空间

在nacos上创建seata的命名空间,需要记住的是 命名空间的id ,这个值在后期需要用到。

2、下载对应版本的seata

下载解压:

  1. # 下载
  2. wget https://github.com/seata/seata/releases/download/v1.4.2/seata-server-1.4.2.zip
  3. # 解压
  4. unzip seata-server-1.4.2.zip
  5. # 查看 seata 目录结构
  6. tree seata -L 2
  7. seata
  8. └── seata-server-1.4.2
  9. ├── LICENSE
  10. ├── bin
  11. ├── conf (主要修改registry.conf配置文件)
  12. ├── lib
  13. └── logs

3、单机启动

此处演示的是在 192.168.56.101 这台机器上配置的seata server 。

1、修改seata配置文件

配置文件位置:$seata_server_home/conf/registry.conf

$seata_server_home 这是是seata server 的解压目录。

1、修改注册中心为nacos

  1. vi conf/registry.conf
  2. registry {
  3. # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  4. type = "nacos"
  5. nacos {
  6. # 注册到nacos上的服务名
  7. application = "seata-server"
  8. # nacos的地址
  9. serverAddr = "10.1.168.152:8847"
  10. # nacos上的分组
  11. group = "SEATA_GROUP"
  12. # 命名空间,为上一步创建的
  13. namespace = "774a5264-662f-4e27-a885-8d0783e5f26a"
  14. # 集群,这个是事物分组的时候需要用到
  15. cluster = "default"
  16. # nacos的用户名和密码
  17. username = "nacos"
  18. password = "nacos"
  19. }
  20. }

2、修改配置中心为nacos

  1. vi conf/registry.conf
  2. config {
  3. # file、nacos 、apollo、zk、consul、etcd3
  4. type = "nacos"
  5. nacos {
  6. serverAddr = "10.1.168.152:8848"
  7. namespace = "774a5264-662f-4e27-a885-8d0783e5f26a"
  8. group = "SEATA_GROUP"
  9. username = "nacos"
  10. password = "nacos"
  11. # 此处的这个 dataId 的值,需要在nacos上创建,后期需要导入配置到这个命名空间中
  12. dataId = "seataServer.properties"
  13. }
  14. }

2、导入配置到nacos中

数据的存储模式使用 db,也可以使用redis,使用db需要创建4张表global_tablebranch_tablelock_tabledistributed_lock

1、存储模式设置为db,建表

建表语句为 https://github.com/seata/seata/tree/develop/script/server/db

  1. -- -------------------------------- The script used when storeMode is 'db' --------------------------------
  2. -- the table to store GlobalSession data
  3. CREATE TABLE IF NOT EXISTS `global_table`
  4. (
  5. `xid` VARCHAR(128) NOT NULL,
  6. `transaction_id` BIGINT,
  7. `status` TINYINT NOT NULL,
  8. `application_id` VARCHAR(32),
  9. `transaction_service_group` VARCHAR(32),
  10. `transaction_name` VARCHAR(128),
  11. `timeout` INT,
  12. `begin_time` BIGINT,
  13. `application_data` VARCHAR(2000),
  14. `gmt_create` DATETIME,
  15. `gmt_modified` DATETIME,
  16. PRIMARY KEY (`xid`),
  17. KEY `idx_gmt_modified_status` (`gmt_modified`, `status`),
  18. KEY `idx_transaction_id` (`transaction_id`)
  19. ) ENGINE = InnoDB
  20. DEFAULT CHARSET = utf8;
  21. -- the table to store BranchSession data
  22. CREATE TABLE IF NOT EXISTS `branch_table`
  23. (
  24. `branch_id` BIGINT NOT NULL,
  25. `xid` VARCHAR(128) NOT NULL,
  26. `transaction_id` BIGINT,
  27. `resource_group_id` VARCHAR(32),
  28. `resource_id` VARCHAR(256),
  29. `branch_type` VARCHAR(8),
  30. `status` TINYINT,
  31. `client_id` VARCHAR(64),
  32. `application_data` VARCHAR(2000),
  33. `gmt_create` DATETIME(6),
  34. `gmt_modified` DATETIME(6),
  35. PRIMARY KEY (`branch_id`),
  36. KEY `idx_xid` (`xid`)
  37. ) ENGINE = InnoDB
  38. DEFAULT CHARSET = utf8;
  39. -- the table to store lock data
  40. CREATE TABLE IF NOT EXISTS `lock_table`
  41. (
  42. `row_key` VARCHAR(128) NOT NULL,
  43. `xid` VARCHAR(128),
  44. `transaction_id` BIGINT,
  45. `branch_id` BIGINT NOT NULL,
  46. `resource_id` VARCHAR(256),
  47. `table_name` VARCHAR(32),
  48. `pk` VARCHAR(36),
  49. `gmt_create` DATETIME,
  50. `gmt_modified` DATETIME,
  51. PRIMARY KEY (`row_key`),
  52. KEY `idx_branch_id` (`branch_id`)
  53. ) ENGINE = InnoDB
  54. DEFAULT CHARSET = utf8;
  55. CREATE TABLE IF NOT EXISTS `distributed_lock`
  56. (
  57. `lock_key` CHAR(20) NOT NULL,
  58. `lock_value` VARCHAR(20) NOT NULL,
  59. `expire` BIGINT,
  60. primary key (`lock_key`)
  61. ) ENGINE = InnoDB
  62. DEFAULT CHARSET = utf8mb4;
  63. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
  64. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
  65. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
  66. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);

2、简化的配置

完整的配置: https://github.com/seata/seata/tree/develop/script/config-center/config.txt

注意:

  • 此处指定的存储模式是db,因此需要配置数据库连接信息,指定的数据库需要存在 上一步 创建的表。
  • 此处配置了多个分组,也指定了多个集群

  1. # 这个地方的事物分组可以配置多个,多个配置多行
  2. service.vgroupMapping.my_test_tx_group=default
  3. service.vgroupMapping.product-service=hangzhou
  4. service.vgroupMapping.order-service=hangzhou
  5. # 指定存储模式为db
  6. store.mode=db
  7. store.db.datasource=druid
  8. store.db.dbType=mysql
  9. store.db.driverClassName=com.mysql.jdbc.Driver
  10. store.db.url=jdbc:mysql://10.1.168.152:3306/seata?useUnicode=true&rewriteBatchedStatements=true
  11. store.db.user=root
  12. store.db.password=root

3、完整的配置

  1. transport.type=TCP
  2. transport.server=NIO
  3. transport.heartbeat=true
  4. transport.enableClientBatchSendRequest=true
  5. transport.threadFactory.bossThreadPrefix=NettyBoss
  6. transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
  7. transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
  8. transport.threadFactory.shareBossWorker=false
  9. transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
  10. transport.threadFactory.clientSelectorThreadSize=1
  11. transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
  12. transport.threadFactory.bossThreadSize=1
  13. transport.threadFactory.workerThreadSize=default
  14. transport.shutdown.wait=3
  15. service.vgroupMapping.my_test_tx_group=default
  16. service.default.grouplist=127.0.0.1:8091
  17. service.enableDegrade=false
  18. service.disableGlobalTransaction=false
  19. client.rm.asyncCommitBufferLimit=10000
  20. client.rm.lock.retryInterval=10
  21. client.rm.lock.retryTimes=30
  22. client.rm.lock.retryPolicyBranchRollbackOnConflict=true
  23. client.rm.reportRetryCount=5
  24. client.rm.tableMetaCheckEnable=false
  25. client.rm.tableMetaCheckerInterval=60000
  26. client.rm.sqlParserType=druid
  27. client.rm.reportSuccessEnable=false
  28. client.rm.sagaBranchRegisterEnable=false
  29. client.rm.tccActionInterceptorOrder=-2147482648
  30. client.tm.commitRetryCount=5
  31. client.tm.rollbackRetryCount=5
  32. client.tm.defaultGlobalTransactionTimeout=60000
  33. client.tm.degradeCheck=false
  34. client.tm.degradeCheckAllowTimes=10
  35. client.tm.degradeCheckPeriod=2000
  36. client.tm.interceptorOrder=-2147482648
  37. store.mode=db
  38. store.lock.mode=file
  39. store.session.mode=file
  40. store.publicKey=
  41. store.file.dir=file_store/data
  42. store.file.maxBranchSessionSize=16384
  43. store.file.maxGlobalSessionSize=512
  44. store.file.fileWriteBufferCacheSize=16384
  45. store.file.flushDiskMode=async
  46. store.file.sessionReloadReadSize=100
  47. store.db.datasource=druid
  48. store.db.dbType=mysql
  49. store.db.driverClassName=com.mysql.jdbc.Driver
  50. store.db.url=jdbc:mysql://10.1.168.152:3306/seata?useUnicode=true&rewriteBatchedStatements=true
  51. store.db.user=root
  52. store.db.password=root
  53. store.db.minConn=5
  54. store.db.maxConn=30
  55. store.db.globalTable=global_table
  56. store.db.branchTable=branch_table
  57. store.db.distributedLockTable=distributed_lock
  58. store.db.queryLimit=100
  59. store.db.lockTable=lock_table
  60. store.db.maxWait=5000
  61. store.redis.mode=single
  62. store.redis.single.host=127.0.0.1
  63. store.redis.single.port=6379
  64. store.redis.sentinel.masterName=
  65. store.redis.sentinel.sentinelHosts=
  66. store.redis.maxConn=10
  67. store.redis.minConn=1
  68. store.redis.maxTotal=100
  69. store.redis.database=0
  70. store.redis.password=
  71. store.redis.queryLimit=100
  72. server.recovery.committingRetryPeriod=1000
  73. server.recovery.asynCommittingRetryPeriod=1000
  74. server.recovery.rollbackingRetryPeriod=1000
  75. server.recovery.timeoutRetryPeriod=1000
  76. server.maxCommitRetryTimeout=-1
  77. server.maxRollbackRetryTimeout=-1
  78. server.rollbackRetryTimeoutUnlockEnable=false
  79. server.distributedLockExpireTime=10000
  80. client.undo.dataValidation=true
  81. client.undo.logSerialization=jackson
  82. client.undo.onlyCareUpdateColumns=true
  83. server.undo.logSaveDays=7
  84. server.undo.logDeletePeriod=86400000
  85. client.undo.logTable=undo_log
  86. client.undo.compress.enable=true
  87. client.undo.compress.type=zip
  88. client.undo.compress.threshold=64k
  89. log.exceptionRate=100
  90. transport.serialization=seata
  91. transport.compressor=none
  92. metrics.enabled=false
  93. metrics.registryType=compact
  94. metrics.exporterList=prometheus
  95. metrics.exporterPrometheusPort=9898

4、导入到nacos中

3、启动seata server

  1. ./seata-server.sh -h 192.168.56.101 -p 8091 -n 1
  1. -h: 注册到注册中心的ip
  2. -p: Server rpc 监听端口
  3. -m: 全局事务会话信息存储模式,filedbredis,优先读取启动参数 (Seata-Server 1.3及以上版本支持redis)
  4. -n: Server node,多个Server时,需区分各自节点,用于生成不同区间的transactionId,以免冲突
  5. -e: 多环境配置参考 http://seata.io/en-us/docs/ops/multi-configuration-isolation.html

4、查看seata server 列表

4、seata server 集群启动

1、拷贝seata server配置到3台机器上

已知,我们上面的操作都是在 192.168.56.101 这台机器上操作的,那么我们将 192.168.56.101 这台机器上的seata配置拷贝到 192.168.56.102和192.168.56.103,然后启动即可。

  1. # 1、将 192.168.56.101 的seata 配置拷贝到102和103上
  2. scp -r /home/appuser/opt/seata/ appuser@192.168.56.102:/home/appuser/opt/
  3. scp -r /home/appuser/opt/seata/ appuser@192.168.56.103:/home/appuser/opt/

经过上方2步操作,那么101、102和103三台机器的 seata 配置一摸一样。

依次启动3台机器的seata server

  1. # 切换到 192.168.56.101 机器上操作
  2. cd /home/appuser/opt/seata/seata-server-1.4.2/bin
  3. ./seata-server.sh -h 192.168.56.101 -p 8091 -n 1
  4. # 切换到 192.168.56.102 机器上操作
  5. cd /home/appuser/opt/seata/seata-server-1.4.2/bin
  6. ./seata-server.sh -h 192.168.56.102 -p 8091 -n 2
  7. # 切换到 192.168.56.103 机器上操作
  8. cd /home/appuser/opt/seata/seata-server-1.4.2/bin
  9. ./seata-server.sh -h 192.168.56.103 -p 8091 -n 3

2、查看seata server列表

5、在虚拟机上放行8091端口

  1. # 防火墙放行 8091 端口
  2. firewall-cmd --zone=public --add-port=8091/tcp --permanent
  3. # 重新加载防火墙配置
  4. firewall-cmd --reload

四、属性配置

1、核心关注的属性

服务端配置端 解释 客户端配置 解释
registry.type 注册中心类型 registry.type 注册中心类型
config.type 配置中心类型 config.type 配置中心类型
#store.mode=db需要以下配置 service.vgroupMapping.my_test_tx_group 事物分组,对应的值是 集群
store.db.driverClassName 驱动类 service.default.grouplist TC服务列表 仅注册中心为file时使用
store.db.url 数据库连接url service.disableGlobalTransaction 是否开启全局事务
store.db.user 数据库用户名 client.rm.lock.retryInterval 校验或占用全局锁重试间隔 默认10,单位毫秒
store.db.password 数据库密码 client.rm.lock.retryTimes 校验或占用全局锁重试次数 默认30
#store.mode=redis 需要以下配置
store.redis.host redis地址
store.redis.port redis端口
store.redis.database redis数据库,默认是0
store.redis.password redis密码,没有不填写

2、服务端配置

1、undo日志保存天数

  1. # undo保留天数,默认是7天
  2. server.undo.logSaveDays=7

2、事务会话信息存储方式

  1. # 事务会话信息存储方式,file本地文件(不支持HA),db数据库|redis(支持HA)
  2. store.mode
  3. =file
  4. 需要配置的属性
  5. store.file.dir(file模式文件存储文件夹名,默认sessionStore)
  6. =db
  7. 需要配置的属性
  8. store.db.datasource(db模式数据源类型 dbcpdruidhikari;无默认值,必须指定。)
  9. store.db.dbType(db模式数据库类型 mysqloracledb2sqlserversybaeeh2sqliteaccesspostgresqloceanbase;无默认值,必须指定。)
  10. store.db.driverClassName(db模式数据库驱动,必须指定)
  11. store.db.url(db模式数据库url,必须指定,在使用mysql作为数据源时,建议在连接参数中加上rewriteBatchedStatements=true)
  12. store.db.user(db模式数据库账户,必须指定)
  13. store.db.password(db模式数据库账户密码,必须指定)
  14. store.db.minConn db模式数据库初始连接数 默认1
  15. store.db.maxConn db模式数据库最大连接数 默认20
  16. store.db.maxWait db模式获取连接时最大等待时间 默认5000,单位毫秒
  17. store.db.globalTable db模式全局事务表名 默认global_table
  18. store.db.branchTable db模式分支事务表名 默认branch_table
  19. store.db.lockTable db模式全局锁表名 默认lock_table
  20. store.db.queryLimit db模式查询全局事务一次的最大条数 默认100
  21. =redis
  22. 需要配置的属性
  23. store.redis.host redis模式ip 默认127.0.0.1
  24. store.redis.port redis模式端口 默认6379
  25. store.redis.maxConn redis模式最大连接数 默认10
  26. store.redis.minConn redis模式最小连接数 默认1
  27. store.redis.database redis模式默认库 默认0
  28. store.redis.password redis模式密码(无可不填) 默认null
  29. store.redis.queryLimit redis模式一次查询最大条数 默认100

3、度量配置

  1. metrics.enabled 是否启用Metrics 默认false关闭,在False状态下,所有与Metrics相关的组件将不会被初始化,使得性能损耗最低
  2. metrics.registryType 指标注册器类型 Metrics使用的指标注册器类型,默认为内置的compact(简易)实现,这个实现中的Meter仅使用有限内存计数,性能高足够满足大多数场景;目前只能设置一个指标注册器实现
  3. metrics.exporterList 指标结果Measurement数据输出器列表 默认prometheus,多个输出器使用英文逗号分割,例如"prometheus,jmx",目前仅实现了对接prometheus的输出器
  4. metrics.exporterPrometheusPort prometheus输出器Client端口号 默认9898

3、客户端配置

1、数据源代理

  1. seata.enabled 是否开启spring-boot自动装配 truefalse,(SSBS)专有配置,默认true
  2. seata.enableAutoDataSourceProxy=true 是否开启数据源自动代理 truefalse,seata-spring-boot-starter(SSBS)专有配置,SSBS默认会开启数据源自动代理,可通过该配置项关闭.
  3. seata.useJdkProxy=false 是否使用JDK代理作为数据源自动代理的实现方式 truefalse,(SSBS)专有配置,默认false,采用CGLIB作为数据源自动代理的实现方式

2、事物分组的配置

  1. service.vgroupMapping.my_test_tx_group 事务群组 my_test_tx_group为分组,配置项值为TC集群名
  2. service.default.grouplist TC服务列表 仅注册中心为file时使用

3、分布式事务降级开关

  1. client.tm.degradeCheck 降级开关 默认false。业务侧根据连续错误数自动降级不走seata事务

4、校验或占用全局锁重试

  1. client.rm.lock.retryInterval 校验或占用全局锁重试间隔 默认10,单位毫秒
  2. client.rm.lock.retryTimes 校验或占用全局锁重试次数 默认30

5、一阶段全局结果上报次数

  1. client.tm.commitRetryCount 一阶段全局提交结果上报TC重试次数 默认1次,建议大于1
  2. client.tm.rollbackRetryCount 一阶段全局回滚结果上报TC重试次数 默认1次,建议大于1

五、参考文档

1、seata server 下载

2、Seata新手部署指南(1.4.0版本)

3、Seata 高可用部署

4、seata配置属性

seata整合nacos完成分布式的部署的更多相关文章

  1. seata整合多数据源

    seata整合多数据源 一.背景 二.整合步骤 1.seata server的搭建 2.引入数据源切换组件 3.引入seata组件 4.配置多数据源 5.关闭seata自己默认的数据源代理 6.配置s ...

  2. 【Spring Cloud & Alibaba全栈开源项目实战】:SpringBoot整合ELK实现分布式登录日志收集和统计

    一. 前言 其实早前就想计划出这篇文章,但是最近主要精力在完善微服务.系统权限设计.微信小程序和管理前端的功能,不过好在有群里小伙伴的一起帮忙反馈问题,基础版的功能已经差不多,也在此谢过,希望今后大家 ...

  3. Seata整合SpringBoot和Mybatis

    Seata整合SpringBoot和Mybatis 一.背景 二.实现功能 三.每个服务使用到的技术 1.账户服务 2.订单服务 四.服务实现 1.账户服务实现 1.引入jar包 2.项目配置 3.建 ...

  4. Spring Cloud Alibaba 整合 Nacos 实现服务配置中心

    在之前的文章 <Nacos 本地单机版部署步骤和使用> 中,大家应该了解了 Nacos 是什么?其中 Nacos 提供了动态配置服务功能 一.Nacos 动态配置服务是什么? 官方是这么说 ...

  5. ubuntu12.04+hadoop2.2.0+zookeeper3.4.5+hbase0.96.2+hive0.13.1伪分布式环境部署

    目录: 一.hadoop2.2.0.zookeeper3.4.5.hbase0.96.2.hive0.13.1都是什么? 二.这些软件在哪里下载? 三.如何安装 1.安装JDK 2.用parallel ...

  6. Spring Cloud 整合 nacos 实现动态配置中心

    上一篇文章讲解了Spring Cloud 整合 nacos 实现服务注册与发现,nacos除了有服务注册与发现的功能,还有提供动态配置服务的功能.本文主要讲解Spring Cloud 整合nacos实 ...

  7. quartz集群分布式(并发)部署解决方案-Spring

    项目中使用分布式并发部署定时任务,多台跨JVM,按照常理逻辑每个JVM的定时任务会各自运行,这样就会存在问题,多台分布式JVM机器的应用服务同时干活,一个是加重服务负担,另外一个是存在严重的逻辑问题, ...

  8. 3-3 Hadoop集群完全分布式配置部署

    Hadoop集群完全分布式配置部署 下面的部署步骤,除非说明是在哪个服务器上操作,否则默认为在所有服务器上都要操作.为了方便,使用root用户. 1.准备工作 1.1 centOS6服务器3台 手动指 ...

  9. Nacos系列:Nacos的三种部署模式

    三种部署模式 Nacos支持三种部署模式 1.单机模式:可用于测试和单机使用,生产环境切忌使用单机模式(满足不了高可用) 2.集群模式:可用于生产环境,确保高可用 3.多集群模式:可用于多数据中心场景 ...

随机推荐

  1. Xshell破~~解和SecureCRT破~~解办法,亲测可行

    解决办法很简单,那就是安装MobaXterm, 安装上即可使用,无需破击,免费,功能同样强大,不比xshell, SecureCRT功能差.它是集万千功能于一身的全能型终端神器. 听名字就不会太差,看 ...

  2. docker&flask快速构建服务接口(二)

    系列其他内容 docker快速创建轻量级的可移植的容器✓ docker&flask快速构建服务接口✓ docker&uwsgi高性能WSGI服务器生产部署必备 docker&g ...

  3. C#中的“等待窗体”对话框

    这篇文章向您展示了如何在c#.net Windows窗体应用程序中创建一个等待窗体对话框.创建一个新表单,然后输入您的表单名称为frmWaitForm.接下来,将Label,Progress Bar控 ...

  4. vue 熟悉项目结构 创建第一个自己的组件

    * vue开发环境搭建 * 项目入口文件 ./src/main.js // The Vue build version to load with the `import` command // (ru ...

  5. requests接口自动化-assert断言

    断言,自动判断接口返回的结果与预期结果是否一致 from common.get_mysql import * def test_assert(): a=0 b=1 # assert a,'断言失败打印 ...

  6. Appium Capability使用进阶

  7. python日志loguru

    文档:https://loguru.readthedocs.io/en/stable/overview.html#installation pip install loguru 使用 基本使用 ##终 ...

  8. virtualbox linux客户机中安装增强功能包缺少kernel头文件问题解决

    linux客户机中安装增强功能包总会提示缺少kernel头文件 根据发行版的不同,用命令行软件包管理命令安装dkms build-essential linux-headers-$(uname -r) ...

  9. UOJ#454-[UER #8]打雪仗【通信题】

    正题 题目链接:https://uoj.ac/problem/454 题目大意 \(Alice\)有一个长度为\(2n\)的\(01\)串,\(Bob\)有\(n\)个在\([1,2n]\)位置的下标 ...

  10. P6122-[NEERC2016]Mole Tunnels【模拟费用流】

    正题 题目链接:https://www.luogu.com.cn/problem/P6122 题目大意 给出\(n\)个点的一棵满二叉树,每个点有容量\(c_i\),\(m\)次从\(p_i\)处加一 ...