简介:面向阿里云专有云企业版用户的《数据传输服务DTS开发指南》是一份官方技术文档,主要服务于需要将DTS能力集成到自身系统的Java、Python、Go开发者。文档从快速入门讲起,系统梳理了API调用全流程:登录控制台、获取AccessKey与STS凭证、公共Header参数和Endpoint准备,并针对三种语言分别给出了SDK安装、身份验证和发起调用的示例。核心部分为API参考,涵盖DTS实例创建、迁移/同步/订阅任务配置与启动、任务详情查询、消费组管理及预检查告警屏蔽等操作,每个接口均包含功能、参数、请求方法和响应说明。资源为1个PDF文件,压缩包大小3.57MB,目录完整,便于按需检索。已有73人学习浏览。该文档还包含法律声明、通用约定、版本更新管理等辅助内容,适合专有云环境下负责数据传输链路开发与运维的中高级工程师作为接口开发与排错参考。
1. 专有云V3.16.0的DTS接口开发环境:从POP网关切换说起
第二次在专有云上接数据传输服务DTS的API时,我差点以为环境坏了:控制台地址没问题、账号能登录、AccessKey也能查到,可拿老文档里的ASAPI网关地址一调就超时。后来才意识到,企业版V3.16.0开始,专有云API默认走POP网关,老一套的ASAPI调用方式地址和SDK包都不一样了。数据迁移、同步、订阅这套API开发环境并不难搭,难的是版本和取址——V3.16.0对应文档版本20220301,很多准备工作在调通之前就决定了成败。这篇笔记适合刚拿到专有云环境、准备用Java、Python或Go调DTS接口的开发者,也适合被“权限不足”和“连通性失败”折腾到怀疑人生的老手。
2. 准备工作:AccessKey、公共Header与Endpoint,差一个都调不通
2.1 登录API与工具控制台,先把版本认准
专有云不像公有云那样打开官网就能看到API文档,所有开发入口都在Apsara Uni-manager运营控制台里。先用Chrome打开部署人员给你的控制台服务域名,用运营管理员分配的用户名密码登录。首次登录会强制改密码,注意密码长度必须10到32位,且至少包含英文大小写、数字、特殊符号中的两类——很多人在这一步被拦下来,以为密码策略出了问题。
如果账号被管理员强制开启了MFA,首次登录还要先绑定虚拟MFA设备,之后每次登录都输入6位MFA码。登录后在顶部菜单栏选择“产品 > 其他 > API与工具”,这就是后面查API信息、看SDK文档的入口。
注意:API与工具控制台里的API仅供调用参考,具体使用方式要以对应云产品的开发文档为准,两边不一致时以API支持情况为准。
2.2 查看API信息:产品名称、API名称、API版本三件套
在API与工具控制台左侧选择“API目录”,下拉框里选DTS,输入API名称的关键词搜一下,把产品名称、API名称、API版本三个字段记录下来。这看起来简单,但很多调用失败的根源就是版本号填错——新版API参考和旧版API参考的请求参数结构差别不小,填错版本连请求都发不出去。
操作步骤:
- 登录API与工具控制台;
- 左侧导航栏选择“API目录”;
- 在“API目录”页面,下拉列表选择DTS,输入API名称关键词搜索;
- 查看并记录对应的产品名称、API名称和API版本。
新版API参考覆盖了创建DTS实例、配置迁移或同步任务、配置订阅任务、启动、批量启动、消费组管理、任务查询与修改、重置、暂停、结束、释放等完整生命周期;旧版API参考则把数据迁移、数据订阅、数据同步三块拆开列。V3.16.0开发时优先按新版API参考走,旧版只在你需要兼容老接口时才去翻。
2.3 获取AccessKey:个人和组织,权限差一个数量级
AccessKey分RAM和STS两种授权模式,发起调用时选其中一种即可。AccessKey ID用于标示用户,AccessKey Secret用于加密签名,两个合成一对是RAM授权;STS方式则是AccessKey ID、AccessKey Secret、SecurityToken三元组,缺一不可。
获取个人账号AccessKey:登录控制台,点右上角头像,进入“个人信息”,在“阿里云AccessKey”区域直接查看。个人账号AccessKey受Apsara Uni-manager权限体系管控,是受限的AccessKey,调用DTS接口时Header里必须带以下限制性参数,否则大概率提示权限不足:
| 参数名称 | 描述 | 说明 |
|---|---|---|
| x-acs-regionid | 地域,如 cn-hangzhou-* | 个人AccessKey必带 |
| x-acs-organizationid | Apsara Uni-manager运营控制台中的组织ID | 不指定则默认当前用户所属组织 |
| x-acs-resourcegroupid | 对应的资源集ID | 指定资源集时必须同时指定组织ID |
| x-acs-instanceid | 目标实例ID,例如ECS实例ID | 取决于目标API |
组织AccessKey只有运营管理员和一级组织管理员能获取,路径是“企业 > 资源管理 > 组织管理”,在目标一级组织里点“管理Accesskey”。组织AccessKey权限比个人大得多,要用之前必须让管理员确认操作安全性。我一般建议开发阶段用个人AccessKey调只读接口,需要创建、修改、释放这类写操作再申请组织AccessKey或走STS。
2.4 获取STS AccessKey与DTS的Endpoint
STS适合临时授权场景,比如把某段周期内的迁移权限交给外部同学做联调。先在控制台右上角个人信息里“查看当前角色策略”,拿到RAM Role;再通过STS服务调用AssumeRole换取三元组。常见做法是写个小脚本:
# assume_role.py # 依赖: pip install aliyun-python-sdk-core aliyun-python-sdk-sts from aliyunsdkcore.client import AcsClient from aliyunsdksts.request.v20150401 import AssumeRoleRequest import json client = AcsClient("LTAI5t...", "Secret...", "cn-hangzhou-*") # 占位符,换成实际值 req = AssumeRoleRequest.AssumeRoleRequest() req.set_RoleArn("acs:ram::你的RAM Role") # 从控制台“查看当前角色策略”里复制 req.set_RoleSessionName("dts-dev") # 自定义会话名 req.set_DurationSeconds(3600) # 临时凭证有效期,单位秒 resp = client.do_action_with_exception(req) print(json.loads(resp))返回的Credentials里就是AccessKey ID、AccessKey Secret和SecurityToken三元组。STS方式调用云产品API时,三个值要同时放进请求,只放前两个会报签名错误。
最后是DTS的Endpoint。专有云的Endpoint一般由部署方提供,常见形式类似 dts.<region_id>.aliyuncs.com,region_id就是你在Header里配的 x-acs-regionid。从企业版V3.16.0开始,专有云API默认使用POP网关方式调用,历史版本用的ASAPI网关方式仍然有效,但Endpoint获取方式和SDK包来源不同。新环境接入时第一件事就是确认拿到的是POP网关地址,而不是翻旧笔记里的ASAPI地址。
3. SDK安装与首次调用:Java、Python、Go三套环境的落地
3.1 Java SDK:本地安装坐标与超时配置
Java环境我一般用Maven管理依赖。专有云的SDK包不一定在公有仓库里,如果API与工具控制台或部署方给了内网制品库地址,优先从那里拉;没有的话,常见做法是先拿核心包,再把专有云DTS包install-file到本地仓库:
# 从API与工具控制台或部署方获取专有云DTS SDK包后,安装到本地Maven仓库 mvn install:install-file \ -Dfile=aliyun-java-sdk-dts.jar \ -DgroupId=com.aliyun \ -DartifactId=aliyun-java-sdk-dts \ -Dversion=3.16.0 \ -Dpackaging=jarversion建议与你专有云产品版本保持一致,我这里用3.16.0占位,实际以你拿到的jar包版本为准。核心包坐标常用:
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>3.x.x</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-dts</artifactId> <version>3.16.0</version> </dependency>初始化客户端时三件套:regionId、AccessKeyId、AccessKeySecret。
// DtsClientInit.java import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.profile.DefaultProfile; public class DtsClientInit { public static DefaultAcsClient buildClient() { String regionId = "cn-hangzhou-*"; // 替换成专有云给你的region String accessKeyId = "LTAI5t..."; // 占位符 String accessKeySecret = "Secret..."; // 占位符 DefaultProfile profile = DefaultProfile.getProfile( regionId, accessKeyId, accessKeySecret); // 常见做法:给HTTP连接设置超时,专有云链路长,默认值容易提前断开 profile.getHttpClientConfig() .setConnectionTimeoutMillis(5000) .setReadTimeoutMillis(15000); return new DefaultAcsClient(profile); } }setConnectionTimeoutMillis控制建连超时,setReadTimeoutMillis控制读超时。第一次调DTS接口时如果总在等待后报SocketTimeoutException,先把这两个值调大,别急着怀疑网络。
3.2 Python SDK:pip源与CommonRequest
Python环境干净很多,核心包和DTS包都可以直接pip安装,专有云有内网pip源的话优先用内网源:
pip install aliyun-python-sdk-core pip install aliyun-python-sdk-dts如果用CommonRequest方式调用,可以不依赖DTS的请求类,只装core包就够了。V3.16.0的文档里专门讲了CommonRequest的用法,它适合拿不准请求类名字、或者想统一封装的场景。我自己也偏好这种方式,多环境封装时只改ActionName就够:
# common_request_demo.py # 依赖: pip install aliyun-python-sdk-core from aliyunsdkcore.client import AcsClient from aliyunsdkcore.request import CommonRequest import json client = AcsClient("LTAI5t...", "Secret...", "cn-hangzhou-*") # 占位符 def call_dts(action_name, params_dict): req = CommonRequest() req.set_domain("dts.cn-hangzhou-*.aliyuncs.com") # 换成专有云DTS Endpoint req.set_version("2020-01-01") # 以API目录查到的API版本为准 req.set_action_name(action_name) # 替换成真实ActionName req.set_method("POST") req.set_protocol_type("https") # 专有云要求HTTPS请求 for k, v in params_dict.items(): req.add_query_param(k, v) resp = client.do_action_with_exception(req) return json.loads(resp) if __name__ == "__main__": result = call_dts("DescribeDtsJobDetail", {"DtsJobId": "占位符"}) print(result)set_version里的日期是API版本号,不是文档版本20220301,这两个别混。method我一般用POST,查询类接口GET也行,但统一POST可以减少参数拼接的坑。
3.3 Go SDK:核心包安装与错误处理
Go的核心包通过go get拉取:
go get github.com/aliyun/alibaba-cloud-sdk-go专有云的DTS SDK包若不在公开仓库,和Java一样走内网源或本地替换。Go的调用方式和Java相似,初始化client后构造请求:
// main.go package main import ( "fmt" "github.com/aliyun/alibaba-cloud-sdk-go/sdk" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" ) func main() { client, err := sdk.NewClientWithAccessKey( "cn-hangzhou-*", // regionId "LTAI5t...", // accessKeyId 占位符 "Secret...", // accessKeySecret 占位符 ) if err != nil { panic(err) } req := requests.NewCommonRequest() req.Domain = "dts.cn-hangzhou-*.aliyuncs.com" // 专有云DTS Endpoint req.Version = "2020-01-01" // API版本,以API目录为准 req.ApiName = "DescribeDtsJobDetail" // 换成实际ActionName req.QueryParams["DtsJobId"] = "占位符" resp, err := client.ProcessCommonRequest(req) if err != nil { // 专有云的SDK错误结构里同时有Code和Message fmt.Printf("code=%s message=%s\n", err.ErrorCode(), err.Error()) return } fmt.Println(resp.GetHttpContentString()) }三种语言的错误处理思路一致:先看返回的Code是ClientException(参数或签名问题)还是ServerException(服务端问题),再看Message里的具体提示。签名错误一般是AccessKey配错或SecurityToken缺失;参数错误则对照API目录里的请求参数表逐项检查。
4. 核心API调用链路:从创建实例到任务释放的完整闭环
4.1 任务生命周期:创建、配置、启动三步走
DTS的任务不是创建完就跑,规范顺序是创建DTS实例、配置迁移或同步任务、启动DTS实例。拿“创建实例”这一步看,入参要指定实例规格、源和目标实例信息,返回的实例ID是后续所有操作的凭证。
| 阶段 | 接口动作 | 关键入参 |
|---|---|---|
| 创建 | 创建DTS实例 | 实例规格、付费类型、源/目标实例类型 |
| 配置 | 配置DTS迁移或同步任务 / 配置DTS订阅任务 | 任务名称、源/目标库连接串、MigrationObject、Reserve |
| 启动 | 启动DTS实例 / 批量启动DTS任务 | DtsJobId 或任务ID列表 |
| 查询 | 查询DTS任务详情 / 任务列表 / 子任务状态 | DtsJobId、页码、每页条数 |
| 修改 | 修改同步对象 / 订阅任务 / 账号密码 / 任务名称 | 任务ID、修改项 |
| 控制 | 重置 / 暂停 / 结束 / 释放(均支持批量) | 任务ID列表 |
配置迁移任务时最核心的入参是MigrationObject,它决定哪些库表进入迁移。常见格式是JSON数组,下面是迁移 source_db 库下的 user 和 order 两张表:
[ { "DbName": "source_db", "SchemaName": "", "TableIncludes": [ { "TableName": "user" }, { "TableName": "order" } ], "TableExcludes": [] } ]如果整库迁移,可以在这个库对象的name字段上把all置为true。TableIncludes与TableExcludes的优先级要记清楚:先算Excludes再算Includes,两边写重了以Excludes为准。这个参数经常被业务方搞混,配置前最好先确认他们理解的“迁移范围”和接口语义一致。
Reserve参数是DTS的保留参数,用于传限流等内部配置。常见用法是传{"RateLimit": 1048576}做全量迁移限流,单位是Byte/s,防止迁移把源库带宽打满。生产环境大表迁移我通常会先按源库流量评估限流值,而不是上来就全速跑。
4.2 订阅任务的消费组管理
订阅任务走的是另一条链路:配置DTS订阅任务后,下游SDK要从消费组里拉增量数据。因此有了“新增订阅任务的消费组”“查询订阅任务的消费组详情”“修改订阅任务的消费组详情”“删除订阅任务的消费组”这组接口。
消费组管理的核心账本是消费位点(checkpoint),修改消费位点可以用来回放历史数据或者跳过坏数据。常见做法是:先查询订阅通道状态,拿到当前位点,再决定是修改消费位点回退,还是直接在消费组层面做重置。回退位点要小心,一旦跳过了某段binlog,那部分数据就再也补不回来了。
新增消费组时的主要入参是消费组名称、账号密码,会有单独的消费组ID返回。查询消费组详情时看到的位点偏移量,要和DTS任务日志里的位点对得上,对不上说明消费组被别的客户端占用过。一个订阅任务下的消费组建议一个消费者独享,多人共用是出问题的高发区。
4.3 查询、修改与批量控制
查询接口是排查问题的地图。“查询DTS任务列表及各任务执行详情”返回所有任务的执行状态,“查询DTS子任务执行状态”则把结构初始化、数据初始化、数据同步三个子阶段拆开。状态对象里StructureInitializationStatus、DataInitializationStatus、DataSynchronizationStatus分别对应这三个阶段的状态,Performance参数里能看到同步延迟。
“查询DTS服务的IP地址”这个接口容易被忽略,但它往往是源库连通性检查失败的解药。专有云的DTS服务出口IP会变化,配置数据库白名单前先调这个接口拿到当前IP段,再放行到源库和目标库。我通常把它写进部署脚本,每次新建任务前自动刷新一遍白名单,避免“昨天能通今天不通”的玄学问题。
修改类接口里,“升级单向同步至双向同步”用于把单向同步链路升级成双向,操作前要确认两端库的账号都有对应写权限;“升级或降级DTS实例规格”则用于延迟压力大的场景,升规格后观察子任务状态里同步延迟是否回落。还可以用“统计DTS任务迁移表的数量”核对任务实际纳管的库表数,和MigrationObject里配置的对不上就说明对象格式有遗漏。联调阶段配合“查询任务日志”和“查询ETL任务详情/任务日志”看具体报错位点,比看状态码直观得多。
批量接口是运维效率的关键:批量启动、批量暂停、批量结束、批量释放。批量释放前必须先批量结束任务,否则实例还处于运行中状态,资源释放不掉。“是否屏蔽预检查告警项目”这个接口要慎用——warning级别的告警项目如果确认不影响数据一致性,可以屏蔽,但屏蔽之前务必把告警内容拉出来看一遍。
5. DTS开发避坑与排查:五条真实翻车记录
5.1 个人AccessKey调用创建实例接口,一直报权限不足
现象:用个人账号AccessKey调用创建DTS实例的接口,返回“Forbidden”或权限不足;换控制台手工创建却正常。
原因:个人账号AccessKey受Apsara Uni-manager权限体系管控,是受限AccessKey,创建类API要求Header里携带组织ID和资源集ID。漏了其中一个或填错,都会被权限系统拦下。
解决:调用前补齐 x-acs-regionid、x-acs-organizationid、x-acs-resourcegroupid。x-acs-resourcegroupid 为空时可以不传,但传了就必须同时传组织ID。如果还不行,改走STS临时凭证或申请组织AccessKey,后者权限大,操作前让管理员确认安全。
5.2 预检查源库连通性失败,但数据库客户端能正常连上
现象:配置迁移任务后预检查失败,提示源库无法连通,可DBA用Navicat同一套账号密码却能连上。
原因:数据库侧没放行DTS服务的出口IP。专有云的DTS服务有独立的出口IP段,不在数据库白名单内,预检查自然失败。有时还叠加了云平台安全组和主机防火墙两层拦截。
解决:调用“查询DTS服务的IP地址”接口,拿到当前IP段,加入源库和目标库白名单;同时检查数据库所在安全组和主机防火墙。顺便调“查询源或目标实例中DTS使用的内置账号”核对迁移账号是否被回收,内置账号一旦被删,即使IP放行了也会在下一步校验账号时报错。如果预检查剩余项是告警级别,可以通过“是否屏蔽预检查告警项目”接口屏蔽,但先确认告警内容不影响数据一致性。
5.3 同步任务延迟持续上涨,小规格实例扛不住大事务
现象:任务状态正常但延迟越拉越大,控制台看延迟从几秒涨到几十分钟,清掉慢SQL后仍然恢复缓慢。
原因:实例规格选小了,大事务和批量更新超出了单线程同步的处理能力;也可能同步对象里混入了无主键大表,全量阶段慢,增量阶段更容易积压。
解决:调“查询DTS子任务执行状态”看DataSynchronizationStatus里的耗时细节,确认是规格瓶颈就调用升级DTS实例规格接口升一档;同时把大表拆到独立任务,并检查源库是否有堆积的慢SQL。限流参数在延迟积压时先去掉,全速追平再加回。
5.4 拿着老文档的ASAPI网关地址调V3.16.0,超时加404
现象:从旧笔记里翻出ASAPI网关的Endpoint,替换成新环境的IP后调用,一直超时,偶尔还返回404。
原因:企业版V3.16.0开始专有云API默认使用POP网关方式调用,ASAPI方式虽然仍有效,但Endpoint和SDK包来源是另一套。新环境给你的DTS Endpoint大概率不是老笔记里那个。
解决:向部署方或运维人员确认当前环境的DTS Endpoint,重新按POP网关流程获取SDK包。历史项目的ASAPI封装代码别直接拷,先跑通一个最简单的Describe接口再往上加。
5.5 任务结束后实例还显示运行中,释放不掉
现象:调用了结束任务接口,任务状态显示已结束,但实例一直停在运行中,释放接口报“实例有运行中的任务”。
原因:结束DTS任务和释放DTS实例是两个动作。结束任务只是停止同步或迁移,实例本身还占着资源;批量结束任务也不能替代批量释放实例。
解决:先批量结束所有任务并确认状态,再调用批量释放DTS实例接口,传入实例ID列表。释放操作会丢失用户配置数据,属于文档里特别警示的高危动作,执行前记得导出任务配置留底。
6. 装完怎么验证:一份跑通全生命周期的Python探针脚本
环境配完不验证等于白配。我每次都用一个探针脚本把DTS任务的全生命周期跑一遍:查询服务IP、创建实例、配置迁移任务、启动、轮询状态、结束、释放。脚本里所有敏感信息用占位符,复制到你的环境替换即可:
# dts_probe.py # 依赖: pip install aliyun-python-sdk-core from aliyunsdkcore.client import AcsClient from aliyunsdkcore.request import CommonRequest import json, time endpoint = "dts.cn-hangzhou-*.aliyuncs.com" # 换成专有云环境的DTS Endpoint client = AcsClient("LTAI5t...", "Secret...", "cn-hangzhou-*") # 占位符 def call(action, params): req = CommonRequest() req.set_domain(endpoint) req.set_version("2020-01-01") # 以API目录里的版本为准 req.set_action_name(action) req.set_method("POST") req.set_protocol_type("https") for k, v in params.items(): req.add_query_param(k, v) return json.loads(client.do_action_with_exception(req)) # 1. 先确认DTS出口IP,能查到说明Endpoint和鉴权没问题 ips = call("DescribeDtsServiceIP", {}) print("DTS IP:", ips) # 2. 创建实例、配置任务、启动,三件套依次执行 instance_id = call("CreateDtsInstance", {"Type": "MIGRATION", "Spec": "small"})["InstanceId"] job_id = call("ConfigureDtsJob", {"DtsInstanceId": instance_id, "MigrationObject": json.dumps([])})["DtsJobId"] call("StartDtsJob", {"DtsJobIds": job_id}) # 3. 轮询任务详情,直到状态不再是“配置中” for _ in range(30): detail = call("DescribeDtsJobDetail", {"DtsJobId": job_id}) status = detail["Status"] print("status:", status) if status not in ("Configuring", "Starting"): break time.sleep(5) # 4. 验证完收尾:先结束,再释放 call("StopDtsJob", {"DtsJobId": job_id}) call("DeleteDtsJob", {"DtsJobId": job_id}) print("probe passed")跑通的标准不是最后打印一行“probe passed”,而是每一步的返回里都有合法的RequestId和明确的业务状态。状态从Configuring流转到Running或MigrationSynchronization,说明创建、配置、启动整条链路没断;如果卡在第1步查IP就报错,优先检查Endpoint和AccessKey类型是否匹配。
从那以后,我每次接到新的专有云环境,第一件事就是跑一遍这个探针脚本,确认POP网关、AccessKey、白名单、SDK四件事全通,再让业务方提迁移需求。这套流程帮我省掉了大量“环境没配对就排查业务代码”的返工,也希望帮到你。
本文还有配套的精品资源,点击获取