TiDB-cdc原理

TiDB CDC的原理主要基于以下几种技术:

1. 基于TiKV Key-Value的CDC(最常用)

TiCDC架构简介

  • TiDB内置的变更数据捕获组件
  • 基于TiKV的Key-Value存储和多版本并发控制(MVCC)
  • 通过拉取TiKV的变更日志实现CDC

工作原理

SQL操作 → TiDB Server → TiKV (Raft Group) → CDC捕获 → 下游系统

具体流程:

  1. 事务提交:事务在TiKV中提交,生成MVCC版本
  2. 日志拉取:TiCDC从TiKV节点拉取变更数据
  3. 数据排序:根据TSO时间戳对变更进行全局排序
  4. 数据解析:将Key-Value数据解析为SQL可识别的行变更
  5. 数据分发:将变更发送到下游系统

2. 基于TiDB Binlog的CDC(旧版本)

TiDB Binlog简介

  • TiDB早期的数据同步工具
  • 收集每个TiDB实例的binlog
  • 通过Pump和Drainer组件进行数据同步

工作原理

TiDB Server → Pump → Drainer → 下游系统

TiCDC核心架构

TiCDC组件

// TiCDC主要包含三个组件:
1. Capture:工作节点,负责数据同步任务
2. Processor:处理单元,负责具体的表同步
3. Sorter:排序器,保证变更数据顺序

数据流架构

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│             │    │             │    │             │
│   TiKV节点   │───▶│  TiCDC      │───▶│   下游系统   │
│             │    │  Capture    │    │             │
└─────────────┘    └─────────────┘    └─────────────┘
       │                    │                    │
       │                    │                    │
┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│             │    │             │    │             │
│   TiKV节点   │───▶│  TiCDC      │───▶│   消息队列   │
│             │    │  Processor  │    │             │
└─────────────┘    └─────────────┘    └─────────────┘

关键技术点

1. TSO时间戳管理

  • TiDB使用PD(Placement Driver)分配全局唯一的时间戳
  • 通过TSO保证分布式事务的全局顺序
  • CDC基于TSO实现跨节点的数据一致性

2. 变更数据捕获

-- 启用TiCDC changefeed
CREATE CHANGEFEED FOR 
    'job_id' = 'cf1',
    'sink_uri' = 'kafka://127.0.0.1:9092/topic?protocol=canal-json';

-- 查询changefeed状态
SELECT * FROM information_schema.tidb_cdc_changefeed;

3. KV数据解析

  • TiDB中表数据以Key-Value形式存储在TiKV中
  • Key格式:t{tableID}_r{rowID}
  • Value格式:存储行数据的序列化形式
  • CDC需要解析KV数据还原为SQL行数据

4. Resolved TS机制

  • 定期发送Resolved Timestamp
  • 表示该时间点之前的所有数据都已捕获
  • 用于保证数据的一致性和完整性

配置和使用

TiCDC基本配置

-- 1. 启动TiCDC节点
./cdc server --pd=http://127.0.0.1:2379

-- 2. 创建changefeed
curl -X POST http://127.0.0.1:8300/api/v1/changefeeds \
  -H "Content-Type: application/json" \
  -d '{
    "changefeed_id": "test-cf",
    "sink_uri": "kafka://127.0.0.1:9092/cdc-test",
    "config": {
      "filter_rules": ["test.*"],
      "ignore_txn_start_ts": [],
      "check_gc_safe_point": true
    }
  }'

常用sink配置

-- Kafka sink
'sink_uri' = 'kafka://127.0.0.1:9092/topic?protocol=canal-json'

-- MySQL sink  
'sink_uri' = 'mysql://root:password@127.0.0.1:3306/'

-- 文件sink
'sink_uri' = 'file:///tmp/cdc-data?protocol=csv'

TiCDC核心特性

1. 分布式架构

  • 多个TiCDC节点可以水平扩展
  • 自动负载均衡和故障转移
  • 支持大规模集群的数据同步

