2.1.3 CDC 实操指南

本节将介绍如何使用 TiCDC 在两个 TiDB 集群之间实现数据同步。

1. 部署结构

deployment.png

部署结构如上图所示。这里我们假定:

  • 上游 TiDB 集群的 PD 节点是 10.1.1.10:2379
  • 下游 TiDB 集群的 SQL 节点是 10.3.1.30:4000
  • TiCDC 集群由 3 个 capture 节点构成,分别是:
    • 10.2.1.20:8300
    • 10.2.1.21:8300
    • 10.2.1.22:8300

2. 部署集群

(1) 选择部署目标服务器

  • 推荐使用 CentOS 7.3 及以上版本的 Linux 操作系统,以及x86_64 架构 (amd64)
  • 编译 TiCDC 需要 Go >= 1.13
  • 服务器之间内网互通

(2) 准备二进制文件

Github 下载源码,并运行 make 执行编译,编译好的文件会出现在bin目录下。

(3) 启动集群

在每一台 TiCDC 服务器上分别运行以下命令启动服务:

  1. $ cdc server --pd=http://10.1.1.10:2379 --status-addr=127.0.0.1:8300

命令参数说明:

  • pd: 上游 TiDB 集群的 PD 节点地址
  • status-addr: 本地 capture 节点地址

至此,一个 TiCDC 集群就搭建成功了,它现在已经开始监听上游 TiKV 的变更日志了。

运行以下命令可以查看 capture 节点列表:

  1. $ cdc cli capture list --pd=http://10.1.1.10:2379
  2. [
  3. {
  4. "id": "5d1fd3bd-efc9-4cdf-9e8a-6d955f65b3b0",
  5. "is-owner": true
  6. },
  7. {
  8. "id": "629ec61e-16a3-466c-8fd4-2b2b457dabf7",
  9. "is-owner": false
  10. },
  11. {
  12. "id": "c5cd08b4-f601-456f-995c-62c97044444b",
  13. "is-owner": false
  14. }
  15. ]

上述命令会返回当前集群包含的全部 capture 节点。不难发现,集群中有且仅有一个 owner,其余节点都是 processor。

3. 创建同步任务

运行以下命令创建一个同步任务:

  1. $ cdc cli changefeed create --pd=http://10.1.1.10:2379 --sink-uri="mysql://user:password@10.3.1.30:4000/" --config=~/cdc-config.toml --start-ts=0

命令参数说明:

  • pd:上游 TiDB 集群的 PD 节点地址
  • sink-url:下游 TiDB 集群的 DSN
  • config:同步任务配置文件,允许指定需要同步的数据库和表,以及需要跳过的 TSO
  • start-ts:指定一个 TSO 作为数据同步的起点,若不指定或置为0,则默认使用当前最新的 TSO 作为起点

下面是一个同步任务配置文件示例:

  1. ignore-txn-commit-ts = []
  2. filter-case-sensitive = false
  3. [filter-rules]
  4. ignore-dbs = ["test", "mysql""information_schema", ]
  5. [[filter-rules.do-tables]]
  6. db-name = "sns"
  7. tbl-name = "user"
  8. [[filter-rules.do-tables]]
  9. db-name = "sns"
  10. tbl-name = "following"

从中可以看到,testmysqlinformation_schema 等三个数据库的变更日志会被过滤掉,只有 sns.usersns.following 两个表会被同步到下游。

4. 查询同步任务状态

运行以下命令可以查询同步任务列表:

  1. $ cdc cli changefeed list --pd=http://10.1.1.10:2379
  2. [
  3. {
  4. "id": "004a0ea8-2ef1-45b4-8ce1-b3281e7dc24d"
  5. }
  6. ]

若要查询同步任务的配置信息和同步状态,则需要给出对应的同步任务 ID:

  1. $ cdc cli changefeed query --pd=http://10.1.1.10:2379 --changefeed-id=004a0ea8-2ef1-45b4-8ce1-b3281e7dc24d
  2. {
  3. "info": {
  4. "sink-uri": "mysql://root:123456@127.0.0.1:3306/",
  5. "opts": {},
  6. "create-time": "2020-03-13T16:17:33.965778+08:00",
  7. "start-ts": 415259021527482369,
  8. "target-ts": 0,
  9. "admin-job-type": 0,
  10. "config": {
  11. "filter-case-sensitive": false,
  12. "filter-rules": null,
  13. "ignore-txn-commit-ts": null
  14. }
  15. },
  16. "status": {
  17. "resolved-ts": 415259037347348481,
  18. "checkpoint-ts": 415259036823060481,
  19. "admin-job-type": 0
  20. }
  21. }

还可以查看子任务:

  1. $ cdc cli processor query --pd=http://10.1.1.10:2379 --changefeed-id=004a0ea8-2ef1-45b4-8ce1-b3281e7dc24d --capture-id=5d1fd3bd-efc9-4cdf-9e8a-6d955f65b3b0
  2. {
  3. "status": {
  4. "table-infos": [
  5. {
  6. "id": 45,
  7. "start-ts": 415259021527482369
  8. }
  9. ],
  10. "table-p-lock": null,
  11. "table-c-lock": null,
  12. "admin-job-type": 0
  13. },
  14. "position": {
  15. "checkpoint-ts": 415259059393658881,
  16. "resolved-ts": 415259059917946881
  17. }
  18. }

5. HTTP 接口

TiCDC 提供了 HTTP 接口,帮助实现一些基础的查询和运维功能。

运行如下命令可以查询某个 capture 节点的服务状态:

  1. $ curl http://10.2.1.20:8300/status
  2. {
  3. "version": "0.0.1",
  4. "git_hash": "",
  5. "id": "4a54c85b-fc1d-4897-9934-1be3b9aa6a45",
  6. "pid": 31652
  7. }

上述输出结果中,id 是本地 TiCDC 服务对应的 capture ID,pid 则是本地进程 ID。

有时候需要驱逐当前的 owner 节点以主动触发 TiCDC 集群选举新的 owner,运行以下命令驱逐当前 owner 节点:

  1. $ curl -X POST http://10.2.1.20:8300/capture/owner/resign

请注意,上述命令需要向当前的 owner 节点发出请求,该请求对 processor 节点无效。

也可以停止、恢复或者删除指定的同步任务,命令如下:

  1. $ curl -X POST -d "admin-job=X&cf-id=136a3bee-621c-42d5-80ec-4c1aaf6ddb53" http://10.2.1.20:8300/capture/owner/admin

参数 admin-job 表示不同的任务类型:

  • admin-job=1 表示停止任务。停止任务后所有 processor 会结束同步并退出。同步任务的配置和同步进度都会保留,后续可以恢复任务。
  • admin-job=2 表示恢复任务。同步任务将继续同步。
  • admin-job=3 表示删除任务。将结束所有同步 processor,并清理同步任务配置。同步状态将被保留,后续只提供查询功能,无法恢复任务。

请注意,上述命令也需要向当前的 owner 节点发出请求。

最后,可以运行以下命令获取调试信息(譬如 owner 和 processors 的状态以及 etcd 上存储的内容):

  1. $ curl http://10.2.1.20:8300/debug/info