一、背景
最近在学习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 2
seata
└── 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.conf
registry {
# 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.conf
config {
# 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 data
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 = utf8;
-- 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 = utf8;
-- 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 = 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=default
service.vgroupMapping.product-service=hangzhou
service.vgroupMapping.order-service=hangzhou
# 指定存储模式为db
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://10.1.168.152:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=root
store.db.password=root
3、残缺的配置
transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableClientBatchSendRequest=true
transport.threadFactory.bossThreadPrefix=NettyBoss
transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
transport.threadFactory.shareBossWorker=false
transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
transport.threadFactory.clientSelectorThreadSize=1
transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
transport.threadFactory.bossThreadSize=1
transport.threadFactory.workerThreadSize=default
transport.shutdown.wait=3
service.vgroupMapping.my_test_tx_group=default
service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false
client.rm.asyncCommitBufferLimit=10000
client.rm.lock.retryInterval=10
client.rm.lock.retryTimes=30
client.rm.lock.retryPolicyBranchRollbackOnConflict=true
client.rm.reportRetryCount=5
client.rm.tableMetaCheckEnable=false
client.rm.tableMetaCheckerInterval=60000
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.rm.tccActionInterceptorOrder=-2147482648
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.defaultGlobalTransactionTimeout=60000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000
client.tm.interceptorOrder=-2147482648
store.mode=db
store.lock.mode=file
store.session.mode=file
store.publicKey=
store.file.dir=file_store/data
store.file.maxBranchSessionSize=16384
store.file.maxGlobalSessionSize=512
store.file.fileWriteBufferCacheSize=16384
store.file.flushDiskMode=async
store.file.sessionReloadReadSize=100
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://10.1.168.152:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=root
store.db.password=root
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.distributedLockTable=distributed_lock
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
store.redis.mode=single
store.redis.single.host=127.0.0.1
store.redis.single.port=6379
store.redis.sentinel.masterName=
store.redis.sentinel.sentinelHosts=
store.redis.maxConn=10
store.redis.minConn=1
store.redis.maxTotal=100
store.redis.database=0
store.redis.password=
store.redis.queryLimit=100
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
server.distributedLockExpireTime=10000
client.undo.dataValidation=true
client.undo.logSerialization=jackson
client.undo.onlyCareUpdateColumns=true
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
client.undo.logTable=undo_log
client.undo.compress.enable=true
client.undo.compress.type=zip
client.undo.compress.threshold=64k
log.exceptionRate=100
transport.serialization=seata
transport.compressor=none
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.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)专有配置,默认true
seata.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次,倡议大于1
client.tm.rollbackRetryCount 一阶段全局回滚后果上报TC重试次数 默认1次,倡议大于1
五、参考文档
1、seata server 下载
2、Seata老手部署指南(1.4.0版本)
3、Seata 高可用部署
4、seata配置属性
发表回复