024、数据库管理之数据同步工具TiCDC

news2024/11/25 2:05:04

TiCDC

  • TiCDC
    • TiCDC介绍
    • 架构与原理
    • 适用场景
    • 对已有TiDB进行扩容部署
    • TiCDC管理工具
    • TiCDC同步任务
    • 查询所有TiCDC同步任务
    • 查询TiCDC指定的同步任务
    • 管理TiCDC同步任务
    • 动态更新任务
    • 监控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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/718401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode 42-接雨水

解法一:双指针(暴力按列计算) 首先,如果按照列来计算的话,宽度一定是1了,我们再把每一列的雨水的高度求出来就可以了。 可以看出每一列雨水的高度,取决于该列左侧最高的柱子和右侧最高的柱子中…

VMware虚拟机的基本操作:快照和克隆

VMware虚拟机的基本操作 一、虚拟机快照二、克隆 一、虚拟机快照 “快照”是虚拟机磁盘文件(VMDK)在某个点及时的副本。系统崩溃或系统异常,你可以通过使用恢复到快照来保持磁盘文件系统和系统存储。当升级应用和服务器及给它们打补丁的时候…

一桩关于Json序列化引发的惨案(Go系统)

文章目录 前言突然崩了排查问题关于go的json库什么是反射 解决大结构体序列化的性能问题干掉大结构体减少反射使用一些好用的第三方序列化包 自定义序列化 写在最后 前言 一个风和日丽的下午,线上系统突然开始报警(系统温馨提示,您的服务接口…

部署Git服务器

哈喽,大家好,本次为大家演示如何部署git服务器. 首先要准备gitea和phpstudy_pro phpstudy一路nest即可,可以帮你安装mysql和阿帕奇。 登录127.0.0.1:3000注册gitea即可。 如何在上传公钥的时候出现500的错误,加入这句便可解决…

SpringBoot+Vue+Element-ui实现文件下载

目录 1.后端代码部分 2.前端代码部分 3.效果展示 1.后端代码部分 GetMapping("downloadFile")public void downloadFile(RequestParam("filename") String filename,HttpServletResponse response) throws Exception {// 告知浏览器这是一个字节流&…

WebSocket connection to “wss://xxx/xxx“ failed

用了https后,需要用nginx作websocket地址的转发才能使用wss,别直接用端口访问 location /ws/ {proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade"; proxy_pass http://localhost:10001/…

JVM源码剖析之SymbolTable和StringTable

很多读者在观看JVM相关的书籍时会看到SymbolTable和StringTable,书中的三言二语介绍的不是很清楚,并且读者的水平有限,导致无法理解SymbolTable和StringTable。所以特意写此篇图文并茂的文章来彻底理解SymbolTable和StringTable这两张表。 版…

Java面试Day16

1.Dubbo 是什么?是否了解过它的架构设计? Dubbo官网:Apache Dubbo Dubbo是一个高性能、轻量级的开源Java RPC框架,它提供了完整的RPC协议栈,包括服务发布、服务引用、负载均衡、容错、服务治理和服务监控等功能&#…

构造函数使用初始化列表+模板

构造函数使用初始化列表模板 注意对应关系&#xff1a; Stack(int size) ;template<class DataType> inline Stack<DataType>::Stack(int size) : stacksize(size), top(0) {item new DataType[stacksize];if (item ! nullptr) cout << "成功初始化栈&…

再见!Fastjson!

你为何仍用Fastjson&#xff1f; 原因可以说出5678种&#xff0c;总而言之言而总之&#xff0c;你不&#xff08;敢&#xff09;切换的原因或许只有一个&#xff1a;Fastjson的静态方法调用用着省心&#xff1b;最重要的是&#xff0c;对其它JSON库&#xff08;如Jackson/Gson…

【生活分享】《哈姆雷特》· 苏州站 - 一次有趣的音乐剧体验

平时博客里大部分都是写技术相关的文章&#xff0c;感觉内容还是比较单一的&#xff0c;也想分享一下最近的一些有趣的生活~ 6月30号的时候&#xff0c;便订好了徐俊导演编排的7月2号场《哈姆雷特》音乐剧。而实际上&#xff0c;苏州场7月1号就上映了&#xff0c;感觉那天太晚……

C++图形开发(6):落下后能弹起的小球

文章目录 1.重复下落的小球2.落下后能弹起的小球3.能上下反弹的小球4.符合重力的能上下反弹的小球 今天我们来尝试实现一个落地后可以弹起的小球 1.重复下落的小球 首先&#xff0c;我们要来实现一个小球的重复下落 我们知道&#xff0c;在前面的代码中&#xff08;详见C图形…

云his源码:医疗卫生信息系统

伴随着以5G、云计算、大数据、人工智能和物联网等新兴技术的发展&#xff0c;医疗行业也呈现了数字化的发展趋势。如何让医疗领域中的服务提供方、需求方、支付方以及供应链等参与方实现业务协同及数据协同&#xff0c;是目前医疗行业所需的能力。 HIS系统&#xff0c;即“医疗…

点云数据分类及滤波方法

如何获取点云数据 传统的点云获取技术包括非接触式测量和接触式测量两种&#xff0c;它们的主要区别在于&#xff0c;在测量过程中测头是否与工件的表面相接触。 非接触式测量是利用光学原理的方法采集数据&#xff0c;例如结构光法、测距法以及干涉法等。该方法的优点在于测…

vue项目中的vue.config.js配置文件中的proxy代理post一直在预检

记录一个比较有意思的bug,帮别人调试遇到的&#xff0c;一个哥们一直在群里问了好几次同一个问题了&#xff0c;他配置了代理&#xff0c;请求一直在发送&#xff0c;postman测试没问题&#xff0c;可以成功接收到&#xff0c;但是在项目前端请求&#xff0c;确实一点响应没有&…

黑芝麻智能科技、上海紫先面试(部分)(未完全解析)

黑芝麻智能科技 Hystrix可以限流吗&#xff1f;客户端限流&#xff0c;是限制对下游&#xff08;被调用方&#xff09;的访问&#xff0c;不是对本服务限流。从HystrixCommand的.withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)也可以看出来&#xff0c…

C++ -- 异常

文章目录 1. C语言传统处理2. C异常概念3. 异常的使用3.1 异常抛出并没有被捕获3.2 正确使用3.3 捕获异常采用类型匹配就近原则3.4 catch(...)可以捕获任意类型异常3.5 抛出派生类对象使用基类捕获3.6 异常重新抛出3.7 匹配规则3.8 异常规范3.9 异常安全 4. 自定义异常体系5. 异…

05.动态协议OSPF基础

文章目录 **OSPF简介****OSPF和RIP的区别****RIPV2和OSPFV2相同点****不同点** OSPF基础概念OSPF区域OSPF路由类型区域划分的要求**OSPF多区域****Router ID****Router ID选取规则****度量值** OSPF数据包OSPF状态机条件匹配 OSPF的工作过程OSPF基本配置**OSPF的拓展配置** OSP…

番外12:获取晶体管漏极电流源平面的仿真波形

番外12&#xff1a;获取晶体管漏极电流源平面的仿真波形 老是有同学反应&#xff0c;仿真中无法获取漏极电流源平面的仿真波形&#xff0c;在此给出解释与解决办法。 1、ADS能够访问到部分器件的电流源平面波形 对于某些器件&#xff0c;比如说CGH40010F&#xff0c;可以在仿…

硬核了解一下内核链表

一&#xff0c;内核链表定义 言以蔽之&#xff0c;内核链表就是个带头结点的循环双链表。 普通的链表是将next指针定义成为与该结构体一样的类型&#xff0c;这样做通用性不好。与普通的链表的定义和使用方式不一样&#xff0c;内核的链表定义成为了一种通用的结构&#xff1a…