为了从TiDB实时同步数据到PostgreSQL,就需要捕获数据的变化,TiDB提供了TiCDC。TiCDC的介绍和安装方法可参考官网(https://docs.pingcap.com/zh/tidb/v5.4/ticdc-overview)。TiCDC并不支持PostgreSQL做为下游输出,但可以通过TiCDC 开放数据协议或者TiCDC Canal-JSON Protocol将变化数据同步到kafka,然后通过消费kafka队列解析相关数据同步到PostgreSQL中。本篇内容只涉及TiCDC的相关配置,相关程序设计的内容后面会单独写一篇做说明。
一、配置kafka topic
bin/kafka-topics.sh --create--topic ticdc_test --bootstrap-server192.168.0.1:9092,192.168.0.2:9092,192.168.0.3:9092 --config retention.hours=48
在kafka集群中创建topic ticdc_test,消息有效期48小时,如果不加--config retention.hours=48,则默认有效期为7天。
二、创建ticdc配置文件
这里假设需要同步mydb库到kafka,创建changefeed.toml,内容如下:
cat changefeed.toml # 指定配置文件中涉及的库名、表名是否为大小写敏感# 该配置会同时影响 filter 和 sink 相关配置,默认为 truecase-sensitive =true# 是否输出 old value,从 v4.0.5 开始支持enable-old-value =trueforce-replicate =true[filter] # 忽略指定 start_ts 的事务ignore-txn-start-ts = [1, 2] # 过滤器规则# 过滤规则语法:https://docs.pingcap.com/zh/tidb/stable/table-filter#表库过滤语法rules = ['mydb.*', '!test.*'] [mounter] # mounter 线程数,用于解码 TiKV 输出的数据worker-num =8[sink] # 对于 MQ 类的 Sink,可以通过 dispatchers 配置 event 分发器# 支持 default、ts、rowid、table 四种分发器,分发规则如下:# - default:有多个唯一索引(包括主键)时按照 table 模式分发;只有一个唯一索引(或主键)按照 rowid 模式分发;如果开启了 old value 特性,按照 table 分发# - ts:以行变更的 commitTs 做 Hash 计算并进行 event 分发# - rowid:以所选的 HandleKey 列名和列值做 Hash 计算并进行 event 分发# - table:以表的 schema 名和 table 名做 Hash 计算并进行 event 分发# matcher 的匹配语法和过滤器规则语法相同dispatchers = [ {matcher = ['mydb.*'], dispatcher ="ts"}, # {matcher = ['test3.*', 'test4.*'], dispatcher = "rowid"},] # 对于 MQ 类的 Sink,可以指定消息的协议格式# 目前支持 default、canal、avro 和 maxwell 四种协议。default 为 TiCDC Open Protocol# 我们使用canal-json协议protocol ="canal-json"[cyclic-replication] # 是否开启环形同步# enable = false# 当前 TiCDC 的复制 IDreplica-id =1# 需要过滤掉的同步 ID#filter-replica-ids = [2,3]# 是否同步 DDL#sync-ddl = true
创建ticdc同步任务:
tiup ctl:v5.4.2 cdc changefeed create --pd=http://pd1:2379,http://pd2:2379,http://pd3:2379 --sink-uri="kafka://192.168.0.1:9092,192.168.0.2:9092,192.168.0.3:9092/ticdc-zmd_dev?protocol=canal-json&kafka-version=2.7.0&partition-num=1&max-message-bytes=67108864&replication-factor=3"--start-ts=xxxxxxxx --config changefeed.toml
--replication-factor指定副本数,生产环境一定要指定3副本,否则kafka挂掉又没及时发现就头疼了!
--pd的数目及地址根据自己tidb的配置设定。
--start-ts的取值需要根据自己的情况,指定开始同步的时间,如果不指定,则默认为当前时间。这个怎么设置,后面还有专门的文章详细说明。
三、ticdc日常使用
# 查看目前的同步任务及状态tiup cdc cli changefeed list --pd=http://pd1:2379,http://pd2:2379,http://pd3:2379 # 暂停指定ID的任务tiup cdc cli changefeed pause --pd=http://pd1:2379,http://pd2:2379,http://pd3:2379 --changefeed-id xxxxxxxx # 恢复指定ID的任务tiup cdc cli changefeed pause --pd=http://pd1:2379,http://pd2:2379,http://pd3:2379 --changefeed-id xxxxxxxx # 删除指定ID的任务(慎用)tiup cdc cli changefeed remove --pd=http://pd1:2379,http://pd2:2379,http://pd3:2379 --changefeed-id xxxxxxxx --force