体验TiDB v6.0.0 之TiCDC
一、背景
TiDBv6.0.0发布具有特殊的意义,顺便体验一把TiCDC。
接上篇从Mysql3306 通过DM迁移数据到TiDB集群中test_dm_all数据库(全量+增量数据同步),本次体验是从TiDB集群的test_dm_all数据库通过TiCDC 同步到Mysql主从集群。
二、基本知识
TiCDC 是一款 TiDB 增量数据同步工具,通过拉取上游 TiKV 的数据变更日志,TiCDC 可以将数据解析为有序的行级变更数据输出到下游。
2.1 TiCDC 适用场景:
- 数据库灾备:TiCDC 可以用于同构数据库之间的灾备场景,能够在灾难发生时保证主备集群数据的最终一致性,目前该场景仅支持 TiDB 作为主备集群。
- 数据集成:TiCDC 提供 TiCDC Canal-JSON Protocol,支持其他系统订阅数据变更,能够为监控、缓存、全文索引、数据分析、异构数据库的主从复制等场景提供数据源。
2.2 组件
-
TiKV CDC 组件:只输出 key-value (KV) change log。
- 内部逻辑拼装 KV change log。
- 提供输出 KV change log 的接口,发送数据包括实时 change log 和增量扫的 change log。
-
TiCDC 集群 多个
capture
组成一个 TiCDC 集群,负责 KV change log 的同步。- 每个
capture
负责拉取一部分 KV change log。 - 对拉取的一个或多个 KV change log 进行排序。
- 向下游还原事务或按照 TiCDC Open Protocol 进行输出。
- 每个
三、环境准备
本示例演示TiDB-(TiCDC)->Mysql集群
3.1 TiDB中的 test_dm_all数据
3.2 Mysql 3307(主库),Mysql 3308(从库)
1、win下 配置好主库(mysql3307) my3307.ini 2、复制mysql3307目录 为mysql3308 3、修改mysql3308的my3308.ini
3.2.1 Mysql配置文件
my3307.ini
#binlog
log-bin=mysql-bin
binlog-format=ROW
server_id=2
binlog_ignore_db=mysql
binlog_do_db=test_dm_all
mysql3308.ini
server_id=3
read_only=1
replicate-do-db=test_dm_all
四、TiCDC实验
4.1 扩容TiCDC节点
4.1.1 编写 scale-out.yaml 文件
cdc_servers:
- host: 10.0.2.15
port: 8300
gc-ttl: 86400
#data_dir: /data/deploy/install/data/cdc-8300
4.1.2 执行扩容命令
# 此处使用local_install.sh没有安装
# 采用的方式是下载使用tiup
# curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
# 在线安装 ticdc
tiup cluster scale-out cluster111 scale-out.yaml
#离线安装 参考 这种方式通过tiup cluster display 看不到cdc集群的信息
cp /usr/local0/webserver/tidb/tidb-community-server-v6.0.0-linux-amd64/cdc /root/.tiup/bin/
cdc server --pd=http://10.0.2.15:2379 --log-file=/tidb-data111/ticdc_8301.log --addr=0.0.0.0:8301 --advertise-addr=127.0.0.1:8301 --data-dir=/tidb-data111/cdc-8301 &
cdc server --pd=http://10.0.2.15:2379 --log-file=/tidb-data111/ticdc_8302.log --addr=10.0.2.15:8302 --advertise-addr=10.0.2.15:8302 --data-dir=/tidb-data111/cdc-8302 &
4.1.3 验证TiCDC集群
cdc cli capture list --pd=http://10.0.2.15:2379
# 因为有8301,8302 两个节点使用的是cdc server方式启动的。
4.2 添加任务
4.2.1 启动mysql3307,mysq3308
mysql3307 执行下面的sql:
show master status;
mysql3308执行下面sql:
show slave status;
stop slave;
CHANGE MASTER TO master_host = '127.0.0.1',
master_user = 'root',
master_password = '23456',
master_log_file = 'mysql-bin.000001',
master_port=3307,
master_log_pos = 154;
start slave;
mysql3307到msql3308的主从同步测试正常。
4.2.2 创建TiCDC任务
cdc cli changefeed create --pd=http://10.0.2.15:2379 --sink-uri="mysql://root:mysql123456@192.168.43.191:3307/?" --changefeed-id="replication-task-1" --sort-engine="unified"
# Error: [CDC:ErrMySQLConnectionError]fail to open MySQL connection: Error 1298: Unknown or incorrect time zone: 'UTC'
# 这是因为下游 MySQL 没有加载时区,可以通过 mysql_tzinfo_to_sql 命令加载时区,加载后就可以正常创建任务或同步任务。
# 查看任务
cdc cli changefeed list --pd=http://10.0.2.15:2379
cdc cli changefeed query --pd=http://10.0.2.15:2379 --changefeed-id=replication-task-1
4.2.3 验证TiDB数据变更是否同步到下游
4.2.4 追加已经数据表
图上的1、是在ticdc任务开始后,新插入了数据到m_user表中,之后再mysql3307中追加m_user表结构,自动从任务开始后补数据;
图上的2和3,表示原始上游有数据,任务开始后没有做数据变更,在mysql3307中追加m_user_new也不会补数据。
4.2.5 使用总结
1、下游要建立对等的数据结构
2、TICDC任务开启后 上游的表在下游不存在,则不同步
3、如果下游追加了表结构则从任务开始时补数据
4、任务开启后的写操作会同步到下游
5、如果下游存在多写入点,会出现数据不一致的情况
五、Clinic 诊断 TiCDC
clinic 没有单独的类似collectdm的组件,
tiup diag collect cluster111
tiup diag pacakge /usr/local0/webserver/tidb/tidb-community-server-v6.0.0-linux-amd64/diag-fSC9vxdLWMk
tiup diag upload /usr/local0/webserver/tidb/tidb-community-server-v6.0.0-linux-amd64/diag-fSC9vxdLWMk.diag
注意:使用cdc server方式启动的节点的信息收集不到。
六、总结
本篇文章简单示例了TiDB通过TiCDC同步数据到下游。TiCDC的强大之处TiCDC 开放数据协议,根据TiCDC 开放数据协议可以同步到下游多种数据媒介。
TiCDC集群会象DM一样也会有对应的WebUI可视化界面,很期待TiCDC的WebUI。
谢谢PingCap,感谢TiDB社区!