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
View Code

  7:启动seata

   ./seata-server.sh -h 127.0.0.1 -p 8091 -m db  &

  

  

  

posted @ 2022-08-04 11:48  低调小雄  阅读(566)  评论(0编辑  收藏  举报