Seata-Seata的高可用异地容灾架构搭建

1.模拟异地容灾的TC集群
计划启动两台seata的tc服务节点,分别代表上海和杭州集群:

| 节点名称  | ip地址(具体IP) | 端口号  | 集群名称 |
| -------- | ------------- | ------ | -------- |
| seata    | 192.168.8.118 | 8091   | SH       |
| seata2   | 192.168.8.118 | 8092   | HZ       |

之前我们已经启动了一台seata服务,端口是8091,集群名为SH(注:192.168.8.118用tajia-nacos替代,在host配置)。

现在,将seata目录复制一份,起名为seata-server-2,代表杭州集群

修改seata-server-2/conf/registry.conf内容如下:

registry {
  # tc服务的注册中心类,这里选择nacos,也可以是eureka、zookeeper等
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "nacos"
 
  nacos {
    application = "seata-tc-server"
    serverAddr = "tajia-nacos:8848"
    group = "SEATA_GROUP"
    namespace = ""
    cluster = "HZ"
    username = "nacos"
    password = "nacos"
  }  
}

config {
  # 读取tc服务端的配置文件的方式,这里是从nacos配置中心读取,这样如果tc是集群,可以共享配置
  # file、nacos 、apollo、zk、consul、etcd3
  type = "nacos"
  # 配置nacos地址等信息
  nacos {
    serverAddr = "tajia-nacos:8848"
    namespace = ""
    group = "SEATA_GROUP"
    username = "nacos"
    password = "nacos"
    dataId = "seataServer.properties"
  }
}

 

进入seata2/bin目录,然后运行命令:

D:/dev/seata-server-2/bin/seata-server.bat -p 8092

 

打开nacos控制台,查看服务列表:

点进详情查看:

 

2.将事务组映射配置到nacos
接下来,我们需要将tx-service-group与cluster的映射关系都配置到nacos配置中心。

 

配置的内容如下(client.properties):

# 事务组映射关系SH、HZ
service.vgroupMapping.seata-demo=SH

service.enableDegrade=false
service.disableGlobalTransaction=false
# 与TC服务的通信配置
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
# RM配置
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
# TM配置
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.defaultGlobalTransactionTimeout=60000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000

# undo日志配置
client.undo.dataValidation=true
client.undo.logSerialization=jackson
client.undo.onlyCareUpdateColumns=true
client.undo.logTable=undo_log
client.undo.compress.enable=true
client.undo.compress.type=zip
client.undo.compress.threshold=64k
client.log.exceptionRate=100
View Code

 

3.微服务读取nacos配置
接下来,需要修改每一个微服务的application.yml文件,让微服务读取nacos中的client.properties文件:

seata:
  config:
    type: nacos
    nacos:
      server-addr: tajia-nacos:8848
      username: nacos
      password: nacos
      group: SEATA_GROUP
      data-id: client.properties


seata完整配置如下:

seata:
  registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
    # 参考tc服务自己的registry.conf中的配置
    type: nacos
    nacos: # tc
      server-addr: tajia-nacos:8848
      namespace: ""
      group: SEATA_GROUP
      application: seata-tc-server # tc服务在nacos中的服务名称
  tx-service-group: seata-demo # 事务组,根据这个获取tc服务的cluster名称
  #service:
  #  vgroup-mapping: # 事务组与TC服务cluster的映射关系
  #    seata-demo: SH
  config:
    type: nacos
    nacos:
      server-addr: tajia-nacos:8848
      username: nacos
      password: nacos
      group: SEATA_GROUP
      data-id: client.properties

 

重启微服务,现在微服务到底是连接tc的SH集群,还是tc的HZ集群,统一由nacos的client.properties来决定。

nacos配置的service.vgroupMapping.seata-demo是SH集群,此时观察微服务和seata-server控制台的日志信息,切换service.vgroupMapping.seata-demo,微服务和seata-server控制台是否也跟着变化。

storage-service、account-service、order-service控制台日志已连接到8091:

