YugabyteDB CDC 入门指南:基于gRPC的数据变更捕获实践
前言
在分布式数据库系统中,实时捕获数据变更(Change Data Capture, CDC)是实现数据同步、ETL流程和事件驱动架构的关键技术。YugabyteDB作为一款高性能的分布式SQL数据库,提供了完善的CDC功能支持。本文将详细介绍如何在YugabyteDB中配置和使用CDC功能。
核心概念
在开始之前,我们需要了解几个关键概念:
- WAL(Write-Ahead Log):YugabyteDB使用WAL记录所有数据变更,CDC正是通过读取WAL来捕获变更事件
- 流ID(Stream ID):每个CDC数据流都有一个唯一标识符
- Before Image:记录变更前的数据状态
- Schema Evolution:处理表结构变更的机制
环境准备
1. 创建数据库流ID
使用yb-admin工具创建CDC流:
yb-admin create_change_data_stream <master_addresses>
注意:当前CDC仅支持YSQL表。
2. 端口配置
确保以下端口开放:
- YB-Master默认端口:7100
- YB-TServer默认端口:9100
3. 磁盘空间监控
由于CDC从WAL读取变更记录,当CDC处理延迟或中断时,WAL可能持续增长。YugabyteDB会自动清理长时间不活动的流,但仍需监控磁盘使用情况。
部署gRPC连接器
1. 获取连接器
下载最新版本的YugabyteDB gRPC连接器。
2. 安装配置
解压并安装到Kafka Connect环境后,进行以下基本配置:
{
"name": "yugabyte-connector",
"config": {
"connector.class": "io.debezium.connector.yugabytedb.YugabyteDBConnector",
"database.hostname": "<yb-tserver-host>",
"database.port": "5433",
"database.user": "yugabyte",
"database.password": "yugabyte",
"database.dbname": "yugabyte",
"database.server.name": "dbserver1",
"table.include.list": "public.*",
"snapshot.mode": "initial"
}
}
数据序列化方案
YugabyteDB CDC支持多种序列化格式:
1. Avro格式
{
"key.converter": "io.confluent.connect.avro.AvroConverter",
"key.converter.schema.registry.url": "http://schema-registry:8081",
"value.converter": "io.confluent.connect.avro.AvroConverter",
"value.converter.schema.registry.url": "http://schema-registry:8081"
}
2. JSON格式
{
"value.serializer": "io.confluent.kafka.serializers.KafkaJsonSerializer",
"value.deserializer": "io.confluent.kafka.serializers.KafkaJsonDeserializer"
}
3. Protobuf格式
{
"key.converter": "io.confluent.connect.protobuf.ProtobufConverter",
"value.converter": "io.confluent.connect.protobuf.ProtobufConverter"
}
Before Image功能详解
Before Image功能记录了数据变更前的状态,对于数据审计和回滚场景非常重要。
启用Before Image
创建CDC流时指定参数:
yb-admin create_change_data_stream <master_addresses> WITH before_image
记录模式
YugabyteDB支持多种Before Image记录模式:
- CHANGE(默认):仅记录变更的列
- ALL:记录完整行数据(变更前后)
- FULL_ROW_NEW_IMAGE:变更后记录完整行
- MODIFIED_COLUMNS_OLD_AND_NEW_IMAGES:记录变更涉及的列(新旧值)
事务内更新处理
对于同一事务内的插入后更新操作,可通过设置TServer标志处理:
--cdc_send_null_before_image_if_not_exists=true
表结构变更处理
YugabyteDB CDC能够处理表结构变更(Schema Evolution),但需注意:
- 添加默认值的ALTER TABLE操作不会触发变更事件
- 连接器会在tablet级别缓存schema
- 执行DDL后,CDC服务会为所有tablet发送新schema记录
共置表处理
YugabyteDB支持从共置表(Colocated Tables)捕获变更。配置方式与普通表相同,但需注意:
- 如果已有连接器在监控共置表集合,新增表需要重新部署连接器
- 更新
table.include.list
配置后需重启连接器
关键配置参数
TServer重要参数
- cdc_intent_retention_ms:意图保留时间(默认4小时)
- cdc_wal_retention_time_secs:WAL保留时间(默认4小时)
- cdc_snapshot_batch_size:快照批次大小(默认250条)
Master重要参数
- cdc_wal_retention_time_secs:WAL保留时间(与TServer同步配置)
最佳实践
- 监控延迟:定期检查CDC处理延迟,避免WAL堆积
- 合理设置保留时间:根据业务需求调整保留参数
- 选择适当序列化格式:权衡性能和可读性需求
- 规划Schema变更:避免频繁的DDL操作影响CDC稳定性
- 容量规划:为WAL预留足够的磁盘空间
总结
YugabyteDB的CDC功能为构建实时数据管道提供了强大支持。通过合理配置和使用Before Image等高级功能,可以满足各类数据同步和分析需求。在实际部署时,建议根据业务特点调整参数,并建立完善的监控机制。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考