024、数据库管理之数据同步工具TiCDC
TiCDC
TiCDC
TiCDC介绍
TiCDC 是一款通过拉取 TiKV 变更日志实现的 TiDB 增量数据同步工具,具有将数据还原到与上游任意 TSO 一致状态的能力,同时提供开放数据协议 (TiCDC Open Protocol),支持其他系统订阅数据变更。
架构与原理
每个Capture: 不是收集所有TiKV当中的日志,只是负责部分TiKV,然后会选择一个Caputre作为owner将所有的日志进行处理排序,然后供给下游系统订阅
适用场景
TiCDC适合上游数据库是TiDB,下游数据库支持Mysql兼容的任何数据库和kafka, 适合异步复制的场景。
有效索引的相关要求
TiCDC 只能同步至少存在一个有效索引的表,有效索引的定义如下:
- 主键 (PRIMARY KEY) 为有效索引。
- 同时满足下列条件的唯一索引 (UNIQUE INDEX) 为有效索引:
- 索引中每一列在表结构中明确定义非空 (NOT NULL)。
- 索引中不存在虚拟生成列 (VIRTUAL GENERATED COLUMNS)。
TiCDC 从 4.0.8 版本开始,可通过修改任务配置来同步没有有效索引的表,但在数据一致性的保证上有所减弱。具体使用方法和注意事项参考同步没有有效索引的表。
TiCDC 暂不支持的场景如下:
- 暂不支持单独使用 RawKV 的 TiKV 集群。
- 暂不支持在 TiDB 中创建 SEQUENCE 的 DDL 操作和 SEQUENCE 函数。在上游 TiDB 使用 SEQUENCE 时,TiCDC 将会忽略掉上游执行的 SEQUENCE DDL 操作/函数,但是使用 SEQUENCE 函数的 DML 操作可以正确地同步。
对已有TiDB进行扩容部署
TiCDC环境部署
一般分两种情况:可以前期随 TiDB 一起部署,也可以后期进行扩容部署。
编辑扩容配置文件,准备将 TiCDC 节点 192.168.16.13加入到集群中去.
vim scale-out.yaml
cdc_servers:
- host: 192.168.75.15
gc-ttl: 86400
data_dir: /tidb-data/cdc-data/cdc-8300
- host: 192.168.75.16
gc-ttl: 86400
data_dir: /tidb-data/cdc-data/cdc-8300
cdc_servers 约定了将 TiCDC 服务部署到哪些机器上,同时可以指定每台机器上的服务配置。
gc-ttl:TiCDC 在 PD 设置的服务级别 GC safepoint 的 TTL (Time To Live) 时长,单位为秒,默认值为 86400,即 24 小时。
port:TiCDC 服务的监听端口,默认 8300
加入 2 个 TiCDC 节点,IP 为 192.168.75.15/16,端口默认 8300,软件部署默认在 /tidb-deploy/cdc-8300 中,日志部署在 /tidb-deploy/cdc-8300/log 中,数据目录在 /tidb-data/cdc-data/cdc-8300 中。
使用 tiup 为原有 TiDB 数据库集群扩容 TiCDC 节点。
tiup cluster scale-out tidb-test scale-out.yaml -uroot -p
TiCDC管理工具
cdc cli 是指通过cdc binary 执行cli子命令。通过cdc binary 直接执行cli命令,需要带上PD的地址。
TiCDC同步任务
tiup cdc cli changefeed create --pd=http://192.168.16.13:2379 --sink-uri="mysql://root:123456@127.0.0.1:3306/" --changefeed-id="simple-replication-task"
- 公共配置
--changefeed-id : 同步任务的ID
-sink-uri : 同步任务下游的地址,需要按照以下格式进行配置,目前支持mysql/tidb/kafka/pulsar
--start-ts: 指定changefeed的开始TSO
--target-ts: 指定changefeed的目标TSO
下游配置(MySQL/TiDB)
- worker-count: 向下游执行SQL的并发度(可选,默认值为16)
- max-txn-row: 向下游执行SQL的bath大小(可选,默认值为256)
下游配置(Kafka)
- protocol: 输出到kafka消息协议,可选有default、cannal、avro、maxwell
- max-message-bytes: 每次向kafka broker发送消息的最大数量(可选,默认值为64Mb)
查询所有TiCDC同步任务
cdc cli changefeed list --pd=http://192.168.16.13:2379
[root@tidb2 bin]# ./cdc cli changefeed list --pd=http://192.168.16.13:2379
[
{
"id": "replication-task-1",
"summary": {
"state": "normal",
"tso": 442624753026203649,
"checkpoint": "2023-07-04 10:03:55.067",
"error": null
}
}
]
checkpoint(TSO):表示已经复制的时间点。
查询TiCDC指定的同步任务
- 查看概览
-s : summary 概览
[root@tidb2 bin]# ./cdc cli changefeed query -s --pd=http://192.168.16.13:2379 --changefeed-id=replication-task-1
{
"state": "normal",
"tso": 442624745122562049,
"checkpoint": "2023-07-04 10:03:24.917",
"error": null
}
- 查看详情
[root@tidb2 bin]# ./cdc cli changefeed query --pd=http://192.168.16.13:2379 --changefeed-id=replication-task-1
{
"info": {
"upstream-id": 0,
"sink-uri": "mysql://dm:123456@192.168.16.13:3306/",
"opts": {},
"create-time": "2023-07-04T10:00:01.368752155-04:00",
"start-ts": 442624691740082177,
"target-ts": 0,
"admin-job-type": 0,
"sort-engine": "unified",
"sort-dir": "",
"config": {
"case-sensitive": true,
"enable-old-value": true,
"force-replicate": false,
"check-gc-safe-point": true,
"filter": {
"rules": [
"*.*"
],
"ignore-txn-start-ts": null
},
"mounter": {
"worker-num": 16
},
"sink": {
"dispatchers": null,
"protocol": "",
"column-selectors": null,
"schema-registry": ""
},
"cyclic-replication": {
"enable": false,
"replica-id": 0,
"filter-replica-ids": null,
"id-buckets": 0,
"sync-ddl": false
},
"consistent": {
"level": "none",
"max-log-size": 64,
"flush-interval": 1000,
"storage": ""
}
},
"state": "normal",
"error": null,
"sync-point-enabled": false,
"sync-point-interval": 600000000000,
"creator-version": "v6.1.0"
},
"status": {
"resolved-ts": 442624742750158849,
"checkpoint-ts": 442624742487752705,
"admin-job-type": 0
},
"count": 0,
"task-status": []
}
管理TiCDC同步任务
1、停止同步任务
[root@tidb2 bin]# ./cdc cli changefeed pause --pd=http://192.168.16.13:2379 --changefeed-id=replication-task-1
2、恢复同步任务
[root@tidb2 bin]# ./cdc cli changefeed resume --pd=http://192.168.16.13:2379 --changefeed-id=replication-task-1
2、删除同步任务
[root@tidb2 bin]# ./cdc cli changefeed remove --pd=http://192.168.16.13:2379 --changefeed-id=replication-task-1
动态更新任务
TiCDC从4.0.4开始支持非动态修改同步任务配置。 当然修改同步任务的时候的时候,需要先暂停任务
1、暂停
[root@tidb2 bin]# ./cdc cli changefeed pause -c replication-task-1 --pd=http://192.168.16.13:2379
2、修改
[root@tidb2 bin]# ./cdc cli changefeed update -c replication-task-1 --pd=http://192.168.16.13:2379 --sink-uri="mysql://localhost:3306/?max-txn-row=20&worker-number=8" --config=changefeed.yaml
3、恢复
[root@tidb2 bin]# ./cdc cli changefeed resume -c replication-task-1 --pd=http://192.168.16.13:2379
监控TiCDC
可以使用grafana 当中的监控,查看TiCDC - Changefeed 相关情况
server : TiDB集群中TiKV节点和TiCDC节点的概要信息
changefeed : TiCDC同步任务的详细信息
events : TiCDC 内部数据流转的详细信息。
tikv : TiKV中的TiCDC相关详细信息
实验
数据同步完整实操
1、查看当前集群
[root@tidb2 ~]# tiup cluster display tidb-test
tiup is checking updates for component cluster ...
Starting component `cluster`: /root/.tiup/components/cluster/v1.12.3/tiup-cluster display tidb-test
Cluster type: tidb
Cluster name: tidb-test
Cluster version: v6.1.0
Deploy user: root
SSH type: builtin
Dashboard URL: http://192.168.16.13:2379/dashboard
ID Role Host Ports OS/Arch Status Data Dir Deploy Dir
-- ---- ---- ----- ------- ------ -------- ----------
192.168.16.13:8300 cdc 192.168.16.13 8300 linux/x86_64 Up /tidb-data/cdc-8300 /tidb-deploy/cdc-8300
192.168.16.13:2379 pd 192.168.16.13 2379/2380 linux/x86_64 Up|L|UI /tidb-data/pd-2379 /tidb-deploy/pd-2379
192.168.16.13:4000 tidb 192.168.16.13 4000/10080 linux/x86_64 Up - /tidb-deploy/tidb-4000
192.168.16.13:20160 tikv 192.168.16.13 20160/20180 linux/x86_64 Up /tidb-data/tikv-20160 /tidb-deploy/tikv-20160
Total nodes: 4
up 表示安装成功
2、查看TiCDC节点信息
[root@tidb2 ~]# tiup ctl:v6.1.0 cdc capture list --pd=http://192.168.16.13:2379
Starting component `ctl`: /root/.tiup/components/ctl/v6.1.0/ctl cdc capture list --pd=http://192.168.16.13:2379
[
{
"id": "1713c29a-6591-40b1-b624-3bccae110eb4",
"is-owner": true,
"address": "192.168.16.13:8300"
}
]
# pd可以是任意节点
# is-owner : true 表示当前节点TiCDC的owner节点
3、数据准备
目的: 上游插入数据后,下游能同步接收
- TiDB端(上游)
mysql> select * from sales;
Empty set (0.00 sec)
- mysql端(下游)
mysql> select * from sales;
Empty set (0.00 sec)
4、开启数据同步任务
进入刚刚部署的TiCDC节点,开启数据同步任务
[root@tidb2 bin]# ./cdc cli changefeed create --pd=http://192.168.16.13:2379 --sink-uri="mysql://dm:123456@192.168.16.13:3306/" --changefeed-id="replication-task-1" --sort-engine="unified"Create changefeed successfully!
ID: replication-task-1
Info: {"upstream-id":0,"sink-uri":"mysql://dm:123456@192.168.16.13:3306/","opts":{},"create-time":"2023-07-04T10:00:01.368752155-04:00","start-ts":442624691740082177,"target-ts":0,"admin-job-type":0,"sort-engine":"unified","sort-dir":"","config":{"case-sensitive":true,"enable-old-value":true,"force-replicate":false,"check-gc-safe-point":true,"filter":{"rules":["*.*"],"ignore-txn-start-ts":null},"mounter":{"worker-num":16},"sink":{"dispatchers":null,"protocol":"","column-selectors":null,"schema-registry":""},"cyclic-replication":{"enable":false,"replica-id":0,"filter-replica-ids":null,"id-buckets":0,"sync-ddl":false},"consistent":{"level":"none","max-log-size":64,"flush-interval":1000,"storage":""}},"state":"normal","error":null,"sync-point-enabled":false,"sync-point-interval":600000000000,"creator-version":"v6.1.0"}
--sink-uri="mysql://dm:123456@192.168.16.13:3306" : 下游mysql用户密码 数据库地址和端口
--changefeed-id="replication-task-1": 任务ID
--sort-engine="unified" : 不指定引擎
5、查询任务
[root@tidb2 bin]# ./cdc cli changefeed list --pd=http://192.168.16.13:2379
[
{
"id": "replication-task-1",
"summary": {
"state": "normal", # state: normal 表示任务状态正常
"tso": 442624473383829505, # 表示当前任务的时间戳信息
"checkpoint": "2023-07-04 09:46:08.316", # 表示当前同步任务的时间
"error": null
}
}
]
6、查看复制任务的详细信息
[root@tidb2 bin]# ./cdc cli changefeed query --pd=http://192.168.16.13:2379 --changefeed-id=replication-task-1
{
"info": {
"upstream-id": 0,
"sink-uri": "mysql://dm:123456@192.168.16.13:3306/",
"opts": {},
"create-time": "2023-07-04T10:00:01.368752155-04:00",
"start-ts": 442624691740082177,
"target-ts": 0,
"admin-job-type": 0,
"sort-engine": "unified",
"sort-dir": "",
"config": {
"case-sensitive": true,
"enable-old-value": true,
"force-replicate": false,
"check-gc-safe-point": true,
"filter": {
"rules": [
"*.*"
],
"ignore-txn-start-ts": null
},
"mounter": {
"worker-num": 16
},
"sink": {
"dispatchers": null,
"protocol": "",
"column-selectors": null,
"schema-registry": ""
},
"cyclic-replication": {
"enable": false,
"replica-id": 0,
"filter-replica-ids": null,
"id-buckets": 0,
"sync-ddl": false
},
"consistent": {
"level": "none",
"max-log-size": 64,
"flush-interval": 1000,
"storage": ""
}
},
"state": "normal",
"error": null,
"sync-point-enabled": false,
"sync-point-interval": 600000000000,
"creator-version": "v6.1.0"
},
"status": {
"resolved-ts": 442624718698184705,
"checkpoint-ts": 442624718436302849,
"admin-job-type": 0
},
"count": 0,
"task-status": []
}
7、数据验证
mysql> select * from sales;
+----+-------+------+
| id | pname | cnt |
+----+-------+------+
| 1 | xx | 100 |
+----+-------+------+
1 row in set (0.01 sec)
缩容当前TiCDC节点
1、停止同步任务
[root@tidb2 bin]# ./cdc cli changefeed pause --pd=http://192.168.16.13:2379 --changefeed-id=replication-task-1
2、删除同步任务
[root@tidb2 bin]# ./cdc cli changefeed remove --pd=http://192.168.16.13:2379 --changefeed-id=replication-task-1
3 缩容当前TiCDC节点
tiup cluster scale-in tidb-test --node=192.168.16.13:8300