Debezium的使用

1,441 阅读5分钟

一、介绍

Debezium是用于捕获变更数据的开源工具,可以响应数据库的所有插入,更新和删除操作。

它是一种CDC(Change Data Capture)工具,工作原理与大家熟知的Canal,Maxwell一样,均是通过抽取数据库日志来获取变更的。

Debezium构建在Apache Kafka之上,并提供Kafka连接器来监视特定的数据库管理系统。

在今天(2022-12-22),Debezium最新文档版本是2.0: debezium官方站点

二、特点

  1. 使用简单,快速上手
  2. 快速稳定,构建于Kafka之上,可扩展,经官方验证可处理大容量的数据
  3. 能监控多种数据库,MySQL,Oracle,MongoDB,PostgreSQL等

三、服务架构

3.1 Kafka连接器架构

在大多数情况下,会采用如下架构,即Kafka连接器的架构:

image.png Kafka连接器包含2种:

  1. source connector:负责把数据库中的记录发送到Kafka(Debezium)
  2. sink connector:负责把kafka topic中的数据推送到其他系统,如ES等

3.2 Debezium服务架构

image.png Debezium服务器是一个可配置的、随时可用的应用程序,它将变化数据从源数据库流式传输到其他系统。

3.3 嵌入式架构

Debezium作为嵌入式引擎,内置到其他应用中,然后就可以实时读取数据库的变化数据了。目前比较火的Flink CDC,就是内置了Debezium。

四、同步MySQL

4.1 环境准备

4.1.1 MySQL

sudo vim /etc/my.cnf

[mysqld]
server-id=1
log-bin=mysql-bin
binlog_format=row

-- 改完配置文件以后,需要重启mysql
sudo systemctl restart mysqld

-- 然后通过查看变量,查看更改是否生效
show variables like '%log_bin%'

显示如下,说明MySQL准备就绪:

image.png

4.1.2 Zookeeper

备注:其实也可以直接使用Kafka自带的zk,kafka包集成了zk。

下载地址:zookeeper-3.8.0

-- 解压
tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz

-- 新建目录文件,存放zk数据文件,示例如下
mkdir zk-data

-- 复制配置文件
cd conf/
cp zoo_sample.cfg zoo.cfg

-- 编辑配置文件,指定zk数据目录,使用上面创建的目录“zk-data”
vim zoo.cfg

-- 这里是举例,请根据实际修改
dataDir=/data/apache-zookeeper-3.8.0-bin/zk-data

4.1.3 Kafka以及Debezium插件

下载地址:kafka-3.3.1

下载地址:debezium-connector-mysql

-- 解压kafka
tar -zxvf kafka_2.12-3.3.1.tgz
-- 解压debezium插件
unzip debezium-debezium-connector-mysql-1.9.7.zip

-- 新建目录文件,用于存放kafka数据文件,示例如下
mkdir kafka-data

-- 再新建目录文件,用于存放kafka插件目录,示例如下
mkdir kafka-plugin
-- 然后把解压后的debezium文件夹,移动到新建的目录“kafka-plugin”中
mv debezium-debezium-connector-mysql-1.9.7 kafka-plugin/

-- 上面的操作完成之后,目录结构应该是这样
--kafka_2.12-3.3.1
	--config
	--bin
	--kafka-data
	--kafka-plugin
		--debezium-debezium-connector-mysql-1.9.7


-- 编辑kafka启动文件,指定kafka数据目录,使用上面创建的目录“kafka-data”
vim server.properties
-- 这里是举例,请根据实际修改
log.dirs=/data/kafka_2.12-3.3.1/kafka-data
-- 这里是举例,请根据实际修改成kafka部署所在IP和端口
listeners=PLAINTEXT://你的IP:9092


-- 编辑kafka连接器配置文件
vim connect-distributed.properties
-- 这里是举例,请根据实际修改成kafka部署所在IP和端口
bootstrap.servers=你的IP:9092
listeners=HTTP://你的IP:8083
-- 配置插件路径
plugin.path=/data/kafka_2.12-3.3.1/kafka-plugin

4.2 启动

4.2.1 Zookeeper

