redis系列整体栏目
内容 | 链接地址 |
---|---|
【一】分布式事务之2pc两阶段提交 | https://zhenghuisheng.blog.csdn.net/article/details/142406325 |
【一】分布式事务seata的安装下载与环境搭建 | https://zhenghuisheng.blog.csdn.net/article/details/142893117 |
分布式事务seata的安装下载与环境搭建
- 一,分布式事务seata的安装下载与环境搭建
- 1,seata安装
- 2,nacos实现配置中心
- 3,seata启动运行
一,分布式事务seata的安装下载与环境搭建
在前一篇文章中,讲解了两阶段提交的底层原理,在所有的分布式事务中,其核心思想都是通过两阶段提交作为基本理念实现的。在本文中,讲解的就是一个通过2pc两阶段提交的实现的seata,他是阿里开源的一个分布式事务的框架,解决了2pc两阶段提交所带来的缺陷。
在学习seata之前,可以先看一下的中文官网:https://seata.apache.org/zh-cn/
1,seata安装
接下来先讲解一下seata的安装,先在官网下载安装包:https://seata.apache.org/unversioned/release-history/seata-server ,这里用的是seata的历史版本1.7版本,直接下来1.7.1.zip包即可
下载后解压目录如下
在/script/server/db 目录下,选择mysql.sql,然后将里面的sql脚本执行导入到mysql数据库
随后会产生4张表,分别是分支表、分布式锁表、全局表和本地事务锁表
2,nacos实现配置中心
上一篇讲解了2pc两阶段提交 ,主要有TM事务管理器和RM资源管理器,在seata分布式事务中,引入了一个新组件TC事务协调器,TM和RM都是处于服务内部本身,TC抽取出来单独部署
因此为了TC和其他两种之间的通信,可以直接通过nacos作为配置中心和注册中心,这样将微服务中的组件和TC组件信息全部注册到nacos,从而实现微服务与TC服务之间的通信和管理
接下来就是在nacos中配置seata的配置信息,首先新建一个配置中心,DATAID取名为seataServer.properties ,Group取名为SEATA_GROUP
配置内容为安装目录下的/script/config-center文件夹下的config.txt文件中的内容
其主要内容如下,值得注意的是,需要修改mysql的连接、用户名和密码。tore.mode需要修改设置成db
#For details about configuration items, see https://seata.io/zh-cn/docs/user/configurations.html
#Transport configuration, for client and server
transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableTmClientBatchSendRequest=false
transport.enableRmClientBatchSendRequest=true
transport.enableTcServerBatchSendResponse=false
transport.rpcRmRequestTimeout=30000
transport.rpcTmRequestTimeout=30000
transport.rpcTcRequestTimeout=30000
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
transport.serialization=seata
transport.compressor=none
#Transaction routing rules configuration, only for the client
service.vgroupMapping.default_tx_group=default
#If you use a registry, you can ignore it
service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false
#Transaction rule configuration, only for the client
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=true
client.rm.tableMetaCheckerInterval=60000
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.rm.sagaJsonParser=fastjson
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
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
#For TCC transaction mode
tcc.fence.logTableName=tcc_fence_log
tcc.fence.cleanPeriod=1h
#Log rule configuration, for client and server
log.exceptionRate=100
#Transaction storage configuration, only for the server. The file, db, and redis configuration values are optional.
store.mode=db
store.lock.mode=db
store.session.mode=db
#Used for password encryption
store.publicKey=
#If `store.mode,store.lock.mode,store.session.mode` are not equal to `file`, you can remove the configuration block.
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
#These configurations are required if the `store mode` is `db`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `db`, you can remove the configuration block.
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=root
store.db.password=zhs123456
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
#These configurations are required if the `store mode` is `redis`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `redis`, you can remove the configuration block.
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
#Transaction rule configuration, only for the server
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
server.xaerNotaRetryTimeout=60000
server.session.branchAsyncQueueSize=5000
server.session.enableBranchAsyncRemove=false
server.enableParallelRequestHandle=false
#Metrics configuration, only for the server
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898
与源文件对比,主要要修改的就是这几个地方,分别是3个mode,还有一个就是mysql版本,如果时8那驱动需要加一个cj,然后就是修改数据库的用户名和密码
store.mode=db
store.lock.mode=db
store.session.mode=db
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=root
store.db.password=zhs123456
保存配置之后,可以直接在配置中心中查看到相关配置
随后打开安装目录下的conf文件夹,修改下面的 application.yml 配置文件,主要就是将当前服务注册到nacos中,实现服务注册功能,同时需要修改配置中心的内容,需要将当前服务加入到配置中心里面
seata:
config:
# support: nacos, consul, apollo, zk, etcd3
type: nacos
nacos:
server-addr: 127.0.0.1:8848
namespace: 7e838c12-8554-4231-82d5-6d93573ddf32
group: SEATA_GROUP
data-id: seataServer.properties
registry:
# support: nacos, eureka, redis, zk, consul, etcd3, sofa
type: nacos
nacos:
application: seata-server
server-addr: 127.0.0.1:8848
group: SEATA_GROUP
cluster: default
store:
# support: file 、 db 、 redis
mode: db
3,seata启动运行
切换到安装目录下的bin目录,由于我直接安装在windows上面,因此直接执行bat命令即可
执行完命令之后,可以发现seata已经启动成功,其本质就是一个jvm进程,如果启动失败就调整最小堆内存和最大堆内存空间
在成功启动这个seata之后,可以在nacos中发现当前服务已经注册成功,分组名称服务名称就是配置文件中设置的
随后打开seata可视化界面,账户名和密码都是 seata
localhost:7091
可以看到内部的可视化界面如下,里面包含了一些事务信息和全局锁信息等
到此seata基于mysql和nacos的分布式事务都搭建完毕!