一、背景
最近在学习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
下载解压:
# 下载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_table
、branch_table
、lock_table
和distributed_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.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日志保留天数
# 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配置属性