cd apache-zookeeper-3.8.0-bin/bin
./zkServer.sh start

4.2.2 Kafka以及插件

cd kafka_2.12-3.3.1/bin
./kafka-server-start.sh -daemon ../config/server.properties
./connect-distributed.sh -daemon ../config/connect-distributed.properties

上面的步骤都执行好了之后,会存在3个进程,分别是ZK,Kafka和connectDistributed。

4.3 Debezium请求配置

注意,下面http请求中的IP都是Kafka连接器所在的机子IP,也可以理解成Kafka所在机子的IP。

4.3.1 查看Kafka连接器状态

可以直接在浏览器直接输入如下地址,查看Kafka连接器状态:

http://IP:8083/
-- 正常则会返回如下类似信息
{"version":"3.3.1","commit":"e23c59d00e687ff5","kafka_cluster_id":"DL28VFkTSw-_RgbMtutGXA"}

-- 也可以采用curl的方式查看
-- curl -H "Accept:application/json" IP:8083/

4.3.2 查看注册了哪些连接器

可以直接在浏览器直接输入如下地址,查看配置了哪些连接器:

http://IP:8083/connectors
-- 没有配置则会返回空

-- 也可以采用curl的方式查看
curl -H "Accept:application/json" IP:8083/connectors/

4.3.3 注册MySQL连接器

可以使用postman,方便一些,带上下面的json参数来注册MySQL的连接器,需要设置请求头

POST请求
Accept=application/json
Content-Type=application/json

-- 消息体如下
{
    "name": "mariadb-connector",//名字可以自定义
    "config": {
        "connector.class": "io.debezium.connector.mysql.MySqlConnector",
        "tasks.max": "1",
        "database.hostname": "改成你的Mariadb数据库IP,示例10.20.30.40",
        "database.port": "3306",//改成实际数据库端口
        "database.user": "root",//改成实际数据库用户
        "database.password": "xx",//改成实际数据库密码
        "database.server.id": "184077",//数字可以自定义
        "database.server.name": "acm",//改成实际数据库服务名
        "database.include.list": "acm",//改成实际数据库服务名
        "database.history.kafka.bootstrap.servers": "改成你的kafka信息,示例10.20.30.40:9092",
        "database.history.kafka.topic": "schema-changes.acm",//后面的.acm改成实际数据库服务名
        "include.schema.changes": "true",
        "decimal.handling.mode": "string",
        "include.schema.comments": "false"
    }
}

-- 如果没有postman,则可以使用curl来发送post请求,示例如下:
curl -i -X POST -H "Accept:application/json" -H "Content-Type:application/json" 你的IP:8083/connectors/ -d '{
    "name": "mariadb-connector",
    "config": {
        "connector.class": "io.debezium.connector.mysql.MySqlConnector",
        "tasks.max": "1",
        "database.hostname": "127.0.0.1",
        "database.port": "3306",
        "database.user": "root",
        "database.password": "xxx",
        "database.server.id": "184077",
        "database.server.name": "acm",
        "database.include.list": "acm",
        "database.history.kafka.bootstrap.servers": "127.0.0.1:9092",
        "database.history.kafka.topic": "schema-changes.acm",
        "include.schema.changes": "true",
        "decimal.handling.mode": "string",
        "include.schema.comments": "false"
    }
}'

4.3.4 连接器状态检查

比如上面注册的连接器名字为mariadb-connector,直接在浏览器输入地址,就可以查看连接器信息:

http://IP:8083/connectors/mariadb-connector/status

-- 如果要在服务器上操作
curl -i IP:8083/connectors/mariadb-connector/status

4.3.5 查看连接器配置

还是以上面注册的mariadb-connector举例,在浏览器输入如下地址,查看注册的配置信息:

http://IP:8083/connectors/mariadb-connector/config

-- 如果要在服务器上操作
curl -i IP:8083/connectors/mariadb-connector/config

4.3.6 删除连接器

可以使用postman发起delete请求,后面跟上注册器的名字,如下图所示:

image.png

-- 如果要在服务器上操作
curl -v -X DELETE IP:8083/connectors/mariadb-connector