2. 数据一致性

  • 提供至少一次交付语义
  • 支持事务原子性
  • 保证跨表事务的一致性

3. 故障恢复

  • 基于Checkpoint的断点续传
  • 自动从PD获取GC safe point
  • 避免数据丢失

具体实现示例

创建changefeed的完整流程

-- 1. 检查TiCDC服务状态
SELECT * FROM information_schema.tidb_cdc_capture;

-- 2. 创建changefeed
CREATE CHANGEFEED FOR 
    'job_id' = 'order_cf',
    'sink_uri' = 'kafka://kafka-server:9092/orders',
    'config' = '{
        "filter_rules": ["order_db.*"],
        "ignore_txn_start_ts": [],
        "check_gc_safe_point": true,
        "sink_config": {
            "dispatch_rules": [
                {
                    "matcher": ["order_db.orders"],
                    "topic": "orders-topic"
                }
            ]
        }
    }';

-- 3. 监控changefeed状态
SELECT * FROM information_schema.tidb_cdc_changefeed WHERE id = 'order_cf';

数据格式示例(Canal-JSON)

{
  "id": 0,
  "database": "test",
  "table": "users",
  "pkNames": ["id"],
  "isDdl": false,
  "type": "INSERT",
  "ts": 1638954180000,
  "sql": "",
  "data": [
    {
      "id": "1",
      "name": "Alice",
      "email": "alice@example.com"
    }
  ],
  "old": null
}

性能优化策略

1. TiCDC配置优化

# ticdc.toml 配置示例
[sorter]
num-concurrent-worker = 16
chunk-size-limit = 1000000

[processor]
enable-old-value = true

[sink]
protocol = "canal-json"

2. 资源分配优化

  • 合理分配TiCDC节点数量
  • 根据数据量调整sorter内存
  • 监控CPU和网络带宽使用

3. 网络优化

  • TiCDC节点与TiKV节点就近部署
  • 使用高速网络连接
  • 调整TCP缓冲区大小

监控与管理

关键监控指标

-- 查看changefeed状态
SELECT * FROM information_schema.tidb_cdc_changefeed;

-- 查看任务处理状态
SELECT * FROM information_schema.tidb_cdc_process;

-- 查看表同步进度
SELECT * FROM information_schema.tidb_cdc_table;

常用运维命令

# 暂停changefeed
cdc cli changefeed pause --pd=http://127.0.0.1:2379 --changefeed-id=test-cf

# 恢复changefeed  
cdc cli changefeed resume --pd=http://127.0.0.1:2379 --changefeed-id=test-cf

# 删除changefeed
cdc cli changefeed remove --pd=http://127.0.0.1:2379 --changefeed-id=test-cf

# 查询节点状态
cdc cli capture list --pd=http://127.0.0.1:2379

典型应用场景

  1. 实时数据同步:TiDB到其他数据库的实时同步
  2. 数据仓库ETL:实时数据入仓
  3. 搜索索引更新:同步到Elasticsearch等搜索引擎
  4. 缓存更新:自动刷新Redis缓存
  5. 微服务集成:数据库变更作为事件源
  6. 容灾备份:跨数据中心数据同步

挑战与解决方案

1. 大事务处理

  • 挑战:大事务可能阻塞CDC流程
  • 解决方案:调整事务大小限制,优化拆分策略

2. DDL同步

  • 挑战:DDL操作需要特殊处理
  • 解决方案:TiCDC支持DDL同步,但需要注意兼容性

3. 数据积压

  • 挑战:高峰时段可能产生数据积压
  • 解决方案:水平扩展TiCDC节点,优化资源配置

4. 下游延迟

  • 挑战:下游系统处理能力不足
  • 解决方案:监控下游延迟,调整批处理参数

TiDB CDC基于TiKV的分布式架构提供了高性能、高可用的变更数据捕获能力,完全兼容TiDB的分布式特性,是TiDB生态中重要的数据同步解决方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clownAdam

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值