MySQL CDC源表详解
MySQL的CDC(Change Data Capture)源表,即流式源表,是一种用于捕捉数据库中数据变化的技术,它通过读取数据库的历史全量数据,并平滑切换到Binlog日志读取上,确保数据的完整读取,CDC源表可以保证Exactly Once语义,即不多读一条也不少读一条数据。
DDL定义与WITH参数
DDL定义
CREATE TABLE mysqlcdc_source ( order_id INT, order_date TIMESTAMP(0), customer_name STRING, price DECIMAL(10, 5), product_id INT, order_status BOOLEAN ) WITH ( 'connector' = 'mysql-cdc', 'hostname' = 'your_host', 'port' = '3306', 'username' = 'your_username', 'password' = 'your_password', 'database-name' = 'your_database', 'table-name' = 'your_table' );
WITH参数说明
参数 | 是否必选 | 默认值 | 数据类型 | 说明 |
connector | 是 | 无 | String | 连接器类型,需配置为mysql-cdc 。 |
hostname | 是 | 无 | String | MySQL数据库的IP地址或者Hostname。 |
username | 是 | 无 | String | MySQL数据库的用户名。 |
password | 是 | 无 | String | MySQL数据库的密码。 |
database-name | 是 | 无 | String | 访问的数据库名称,支持正则表达式以读取多个数据库的数据,flink(.*)表示以flink开头的数据库名。 |
table-name | 是 | 无 | String | 访问的表名,支持正则表达式以读取多个表的数据,cdc_order(.*)表示以cdc_order开头的表名。 |
port | 否 | 3306 | Integer | MySQL数据库的端口号。 |
server-id | 否 | 5400~6000随机值 | String | 数据库客户端的一个数字ID,该ID必须是MySQL集群中全局唯一的,建议针对同一个数据库的每个作业都设置一个不同的ID,默认会随机生成一个5400~6400的值。 |
scan.startup.mode | 否 | initial | String | 消费数据时的启动模式,initial(默认):在第一次启动时,先扫描历史全量数据,然后读取最新的Binlog数据,latest-offset:在第一次启动时,不会扫描历史全量数据,直接从Binlog的末尾(最新的Binlog处)开始读取,即只读取该Connector启动以后的最新变更。 |
server-time-zone | 否 | 无 | String | 数据库在使用的会话时区,Asia/Shanghai。 |
pwd_auth_name | 否 | 无 | String | DLI侧创建的Password类型的跨源认证名称,使用跨源认证则无需在作业中配置账号和密码。 |
注意事项
1、全局读锁影响:在全量读取MYSQL CDC源表时,Checkpoint不生效,不建议开启自动调优,全局读锁阶段会去获取Binlog位点以及表的schema,持锁耗时与表的数量成正比,可能对线上业务造成影响,如果希望跳过锁阶段且能容忍非Exactly Once语义,可以通过增加debezium.snapshot.locking.mode='none'
属性来显式跳过锁阶段。
2、唯一Server ID:每个同步数据库数据的客户端都需要有唯一的Server ID,以避免Binlog位点错乱和多读或少读数据的问题,建议通过动态Hints在每个CDC作业中配置不同的SERVER ID。
3、大表处理:在扫描全表阶段无法执行checkpoint,因此建议当表超大时,为了避免因checkpoint超时导致作业失败,可以配置合适的checkpoint间隔时间和失败容忍次数。
4、权限要求:MySQL CDC Connector需要特定的权限(包括SELECT、RELOAD、SHOW DATABASES、REPLICATION SLAVE和REPLICATION CLIENT)来读取全量和增量数据。
常见问题解答
Q1: 如何在Flink SQL中使用多个MySQL CDC源表进行关联操作?
A1: 在Flink SQL中使用多个MySQL CDC源表进行关联操作时,需要注意以下几点:
确保数据源发生了变更。
设置正确的关联条件以确保左右表能正确关联起来。
确保写入目标表的操作配置正确。
如果包含时间属性,需要在查询中明确指定时间属性的使用。
考虑并发冲突的情况,并适当设置窗口或状态管理来处理并发冲突。
如果使用了窗口聚合,由于MySQL CDC源表不支持定义Watermark,可能需要采用其他方式来处理时间语义。
Q2: 如何解决多个CDC作业导致的数据库压力过大问题?
A2: 当多个CDC作业导致数据库压力过大时,可以考虑以下解决方案:
调整Binlog Dump位置:确保Binlog Dump的位置在源表的数据范围内,避免不必要的数据传输。
使用API实现多表同步:研究社区提供的API来实现多表同步的功能。
动态新增表功能:利用Flink CDC的动态新增表功能,在业务需求变化时不需要重启整个作业。
优化MySQL服务器配置:设置多个binlog线程以并发处理多个表的变更事件;使用负载均衡、缓存技术等提高MySQL服务器性能。
将表同步到Kafka消息队列中:通过将表同步到Kafka消息队列中进行解耦,减少数据库的压力。
小编有话说
MySQL CDC源表作为实时数据同步的重要工具,在大数据和流处理领域发挥着关键作用,通过合理配置和使用CDC源表,我们可以高效地捕捉数据库中的数据变化并将其应用于各种实时数据处理场景中,在使用过程中也需要注意一些细节和潜在问题如全局读锁的影响、唯一Server ID的配置以及大表处理等,希望本文能够帮助读者更好地理解和应用MySQL CDC源表技术解决实际问题。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1397104.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复