首页 > 数据库 >MySQL-变化数据捕获(CDC)

MySQL-变化数据捕获(CDC)

时间:2023-06-07 09:48:20浏览次数:46  
标签:binlog database demo 捕获 CDC MySQL 数据

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

相关文章

  • 4月22日严老师MySQL面试资料
    Mysql面试突击班2讲师:严镇涛1.什么是数据库的事务?下单接口订单表资金表物流表老公:15000-14500=500500-145000-14500老婆:2000+14500=165002000insert+20002000014500+2000=16500事务的定义维基百科的定义:事务是数据库管理系统(DBMS)执行过程中的一个逻辑单......
  • MySQL日志维护与监控脚本
    MySQL数据库的管理维护过程中,MySQL错误日志(MySQLErrorLog)与MySQL慢查询日志(MySQLSlowLog),一般不会自动清理,也不会轮转/切换,这个跟MySQL的二进制日志(binlog)有所不同,所以如果数据库管理员对其不维护的话,这些日志随着时间的推移以及一些特殊原因,一方面日志文件可能会变得非......
  • 如何彻底卸载MySQL 并重装
    一、关闭MySQL服务(1)鼠标右击此电脑-->点击管理 (2)打开“计算机管理”界面,点击“服务和应用程序”-->服务-->MySQL;鼠标右键点击MySQL,点击停止。 二、卸载mysql软件打开【控制面板】,选择【程序和功能】,卸载Mysql相关的软件包。 三、删除MySQL安装目录下相关......
  • 在 MySQL 中,可以通过将插入操作放在事务中并使用 ROLLBACK 语句实现出现异常时全部回
    在MySQL中,可以通过将插入操作放在事务中并使用ROLLBACK语句实现出现异常时全部回滚。示例如下:STARTTRANSACTION;--开始事务INSERTINTOtable_name(column1,column2,...)VALUES(value1,value2,...);INSERTINTOtable_name(column1,column2,...)VALUES(val......
  • MySQL存储引擎
    一:存储引擎概念存储引擎其实就是对于数据库文件的一种存取机制,如何实现存储数据,如何为存储的数据建立索引以及如何更新,查询数据等技术实现的方法。MySQL中的数据用各种不同的方式存储在文件(或内存)中,每一种存储的方式都使用不同的存储机制,索引技巧等,最终提供广泛的不同功能和......
  • RDS 、HDFS、 mapreduce 、spark 、hive、 hbase 、zookeeper 、kafka 、flume、mysql
    这些技术是大数据领域的常用组件,它们之间的配置文件依赖关系如下:RDS是一种关系型数据库,可以独立安装和使用,不需要依赖其他组件。HDFS是Hadoop分布式文件系统,通常与MapReduce一起使用。在Hadoop集群中,HDFS需要配置core-site.xml和hdfs-site.xml两个文件,其中core-site......
  • 202306062001-《远程Linux服务器——安装tomcat8、jdk1.8、mysql5——mysql 用sql建表
    因createtable...提示格式错误,什么NAME啊...,必查了一下,要设置,好多条语句(5条左右),是设置格式的。 但设置完了,说重启mysql,就失效,要重新设置(5条sql重新执行一遍!) 永久有效的解决办法是:修改“my.cnf”,我的修改如下:[client]default-character-set=utf8[mysql]default-......
  • mysql 删除 主从信息
    原来配置的是主主同步,后经调整后配置成主从同步,需要清楚主配置上的同步信息, 进入mysqlmysql>slavestop;mysql>resetslave;mysql>changemastertomaster_user='',master_host='',master_password='';结果报错如下:ERROR1210(HY000):IncorrectargumentstoMASTER_HOS......
  • mysql使用efcore实现乐观并发控制
    为了避免多个用户同时操作同一个资源造成的并发冲突问题,通常需要进行并发控制。并发控制分为:乐观和悲观两策略悲观:悲观并发控制一般采用行锁、表锁等排它销对资源进行锁定,确保一个时间点只有一个用户在操作被锁定的资源。 悲观并发控件的使用比较简单,仅对要进行并发控制的资......
  • 熄灯之后的学习——再读《MySQL必知必会》(6)|| 数据过滤
    操作符:用来联结或改变where子句中的子句的关键字。使用and操作符给where子句附加条件:使用or操作符指示检索任一匹配条件:计算次序:任何时候使用具有and和or操作符的where子句时,都应该使用圆括号明确地分组操作符in操作符用来指定条件范围,范围中的每个条件都可以进......