一、 GTS产品概述
略
二、 GTS常见问题
1.专有云环境下,默认事务分组default/default_8092 无法识别。
一般出现此问题原因为:EDAS和GTS在两个集群,EDAS的diamond列表找不到GTS的gts diamond ip,需要手动添加。如果部署在同一集群则不需要这么做。
排查方式:
1. 先获取edas 使用diamond的ip列表
curl "[http://jmenv.tbsite.net:8080/diamond-server/diamond](http://jmenv.tbsite.net:8080/diamond-server/diamond)"
2. 获取gts使用的diamond 的ip列表
curl "[http://jmenv.tbsite.net:8080/diamond-server/diamond](http://jmenv.tbsite.net:8080/diamond-server/diamond)"
3. 查询是否存在配置项com.taobao.txc.jvm.opts
curl "[http://edas-diamond-id:8080/diamond-server/config.co?dataId=com.taobao.txc.jvm.opts&group=TXC_GROUP](http://edas-diamond-id:8080/diamond-server/config.co?dataId=com.taobao.txc.jvm.opts&group=TXC_GROUP)"
4. 不存在就需要添加配置项
在edas节点运行(将ip列表替换为gts使用的diamond ip列表)
curl "[http://edas-diamond-ip:8080/diamond-server/basestone.do?method=syncUpdateAll](http://edas-diamond-ip:8080/diamond-server/basestone.do?method=syncUpdateAll)" -d "dataId=com.taobao.txc.jvm.opts&group=TXC_GROUP&content=-Ddiamond.txc.server.ip=192.168.81.48,192.168.81.46,192.168.81.47 -Ddiamond.txc.server.port=8080"
2. 多个TXC服务注册到edas上,其中一个可以使用,另一个TXC注册失效
解决方案:需要为txc指定appname以进行区分,appname可以为不重复的任意字符串,建议以服务名命名。
3.内网开发环境无法连接txc,找不到diamond
解决方案:启动参数加
-Ddiamond.txc.server.ip=20.20.196.39 -Ddiamond.txc.server.port=8080
4.使用GTS后,数据库数据已更新,却无法回滚。
排查方案:
- 检查数据源类型,如使用GTS必须使用以下数据源类型
spring.datasource.type=com.taobao.txc.datasource.cobar.TxcDataSource
-
注解是否使用正确 @TxcTransaction
-
包含注解@TxcTransaction方法所在的类是否已加载以bean方式加载。
5.使用GTS后,操作数据库时报txc_undo_log表不存在
解决方案:
除drds数据库外,其他支持GTS的数据库使用GTS前需手动创建txc_undo_log表。建表语句参考附节。
6.MQ使用GTS后显示发送成功,却无法在MQ后台查询到。
解决方案:MQ使用GTS发送消息,需要声明TxcMQProducer,如下
@Autowired
TxcMQProducer txcMQProducer;
7.开发或运维中遇到问题,希望排查GTS全局事务,请问GTS的日志记录在哪儿, 怎么查看 GTS 日志?
GTS的事务日志名称为txcXXXX.log,其中XXXX为GTS客户端进程的进程号, 其路径为:{user.home}为启动 GTS 客 户端的用户账户的根目录
8.找不到逻辑组系统报错****can't fetch real group name from diamond!vgroup_mapping_default
排查方案:
导致该异常一般有5种可能性:
1 应用当前环境连接的diamond和gts使用的不是同一套diamond。
2 gts服务端启动失败导致gts的物理组注册失败。
3 当前环境连不通gts的服务器。
4 当前不存在default的事务逻辑分组。
5.txc server没有开启
8.1 当前环境和gts访问的不是同一套diamond
8.1.1 定位方法:
在当前环境和gts服务器的任意一个节点运行命令:
curl "http://jmenv.tbsite.net:8080/diamond-server/diamond"
该命令会返回一个ip地址列表。如果在两条机器上运行该命令返回的ip地址列表不同,则确定当前环境和gts使用的不是同一套diamond。该问题常见与edas应用,一般edas和gts会使用两套独立的diamond。
8.1.2 解决方式
在当前环境的diamond中添加配置项com.taobao.txc.jvm.opts
1) 先获取edas 使用diamond的ip列表。
在报错节点运行命令:
curl "http://jmenv.tbsite.net:8080/diamond-server/diamond"
2)获取gts服务使用的diamond的ip列表
在任意gts服务节点运行命令:
curl "http://jmenv.tbsite.net:8080/diamond-server/diamond"
3)添加配置项com.taobao.txc.jvm.opts到报错节点所在diamond环境
在报错节点运行命令:
curl "http://$edas-diamond-ip:8080/diamond-server/basestone.do?method=syncUpdateAll" -d "dataId=com.taobao.txc.jvm.opts&group=TXC_GROUP&content=-Ddiamond.txc.server.ip=$edas-diamond-iplist -Ddiamond.txc.server.port=8080"
命令实例:
curl "http://192.168.21.29:8080/diamond-server/basestone.do?method=syncUpdateAll" -d "dataId=com.taobao.txc.jvm.opts&group=TXC_GROUP&content=-Ddiamond.txc.server.ip=192.168.81.48,192.168.81.46,192.168.81.47 -Ddiamond.txc.server.port=8080"
4)查询 com.taobao.txc.jvm.opts
curl "http://edas-diamond-id:8080/diamond-server/config.co?dataId=com.taobao.txc.jvm.opts&group=TXC_GROUP"
8.2 gts服务端启动失败导致gts的物理组注册失败
8.2.1 问题定位
登陆三台gts的服务器,运行 ps -elf|grep txc,查询txc的进程是否在运行。如果查询不到txc的进程说明gts服务端启动失败。如果三台节点txc的进程都在 一般情况下gts是正常运行的。也不排斥gts进程在单注册失败的情况,这个时候需要通过查看日志进一步确定。日志位置:/home/admin/logs/txc或者/root/logs/txc。
8.2.2 问题解决
启动gts服务
8.3 当前环境连不通gts的服务器
8.3.1 问题定位
在vpc环境下经常会出现vpc机器与gts 服务不同的情况,可以通过ping命令测试
8.3.1 问题解决
如果ping不同说明当前节点和gts服务器无法联通,需要将起联通。
8.4 当前不存在default的事务逻辑分组
8.4.1 问题定位
1)查询diamond地址
curl "http://jmenv.tbsite.net:8080/diamond-server/diamond"
2)查询逻辑组是否存在
curl "http://diamond-ip:8080/diamond-server/config.co?dataId=vgroup_mapping_default&group=TXC_GROUP"
8.4.2 问题解决
添加事务逻辑分组映射,运行命令
curl "http://diamond-ip:8080/diamond-server/basestone.do?method=syncUpdateAll" -d "dataId=vgroup_mapping_default&group=TXC_GROUP&content=$rgoupname"
$rgoupname需要向管理员获取,专有云环境下一般是default
8.5查看txc server进程是否启动 ps -ef|grep 8091 如果没有需要重启txc server容器。
## **Oracle数据库建****txc_undo_log****表语句:**
--oracle建表语句
CREATE TABLE txc_undo_log (
id number(20) NOT NULL,
gmt_create date NOT NULL,
gmt_modified date NOT NULL,
xid varchar(100) NOT NULL,
branch_id number(20) NOT NULL,
rollback_info blob NOT NULL,
status number(11) NOT NULL,
server varchar(32) NOT NULL,
PRIMARY KEY (id)
);
alter table txc_undo_log add constraint txc_undo_log_unionkey unique(xid, branch_id);
## **Mysql****数据库建****txc_undo_log****表语句:**
CREATE TABLE `txc_undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`gmt_create` datetime NOT NULL COMMENT '创建时间',
`gmt_modified` datetime NOT NULL COMMENT '修改时间',
`xid` varchar(100) NOT NULL COMMENT '全局事务ID',
`branch_id` bigint(20) NOT NULL COMMENT '分支事务ID',
`rollback_info` longblob NOT NULL COMMENT 'LOG',
`status` int(11) NOT NULL COMMENT '状态',
`server` varchar(32) NOT NULL COMMENT '分支所在DB IP',
PRIMARY KEY (`id`),
KEY `unionkey` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=211225994 DEFAULT CHARSET=utf8 COMMENT='事务日志表';
网友评论