Centos7 安装Seata,注册中心选择nocas
前言
1.什么是分布式事务,分布式事务包含哪些角色
分布式事务主要包含,事务参与者,事务管理者,资源服务器三个角色。分布式事务是指着三个角色分别位于不同的分布式系统的不同节点之上。简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。
2.分布式事务主要的实现方式:XA协议(包含2PC和3PC),TCC协议
2PC方式:2PC是非常经典的强一致、中心化的原子提交协议,协议中定义了两类节点:一个中心化协调者节点和多个参与者节点。2PC分为两个阶段:准备阶段(PreCommit),提交阶段(do Commit)。
准备阶段:事务协调者向所有事务参与者发送事务内容,询问是否可以提交事务。所有事务参与者,执行事务操作,并将Undo和Redo记录在事务日志中,但不提交事务。
提交阶段:所有事务参与者向事务协调者反馈结果,
如果反馈都为Yes,协调者向所有参与者发送Commit请求,参与者执行Commit操作,并释放资源。各参与者向协调者回馈ACK完成的消息,协调者收到所有参与者反馈的Ack消息后,即完成事务提交。
如果任何一个参与者反馈为NO,协调者向所有参与者发送Rollback请求,参与者执行阶段1中的Undo信息。并释放资源。各参与者向协调者回馈ACK完成的消息,协调者收到所有参与者反馈的Ack消息后,即完成事务中断。
3PC方式:3PC方式时2PC方式的改进版本。在2PC方式中增加了canCommit阶段。并设置了超时机制
canCommit阶段:事务协调者向所有参与者询问是否可以提交事务。
preCommit阶段:canCommit阶段所有参与者都返回yes的情况,进行预提交事务,任何一方返回No终端事务。
doCommit阶段:preCommit阶段都返回yes则提交事务,任何一方返回No或者超时,执行Undo操作。
TCC方式(事务补偿协议):TCC将事务分为三个步骤,Try->Commit->Cancel
1、Try:预留业务资源/数据效验
2、Confirm:确认执行业务操作
3、Cancel:取消执行业务操作
3.主流的分布式事务
seata
seata分布式事务的实现方式:
1.XA方式:包含2PC和3PC
2.AT模式(Auto Trasaction):对代码无入侵,seata自动生成事务preCommit中的redo和undo操作。操作简单,
不足指出,如果对共享数据进行操作,会存在脏写的情况。
什么是脏写:所谓脏写,就是我刚才明明写了一个数据值,结果过了一会却没了。而它的本质就是事务 B 去修改了事务 A 修改过的值,但是此时事务 A 还没提交,所以事务 A 随时会回滚,导致事务 B 修改的值也没了,这就是脏写的定义。
3.TCC模式:
4.SAGA模式:
总结:
AT 模式是无侵入的分布式事务解决方案,适用于不希望对业务进行改造的场景,几乎0学习成本。
TCC 模式是高性能分布式事务解决方案,适用于核心系统等对性能有很高要求的场景。
Saga 模式是长事务解决方案,适用于业务流程长且需要保证事务最终一致性的业务系统,Saga 模式一阶段就会提交本地事务,无锁,长流程情况下可以保 证性能,多用于渠道层、集成层业务系统。事务参与者可能是其它公司的服务或者是遗留系统的服务,无法进行改造和提供 TCC 要求的接口,也可以使用 Saga 模式。
XA模式是分布式强一致性的解决方案,但性能低而使用较少。
seata服务器的安装部署:
1:下载seata,
官网下载地址:http://seata.io/zh-cn/blog/download.html
gitHub下载地址:https://github.com/seata/seata/releases
2:配置Java环境 ,https://www.cnblogs.com/hisunhyx/p/14925939.html
3:新建mysql seata库,并建立seata用户,授权。将安装包中的sql导入执行,创建初始表。
-- 创建数据库study_db create database if not exists seata_db; -- 创建用户 %表示允许所有IP访问 localhost表示只允许本机访问 create user 'seata'@'%' IDENTIFIED with mysql_native_password by 'seata'; -- 授权 grant all PRIVILEGES on seata_db.* to 'seata'@'%'; flush privileges;
https://github.com/seata/seata/blob/1.4.2/script/server/db/mysql.sql
导入数据表结构初始化脚本。
4:安装nacos环境。
5:修稿Seataserver的配置文件registry.conf
修改 regist和config的type为nacos,并完成nacos的相关配置。
6:在nacos中配置相关的config信息,配置的dataid和namespace等信息需要和步骤5的保持一致
参考地址:https://github.com/seata/seata/blob/develop/script/config-center/config.txt
transport.type=TCP transport.server=NIO transport.heartbeat=true transport.enableClientBatchSendRequest=false 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.merchant-group=default service.vgroupMapping.public-moudle-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.tm.commitRetryCount=5 client.tm.rollbackRetryCount=5 client.tm.defaultGlobalTransactionTimeout=60000 client.tm.degradeCheck=false client.tm.degradeCheckAllowTimes=10 client.tm.degradeCheckPeriod=2000 store.mode=db 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://192.168.30.199:3306/seata_db?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false store.db.user=seata store.db.password=seata store.db.minConn=5 store.db.maxConn=30 store.db.globalTable=global_table store.db.branchTable=branch_table 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 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
7:启动seata
./seata-server.sh -h 127.0.0.1 -p 8091 -m db &