10-14 16:32:10:625 INFO 10816 --- [eoutChecker_1_1] i.s.c.r.netty.NettyClientChannelManager : will connect to 192.168.8.118:8091
10-14 16:32:10:628 INFO 10816 --- [eoutChecker_1_1] i.s.core.rpc.netty.NettyPoolableFactory : NettyPool create channel to transactionRole:TMROLE,address:192.168.8.118:8091,msg:< RegisterTMRequest{applicationId='account-service', transactionServiceGroup='seata-demo'} >
10-14 16:32:10:649 INFO 10816 --- [eoutChecker_1_1] i.s.c.rpc.netty.TmNettyRemotingClient : register TM success. client version:1.4.2, server version:1.4.2,channel:[id: 0xa0e148c9, L:/192.168.8.118:65201 - R:/192.168.8.118:8091]
10-14 16:32:10:649 INFO 10816 --- [eoutChecker_1_1] i.s.core.rpc.netty.NettyPoolableFactory : register success, cost 12 ms, version:1.4.2,role:TMROLE,channel:[id: 0xa0e148c9, L:/192.168.8.118:65201 - R:/192.168.8.118:8091]


端口8091的seata-server打印如下信息:

16:32:10.646 INFO --- [ttyServerNIOWorker_1_4_32] i.s.c.r.processor.server.RegTmProcessor : TM register success,message:RegisterTMRequest{applicationId='account-service', transactionServiceGroup='seata-demo'},channel:[id: 0x27316e88, L:/192.168.8.118:8091 - R:/192.168.8.118:65201],client version:1.4.2
16:32:14.902 INFO --- [ttyServerNIOWorker_1_5_32] i.s.c.r.processor.server.RegTmProcessor : TM register success,message:RegisterTMRequest{applicationId='storage-service', transactionServiceGroup='seata-demo'},channel:[id: 0xcf3862b2, L:/192.168.8.118:8091 - R:/192.168.8.118:65206],client version:1.4.2
16:32:55.114 INFO --- [ttyServerNIOWorker_1_6_32] i.s.c.r.processor.server.RegTmProcessor : TM register success,message:RegisterTMRequest{applicationId='order-service', transactionServiceGroup='seata-demo'},channel:[id: 0x137960bb, L:/192.168.8.118:8091 - R:/192.168.8.118:65248],client version:1.4.2

编辑nacos的client.properties配置文件,把service.vgroupMapping.seata-demo设置为HZ,微服务和seata-server控制台是否连接到8092这台seata-server。

storage-service、account-service、order-service控制台日志已连接到8092:

10-14 16:32:10:625 INFO 10816 --- [eoutChecker_1_1] i.s.c.r.netty.NettyClientChannelManager : will connect to 192.168.8.118:8091
10-14 16:32:10:628 INFO 10816 --- [eoutChecker_1_1] i.s.core.rpc.netty.NettyPoolableFactory : NettyPool create channel to transactionRole:TMROLE,address:192.168.8.118:8091,msg:< RegisterTMRequest{applicationId='account-service', transactionServiceGroup='seata-demo'} >
10-14 16:32:10:649 INFO 10816 --- [eoutChecker_1_1] i.s.c.rpc.netty.TmNettyRemotingClient : register TM success. client version:1.4.2, server version:1.4.2,channel:[id: 0xa0e148c9, L:/192.168.8.118:65201 - R:/192.168.8.118:8091]
10-14 16:32:10:649 INFO 10816 --- [eoutChecker_1_1] i.s.core.rpc.netty.NettyPoolableFactory : register success, cost 12 ms, version:1.4.2,role:TMROLE,channel:[id: 0xa0e148c9, L:/192.168.8.118:65201 - R:/192.168.8.118:8091]
10-14 16:33:27:778 INFO 10816 --- [h_RMROLE_1_1_32] i.s.c.r.p.client.RmUndoLogProcessor : rm handle undo log process:UndoLogDeleteRequest{resourceId='deduct', saveDays=7, branchType=AT}
10-14 16:33:27:778 WARN 10816 --- [h_RMROLE_1_1_32] io.seata.rm.RMHandlerAT : Failed to get dataSourceProxy for delete undolog on deduct
10-14 16:45:30:628 INFO 10816 --- [eoutChecker_1_1] i.s.c.r.netty.NettyClientChannelManager : will connect to 192.168.8.118:8092
10-14 16:45:30:629 INFO 10816 --- [eoutChecker_1_1] i.s.core.rpc.netty.NettyPoolableFactory : NettyPool create channel to transactionRole:TMROLE,address:192.168.8.118:8092,msg:< RegisterTMRequest{applicationId='account-service', transactionServiceGroup='seata-demo'} >
10-14 16:45:30:636 INFO 10816 --- [eoutChecker_1_1] i.s.c.rpc.netty.TmNettyRemotingClient : register TM success. client version:1.4.2, server version:1.4.2,channel:[id: 0x5c2d7ddb, L:/192.168.8.118:59674 - R:/192.168.8.118:8092]
10-14 16:45:30:636 INFO 10816 --- [eoutChecker_1_1] i.s.core.rpc.netty.NettyPoolableFactory : register success, cost 5 ms, version:1.4.2,role:TMROLE,channel:[id: 0x5c2d7ddb, L:/192.168.8.118:59674 - R:/192.168.8.118:8092]
10-14 16:45:30:683 INFO 10816 --- [eoutChecker_2_1] i.s.c.r.netty.NettyClientChannelManager : will connect to 192.168.8.118:8092
10-14 16:45:30:683 INFO 10816 --- [eoutChecker_2_1] i.s.c.rpc.netty.RmNettyRemotingClient : RM will register :deduct,jdbc:mysql://tajia-mysql:33064/seata_demo
10-14 16:45:30:684 INFO 10816 --- [eoutChecker_2_1] i.s.core.rpc.netty.NettyPoolableFactory : NettyPool create channel to transactionRole:RMROLE,address:192.168.8.118:8092,msg:< RegisterRMRequest{resourceIds='deduct,jdbc:mysql://tajia-mysql:33064/seata_demo', applicationId='account-service', transactionServiceGroup='seata-demo'} >
10-14 16:45:30:697 INFO 10816 --- [eoutChecker_2_1] i.s.c.rpc.netty.RmNettyRemotingClient : register RM success. client version:1.4.2, server version:1.4.2,channel:[id: 0x82653d6a, L:/192.168.8.118:59675 - R:/192.168.8.118:8092]
10-14 16:45:30:698 INFO 10816 --- [eoutChecker_2_1] i.s.core.rpc.netty.NettyPoolableFactory : register success, cost 7 ms, version:1.4.2,role:RMROLE,channel:[id: 0x82653d6a, L:/192.168.8.118:59675 - R:/192.168.8.118:8092]

 

