一、背景

最近在学习Seata,此处简略记录一下Seata Server的分布式部署,其中的注册核心和配置核心应用nacos来实现,默认的file形式无奈实现分布式部署。其中 nocos和mysql默认认为在机器上曾经部署好了。

二、部署机器

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

三、部署步骤

1、在seata上创立命名空间

在nacos上创立seata的命名空间,须要记住的是 命名空间的id ,这个值在前期须要用到。

2、下载对应版本的seata

下载解压:

# 下载wget https://github.com/seata/seata/releases/download/v1.4.2/seata-server-1.4.2.zip# 解压unzip seata-server-1.4.2.zip# 查看 seata 目录构造tree seata -L 2seata└── seata-server-1.4.2    ├── LICENSE    ├── bin    ├── conf  (次要批改registry.conf配置文件)    ├── lib    └── logs

3、单机启动

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

1、批改seata配置文件

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

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

1、批改注册核心为nacos

vi conf/registry.confregistry {  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa  type = "nacos"  nacos {      # 注册到nacos上的服务名    application = "seata-server"    # nacos的地址    serverAddr = "10.1.168.152:8847"    # nacos上的分组    group = "SEATA_GROUP"    # 命名空间,为上一步创立的    namespace = "774a5264-662f-4e27-a885-8d0783e5f26a"    # 集群,这个是事物分组的时候须要用到    cluster = "default"    # nacos的用户名和明码    username = "nacos"    password = "nacos"  }}

2、批改配置核心为nacos

vi conf/registry.confconfig {  # file、nacos 、apollo、zk、consul、etcd3  type = "nacos"  nacos {    serverAddr = "10.1.168.152:8848"    namespace = "774a5264-662f-4e27-a885-8d0783e5f26a"    group = "SEATA_GROUP"    username = "nacos"    password = "nacos"    # 此处的这个 dataId 的值,须要在nacos上创立,前期须要导入配置到这个命名空间中    dataId = "seataServer.properties"  }}

2、导入配置到nacos中

数据的存储模式应用 db,也能够应用redis,应用db须要创立4张表global_tablebranch_tablelock_tabledistributed_lock

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

建表语句为 https://github.com/seata/seat...

-- -------------------------------- The script used when storeMode is 'db' ---------------------------------- the table to store GlobalSession dataCREATE 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 = utf8;-- the table to store BranchSession dataCREATE 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 = utf8;-- the table to store lock dataCREATE 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 = utf8;CREATE TABLE IF NOT EXISTS `distributed_lock`(    `lock_key`       CHAR(20) NOT NULL,    `lock_value`     VARCHAR(20) NOT NULL,    `expire`         BIGINT,    primary key (`lock_key`)) ENGINE = InnoDB  DEFAULT CHARSET = utf8mb4;INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);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,因而须要配置数据库连贯信息,指定的数据库须要存在 上一步 创立的表。
  • 此处配置了多个分组,也指定了多个集群

# 这个中央的事物分组能够配置多个,多个配置多行 service.vgroupMapping.my_test_tx_group=defaultservice.vgroupMapping.product-service=hangzhouservice.vgroupMapping.order-service=hangzhou# 指定存储模式为dbstore.mode=dbstore.db.datasource=druidstore.db.dbType=mysqlstore.db.driverClassName=com.mysql.jdbc.Driverstore.db.url=jdbc:mysql://10.1.168.152:3306/seata?useUnicode=true&rewriteBatchedStatements=truestore.db.user=rootstore.db.password=root

3、残缺的配置

transport.type=TCPtransport.server=NIOtransport.heartbeat=truetransport.enableClientBatchSendRequest=truetransport.threadFactory.bossThreadPrefix=NettyBosstransport.threadFactory.workerThreadPrefix=NettyServerNIOWorkertransport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandlertransport.threadFactory.shareBossWorker=falsetransport.threadFactory.clientSelectorThreadPrefix=NettyClientSelectortransport.threadFactory.clientSelectorThreadSize=1transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThreadtransport.threadFactory.bossThreadSize=1transport.threadFactory.workerThreadSize=defaulttransport.shutdown.wait=3service.vgroupMapping.my_test_tx_group=defaultservice.default.grouplist=127.0.0.1:8091service.enableDegrade=falseservice.disableGlobalTransaction=falseclient.rm.asyncCommitBufferLimit=10000client.rm.lock.retryInterval=10client.rm.lock.retryTimes=30client.rm.lock.retryPolicyBranchRollbackOnConflict=trueclient.rm.reportRetryCount=5client.rm.tableMetaCheckEnable=falseclient.rm.tableMetaCheckerInterval=60000client.rm.sqlParserType=druidclient.rm.reportSuccessEnable=falseclient.rm.sagaBranchRegisterEnable=falseclient.rm.tccActionInterceptorOrder=-2147482648client.tm.commitRetryCount=5client.tm.rollbackRetryCount=5client.tm.defaultGlobalTransactionTimeout=60000client.tm.degradeCheck=falseclient.tm.degradeCheckAllowTimes=10client.tm.degradeCheckPeriod=2000client.tm.interceptorOrder=-2147482648store.mode=dbstore.lock.mode=filestore.session.mode=filestore.publicKey=store.file.dir=file_store/datastore.file.maxBranchSessionSize=16384store.file.maxGlobalSessionSize=512store.file.fileWriteBufferCacheSize=16384store.file.flushDiskMode=asyncstore.file.sessionReloadReadSize=100store.db.datasource=druidstore.db.dbType=mysqlstore.db.driverClassName=com.mysql.jdbc.Driverstore.db.url=jdbc:mysql://10.1.168.152:3306/seata?useUnicode=true&rewriteBatchedStatements=truestore.db.user=rootstore.db.password=rootstore.db.minConn=5store.db.maxConn=30store.db.globalTable=global_tablestore.db.branchTable=branch_tablestore.db.distributedLockTable=distributed_lockstore.db.queryLimit=100store.db.lockTable=lock_tablestore.db.maxWait=5000store.redis.mode=singlestore.redis.single.host=127.0.0.1store.redis.single.port=6379store.redis.sentinel.masterName=store.redis.sentinel.sentinelHosts=store.redis.maxConn=10store.redis.minConn=1store.redis.maxTotal=100store.redis.database=0store.redis.password=store.redis.queryLimit=100server.recovery.committingRetryPeriod=1000server.recovery.asynCommittingRetryPeriod=1000server.recovery.rollbackingRetryPeriod=1000server.recovery.timeoutRetryPeriod=1000server.maxCommitRetryTimeout=-1server.maxRollbackRetryTimeout=-1server.rollbackRetryTimeoutUnlockEnable=falseserver.distributedLockExpireTime=10000client.undo.dataValidation=trueclient.undo.logSerialization=jacksonclient.undo.onlyCareUpdateColumns=trueserver.undo.logSaveDays=7server.undo.logDeletePeriod=86400000client.undo.logTable=undo_logclient.undo.compress.enable=trueclient.undo.compress.type=zipclient.undo.compress.threshold=64klog.exceptionRate=100transport.serialization=seatatransport.compressor=nonemetrics.enabled=falsemetrics.registryType=compactmetrics.exporterList=prometheusmetrics.exporterPrometheusPort=9898

4、导入到nacos中

3、启动seata server

./seata-server.sh -h 192.168.56.101 -p 8091 -n 1
 -h: 注册到注册核心的ip -p: Server rpc 监听端口 -m: 全局事务会话信息存储模式,file、db、redis,优先读取启动参数 (Seata-Server 1.3及以上版本反对redis) -n: Server node,多个Server时,需辨别各自节点,用于生成不同区间的transactionId,免得抵触 -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、将 192.168.56.101 的seata 配置拷贝到102和103上scp -r /home/appuser/opt/seata/ appuser@192.168.56.102:/home/appuser/opt/scp -r /home/appuser/opt/seata/ appuser@192.168.56.103:/home/appuser/opt/

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

顺次启动3台机器的seata server

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

2、查看seata server列表

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

# 防火墙放行 8091 端口firewall-cmd --zone=public --add-port=8091/tcp --permanent# 从新加载防火墙配置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.grouplistTC服务列表 仅注册核心为file时应用
store.db.url数据库连贯urlservice.disableGlobalTransaction是否开启全局事务
store.db.user数据库用户名client.rm.lock.retryInterval校验或占用全局锁重试距离 默认10,单位毫秒
store.db.password数据库明码client.rm.lock.retryTimes校验或占用全局锁重试次数 默认30
#store.mode=redis 须要以下配置
store.redis.hostredis地址
store.redis.portredis端口
store.redis.databaseredis数据库,默认是0
store.redis.passwordredis明码,没有不填写

2、服务端配置

1、undo日志保留天数

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

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

# 事务会话信息存储形式,file本地文件(不反对HA),db数据库|redis(反对HA)store.mode    =file        须要配置的属性            store.file.dir(file模式文件存储文件夹名,默认sessionStore)  =db      须要配置的属性          store.db.datasource(db模式数据源类型    dbcp、druid、hikari;无默认值,必须指定。)          store.db.dbType(db模式数据库类型    mysql、oracle、db2、sqlserver、sybaee、h2、sqlite、access、postgresql、oceanbase;无默认值,必须指定。)          store.db.driverClassName(db模式数据库驱动,必须指定)          store.db.url(db模式数据库url,必须指定,在应用mysql作为数据源时,倡议在连贯参数中加上rewriteBatchedStatements=true)          store.db.user(db模式数据库账户,必须指定)          store.db.password(db模式数据库账户明码,必须指定)              store.db.minConn    db模式数据库初始连接数    默认1      store.db.maxConn    db模式数据库最大连接数    默认20      store.db.maxWait    db模式获取连贯时最大等待时间    默认5000,单位毫秒      store.db.globalTable    db模式全局事务表名    默认global_table      store.db.branchTable    db模式分支事务表名    默认branch_table      store.db.lockTable    db模式全局锁表名    默认lock_table      store.db.queryLimit    db模式查问全局事务一次的最大条数    默认100  =redis      须要配置的属性          store.redis.host    redis模式ip    默认127.0.0.1      store.redis.port    redis模式端口    默认6379      store.redis.maxConn    redis模式最大连接数    默认10      store.redis.minConn    redis模式最小连接数    默认1      store.redis.database    redis模式默认库    默认0      store.redis.password    redis模式明码(无可不填)    默认null      store.redis.queryLimit    redis模式一次查问最大条数    默认100            

3、度量配置

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

3、客户端配置

1、数据源代理

seata.enabled    是否开启spring-boot主动拆卸    true、false,(SSBS)专有配置,默认trueseata.enableAutoDataSourceProxy=true    是否开启数据源主动代理    true、false,seata-spring-boot-starter(SSBS)专有配置,SSBS默认会开启数据源主动代理,可通过该配置项敞开.seata.useJdkProxy=false    是否应用JDK代理作为数据源主动代理的实现形式    true、false,(SSBS)专有配置,默认false,采纳CGLIB作为数据源主动代理的实现形式

2、事物分组的配置

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

3、分布式事务降级开关

client.tm.degradeCheck    降级开关    默认false。业务侧依据间断谬误数主动降级不走seata事务

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

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

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

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

五、参考文档

1、seata server 下载

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

3、Seata 高可用部署

4、seata配置属性