TiDB CDC的原理主要基于以下几种技术:
1. 基于TiKV Key-Value的CDC(最常用)
TiCDC架构简介
- TiDB内置的变更数据捕获组件
- 基于TiKV的Key-Value存储和多版本并发控制(MVCC)
- 通过拉取TiKV的变更日志实现CDC
工作原理
SQL操作 → TiDB Server → TiKV (Raft Group) → CDC捕获 → 下游系统
具体流程:
- 事务提交:事务在TiKV中提交,生成MVCC版本
- 日志拉取:TiCDC从TiKV节点拉取变更数据
- 数据排序:根据TSO时间戳对变更进行全局排序
- 数据解析:将Key-Value数据解析为SQL可识别的行变更
- 数据分发:将变更发送到下游系统
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
典型应用场景
- 实时数据同步:TiDB到其他数据库的实时同步
- 数据仓库ETL:实时数据入仓
- 搜索索引更新:同步到Elasticsearch等搜索引擎
- 缓存更新:自动刷新Redis缓存
- 微服务集成:数据库变更作为事件源
- 容灾备份:跨数据中心数据同步
挑战与解决方案
1. 大事务处理
- 挑战:大事务可能阻塞CDC流程
- 解决方案:调整事务大小限制,优化拆分策略
2. DDL同步
- 挑战:DDL操作需要特殊处理
- 解决方案:TiCDC支持DDL同步,但需要注意兼容性
3. 数据积压
- 挑战:高峰时段可能产生数据积压
- 解决方案:水平扩展TiCDC节点,优化资源配置
4. 下游延迟
- 挑战:下游系统处理能力不足
- 解决方案:监控下游延迟,调整批处理参数
TiDB CDC基于TiKV的分布式架构提供了高性能、高可用的变更数据捕获能力,完全兼容TiDB的分布式特性,是TiDB生态中重要的数据同步解决方案。

1640

被折叠的 条评论
为什么被折叠?



