MySQL CDC (Change Data Capture),中文名为MySQL变化数据捕获,是一种截取MySQL主从复制流中binlog的技术,从而实时捕获数据库中的增、删、改操作。在大数据、实时计算、数据集成等领域都有广泛应用。本文将从多个方面对MySQL CDC做详细阐述,让你全面了解其背后的原理和应用场景。
一、基本原理
MySQL CDC的基本原理是使用MySQL提供的binlog,通过解析binlog中的事件来得到数据库中的增、删、改操作。具体实现步骤如下:
1、首先在MySQL中通过配置参数启用binlog,使得MySQL开始记录MySQL实例的所有数据更改操作;
[mysqld] log-bin=mysql-bin binlog-format=ROW binlog-row-image=full
2、使用支持MySQL协议的binlog消费者(如Debezium、Maxwell等)连接到MySQL实例的binlog,并开始实时从binlog中截取数据;
3、解析binlog内容,获取其中的事务和事务中对数据进行的操作;
{ "database": "testdb", "table": "user", "type": "insert", "ts": 1633093513, "xid": 1, "commit": 1, "data": { "id": "1", "name": "张三", "age": 24 } }
4、将解析后的数据推送到下游处理过程(如实时计算引擎、数据仓库、缓存等)。
二、应用场景
MySQL CDC的应用场景广泛,下面介绍其中几个典型应用场景。
1、实时数据同步
当企业应用系统需要将MySQL的数据同步到其他数据源(如缓存、数据仓库、搜索引擎等)时,可以使用MySQL CDC实现实时数据同步。通过截取MySQL主从复制流中的binlog,将数据实时同步到其他目标数据源,实现数据的最新状态。
2、实时计算
MySQL CDC可以将数据变更事件实时推送到流式计算引擎(如Apache Flink、Apache Spark等)进行实时计算和分析。通过将实时计算的结果写回MySQL中,可以实现实时的数据统计、分析和决策。
3、数据集成
MySQL CDC可作为数据集成的中间层,通过解析binlog实现异构数据的读取和写入。例如可以将MySQL中的数据同步到MongoDB中,或将Kafka中的数据写入MySQL中。这样,在各个数据系统之间就可以实现快速、实时、可靠的数据集成。
三、实战案例
下面通过一个简单的实战案例来介绍如何使用MySQL CDC实现实时数据同步。
1、安装Debezium Connector
Debezium Connector是一种流行的开源的CDC实现,支持从MySQL、PostgreSQL等关系型数据库中提取数据变更并将其广播到Kafka。如下是使用Docker安装Debezium Connector:
docker run -it --rm --name debezium -p 8083:8083 debezium/connect
2、创建MySQL实例和新表
create database demo; use demo; create table user ( id int primary key auto_increment, name varchar(50) not null, age int not null );
3、启用binlog
在MySQL的配置文件中,设置启用binlog:
[mysqld] log-bin=mysql-bin binlog-format=ROW binlog-row-image=full
然后重启MySQL实例,使binlog参数生效。
4、创建Debezium连接
执行以下curl命令,创建与MySQL实例的连接。
curl -i -X POST -H "Accept:application/json" -H "Content-Type:application/json" localhost:8083/connectors/ -d ' { "name": "demo-connector", "config": { "connector.class": "io.debezium.connector.mysql.MySqlConnector", "database.hostname": "mysql", "database.port": "3306", "database.user": "root", "database.password": "root", "database.server.id": "1", "database.server.name": "test", "database.include.list": "demo", "table.include.list": "demo.user", "database.history.kafka.bootstrap.servers": "kafka:9092", "database.history.kafka.topic": "schema-changes.demo" } }'
5、查看数据变更
现在我们可以通过监控Kafka中的实时数据变更事件来捕获MySQL的数据变更信息了。执行以下命令,查看demo.user表的变更事件:
docker run -it --rm --name debezium-toolkit --link debezium:kafka --network mysql-cdc_default debezium/tooling debezium-connector-mysql/bin/mysqlbinlog --raw --verbose -d demo -t user --schema=test --host=kafka --port=9092
在另一个终端窗口中,进行如下的MySQL插入操作,向demo.user表中插入一条数据:
use demo; insert into user(name, age) values('john', 18);
插入完成后,Debezium即会输出以下信息表示成功推送该数据变更:
#...chunk of binlog...
{ "database": "demo", "table": "user", "type": "insert", "ts": 1633093513, "xid": 1, "commit": 1, "data": { "id": "1", "name": "john", "age": 18 } }
四、总结
MySQL CDC通过解析MySQL主从复制流中的binlog,捕获并推送数据库中的数据变更事件,为实时数据同步、实时计算和数据集成提供了有效手段。但在使用MySQL CDC时,需要注意以下几个方面:
1、binlog性能开销。当binlog文件过大时,可能会对MySQL实例造成性能开销;
2、并发访问和数据同步。使用MySQL CDC实现数据同步时,需要考虑多个数据源、并发访问、重复数据等问题;
3、CDC数据的精确度。使用MySQL CDC捕获变化数据时,需要考虑数据变更的精确度,例如在UPDATE语句中SET字段的顺序可能对捕获的结果产生影响。
标签:binlog,database,demo,捕获,CDC,MySQL,数据 From: https://www.cnblogs.com/yeyuzhuanjia/p/17462461.html