基础

概览

本小节说明的是线上部署方式,如果您仅在本地运行,可以参考安装

dtm的整个分布式事务中,各个参与者,分为AP、RM、TM三个角色,详情参见指南中的 dtm 架构。当您需要将一个分布式事务应用上线时,您需要以下几步:

  • 准备 RM 中使用的子事务屏障表,需要在你的业务数据库中创建
  • 准备 DTM 服务器中使用的事务状态存储表,只有DTM采用数据库存储才需要
  • 设计你的部署方案:可采用的方案包括,直接二进制部署、docker部署、K8S 部署。这当中可能还跟您接入的微服务有关
  • 设计你的 dtm 多副本方案:线上应用不建议单副本部署。dtm与普通的无状态应用一样,直接多副本即可
  • 配置你的 dtm 服务器

注意点

  • dtm服务器如果使用数据库,那么一定要使用主库。一方面dtm是写多读少,读写分离,对于dtm的负载分摊有限;另一方面dtm对数据的一致性要求较高,从库延时会导致各种问题。
  • dtm服务器的时区需要与数据库的时区保持一致
  • dtm服务器的时间需要与数据库的时间保持一致,差别不要超过3s

准备 RM 数据表

RM 因为涉及本地资源管理,因此使用DTM提供的子事务屏障技术则需要在本地数据库中创建子事务屏障相关的表,建表语句详见:建表SQL中的barrier文件

准备 DTM 数据表

DTM 作为TM角色,如果选择数据库作为存储引擎,那么会将全局事务信息保存在数据库中,需要在相应数据库中创建相关表,建表语句详见建表SQL中的storage文件

部署方案

这部分内容较多,详情参见部署

dtm 多副本方案

线上应用不建议单副本部署,dtm 也不例外。你需要根据您的部署方案,进行多副本部署

  • 微服务部署,如go-zero、polaris:这类微服务协议,已有多副本方案,参考具体的微服务情况即可
  • 二进制部署、Docker部署时,您可以参考您的其他 RM 应用多副本部署方案,对 dtm 进行多副本部署
  • K8S部署:可以直接指定副本数

dtm 的多副本如何协作,避免问题,可以参考 dtm架构中的高可用部分

DTM配置

DTM支持环境变量和文件两种配置,如果同时有环境变量和文件,那么配置文件的优先级高

环境变量

为了友好支持容器化和云原生,DTM支持环境变量进行配置

所有可配置的选项参考: yml样板配置文件,对于每个配置文件里的配置,都可以通过环境变量设置,对应规则如下:

  1. MicroService.EndPoint => MICRO_SERVICE_END_POINT

一个使用mysql的配置文件样例如下:

  1. Store:
  2. Driver: 'mysql'
  3. Host: 'localhost'
  4. User: 'root'
  5. Password: ''
  6. Port: 3306

最详细的配置说明参考上述yml样板配置文件里面,每个配置项的注释

yml文件配置

为了方便直接部署和调试,DTM也支持yml配置文件,详细配置项参考yml样板配置文件

采用yml配置dtm时,需要通过命令行指定配置文件,采用如下命令:

dtm -c ./conf.sample.yml

问题诊断

dtm相关问题可以通过日志来诊断,日志分为:

  • dtm服务器日志,日志会直接输出到控制台,通过设定环境变量 LOG_LEVEL=debug 或者命令行参数 dtm -d 来打开详细日志
  • dtm SDK日志,跟dtm相关的详细日志,可以通过 logger.InitLog("debug")来打开

通常的诊断步骤为:

  • 确认你把dtm的旧数据清理掉,如果dtm数据存储在mysql中,那么truncate trans_global表即可
  • 启动dtm 服务器,打开dtm服务器详细日志
  • 如果您是微服务协议,那么启动后,检查dtm是否成功注册到注册中心了,如果没有,检查服务器配置和日志
  • 检查能否正常访问dtm服务器(使用docker启动dtm的同学,容易碰见网络问题),默认地址为: localhost:36789
  • 启动业务服务器,打开dtm SDK日志
  • 如果您是微服务协议,那么业务服务器启动后,检查是否成功注册到注册中心了,如果没有,检查业务服务器配置和日志
  • 检查您的业务服务器网络是否正确(docker启动时,容易出现网络问题),是否能够被正常访问
  • 从业务服务新发起一个全局事务,检查业务服务的dtm SDK日志是否有报错
  • 检查dtm服务器中的日志,检查日志是否有报错

一般按照上述步骤下来,通常就能够找到最初出错的地方,就能够根据错误信息找到配置问题解决掉

如果您完成了上述步骤,还是问题还未解决,可以在微信群,或者在dtm项目的issue里面提出,并提供相关日志,我们通常会在较短的时间内给您回复