一、介绍
Debezium是用于捕获变更数据的开源工具,可以响应数据库的所有插入,更新和删除操作。
它是一种CDC(Change Data Capture)工具,工作原理与大家熟知的Canal,Maxwell一样,均是通过抽取数据库日志来获取变更的。
Debezium构建在Apache Kafka之上,并提供Kafka连接器来监视特定的数据库管理系统。
在今天(2022-12-22),Debezium最新文档版本是2.0: debezium官方站点
二、特点
- 使用简单,快速上手
- 快速稳定,构建于Kafka之上,可扩展,经官方验证可处理大容量的数据
- 能监控多种数据库,MySQL,Oracle,MongoDB,PostgreSQL等
三、服务架构
3.1 Kafka连接器架构
在大多数情况下,会采用如下架构,即Kafka连接器的架构:
Kafka连接器包含2种:
- source connector:负责把数据库中的记录发送到Kafka(Debezium)
- sink connector:负责把kafka topic中的数据推送到其他系统,如ES等
3.2 Debezium服务架构
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准备就绪:
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
-- 解压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请求,后面跟上注册器的名字,如下图所示:
-- 如果要在服务器上操作
curl -v -X DELETE IP:8083/connectors/mariadb-connector