端口8092的seata-server打印如下信息:

16:30:31.541 INFO --- [ main] i.s.core.rpc.netty.NettyServerBootstrap : Server started, listen port: 8092
16:45:24.980 INFO --- [ttyServerNIOWorker_1_1_32] i.s.c.r.processor.server.RegTmProcessor : TM register success,message:RegisterTMRequest{applicationId='storage-service', transactionServiceGroup='seata-demo'},channel:[id: 0x4e4ca573, L:/192.168.8.118:8092 - R:/192.168.8.118:59664],client version:1.4.2
16:45:24.977 INFO --- [rverHandlerThread_1_1_500] i.s.c.r.processor.server.RegRmProcessor : RM register success,message:RegisterRMRequest{resourceIds='jdbc:mysql://tajia-mysql:33064/seata_demo', applicationId='storage-service', transactionServiceGroup='seata-demo'},channel:[id: 0x18202467, L:/192.168.8.118:8092 - R:/192.168.8.118:59665],client version:1.4.2
16:45:25.112 INFO --- [ttyServerNIOWorker_1_3_32] i.s.c.r.processor.server.RegTmProcessor : TM register success,message:RegisterTMRequest{applicationId='order-service', transactionServiceGroup='seata-demo'},channel:[id: 0x17661c36, L:/192.168.8.118:8092 - R:/192.168.8.118:59667],client version:1.4.2
16:45:25.177 INFO --- [rverHandlerThread_1_2_500] i.s.c.r.processor.server.RegRmProcessor : RM register success,message:RegisterRMRequest{resourceIds='jdbc:mysql://tajia-mysql:33064/seata_demo', applicationId='order-service', transactionServiceGroup='seata-demo'},channel:[id: 0x9a0e8269, L:/192.168.8.118:8092 - R:/192.168.8.118:59668],client version:1.4.2
16:45:30.635 INFO --- [ttyServerNIOWorker_1_5_32] i.s.c.r.processor.server.RegTmProcessor : TM register success,message:RegisterTMRequest{applicationId='account-service', transactionServiceGroup='seata-demo'},channel:[id: 0x02348d6e, L:/192.168.8.118:8092 - R:/192.168.8.118:59674],client version:1.4.2
16:45:30.696 INFO --- [rverHandlerThread_1_3_500] i.s.c.r.processor.server.RegRmProcessor : RM register success,message:RegisterRMRequest{resourceIds='deduct,jdbc:mysql://tajia-mysql:33064/seata_demo', applicationId='account-service', transactionServiceGroup='seata-demo'},channel:[id: 0xd07a4236, L:/192.168.8.118:8092 - R:/192.168.8.118:59675],client version:1.4.2

 

posted on 2021-10-14 16:51  Ruthless  阅读(992)  评论(0编辑  收藏  举报