使用debezium同步mysql数据到kafka

环境:
kafka:kafka_2.13-3.1.0
jdk:1.8
部署方式:3个节点组成的kafka集群

1.下载介质包

wget https://maven.aliyun.com/repository/public/io/debezium/debezium-connector-mysql/1.9.7.Final/debezium-connector-mysql-1.9.7.Final-plugin.tar.gz

 

2.创建插件目录
每个节点都需要操作
mkdir -p /opt/kafka/connect/plugins

 

3.解压到插件目录
每个节点都需要操作
tar -zxvf /soft/debezium-connector-mysql-1.9.7.Final-plugin.tar.gz -C /opt/kafka/connect/plugins

 

4.配置文件

vi /opt/kafka/config/connect-distributed.properties

# 插件路径
plugin.path=/opt/kafka/connect/plugins

# 3节点kafka集群地址,三台机器配置一模一样
bootstrap.servers=192.168.1.134:9092,192.168.1.135:9092,192.168.1.136:9092

# 集群组ID,【三台必须完全相同!】
group.id=debezium-connect-cluster

# Connect内部存储topic,三台保持一致
config.storage.topic=connect_configs
offset.storage.topic=connect_offsets
status.storage.topic=connect_statuses

# 消息转换器
key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable=false
value.converter.schemas.enable=false

# REST服务监听,本机地址
listeners=http://0.0.0.0:8083
# 重点:每台机器填自己本机IP
rest.advertised.host.name=192.168.1.134
# node2写 192.168.1.135 node3写192.168.1.136
rest.advertised.port=8083

 

拷贝到另外的节点
scp /opt/kafka/config/connect-distributed.properties root@192.168.1.135:/opt/kafka/config/
scp /opt/kafka/config/connect-distributed.properties root@192.168.1.136:/opt/kafka/config/

 

拷贝过去后需要修改的地方
rest.advertised.host.name=192.168.1.135

rest.advertised.host.name=192.168.1.136

 

5.启动
每台节点执行
cd /opt/kafka
/opt/kafka/bin/connect-distributed.sh /opt/kafka/config/connect-distributed.properties

nohup方式
cd /opt/kafka
nohup /opt/kafka/bin/connect-distributed.sh /opt/kafka/config/connect-distributed.properties > connect.log 2>&1 &


查看当前节点
curl http://192.168.1.134:8083/connector-plugins
curl http://192.168.1.135:8083/connector-plugins
curl http://192.168.1.136:8083/connector-plugins

 

6.准备同步文件
准备连接器json文件

vi /opt/kafka/connect/mysql-cdc.json

{
  "name": "mysql-57-cdc",
  "config": {
    "connector.class": "io.debezium.connector.mysql.MySqlConnector",
    "tasks.max": "1",
    "database.hostname": "192.168.1.14",
    "database.port": "3306",
    "database.user": "flink",
    "database.password": "flink",
    "database.server.id": "184054",
    "database.server.name": "mytestdb",
    "database.include.list": "db_admin",
    "table.include.list": "db_admin.user,db_admin.user01",
    "database.history.kafka.bootstrap.servers": "192.168.1.134:9092,192.168.1.135:9092,192.168.1.136:9092",
    "database.history.kafka.topic": "mytestdb_history",
    "snapshot.mode": "initial",
    "snapshot.locking.minimal": "true",
    "database.allowPublicKeyRetrieval": "true"
  }
}

 

创建topic:mytestdb.history
在kafka其中一台机器上执行
/opt/kafka/bin/kafka-topics.sh --create --topic mytestdb_history \
--bootstrap-server 192.168.1.134:9092,192.168.1.135:9092,192.168.1.136:9092 \
--partitions 1 --replication-factor 3

 

7.同步账号赋予最小权限

mysql> show grants for flink@'%';
+---------------------------------------------------------------------------+
| Grants for flink@%                                                        |
+---------------------------------------------------------------------------+
| GRANT RELOAD, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'flink'@'%' |
| GRANT SELECT, LOCK TABLES, SHOW VIEW ON `db_admin`.* TO 'flink'@'%'       |
+---------------------------------------------------------------------------+
2 rows in set (0.00 sec)

 

8.提交作用
curl -X POST -H "Content-Type:application/json" -d @/opt/kafka/connect/mysql-cdc.json http://192.168.1.134:8083/connectors

 

查看运行情况

[root@host134 connect]# curl -s http://192.168.1.134:8083/connectors/mysql-57-cdc/status | jq .
{
  "name": "mysql-57-cdc",
  "connector": {
    "state": "RUNNING",
    "worker_id": "192.168.1.134:8083"
  },
  "tasks": [
    {
      "id": 0,
      "state": "RUNNING",
      "worker_id": "192.168.1.134:8083"
    }
  ],
  "type": "source"
}

 

9.若运行错误重新提交
##删除之前的job
curl -X DELETE http://192.168.1.134:8083/connectors/mysql-57-cdc

##删除topic
/opt/kafka/bin/kafka-topics.sh --delete --topic mytestdb_history --bootstrap-server 192.168.1.134:9092,192.168.1.135:9092,192.168.1.136:9092

##重建topic
/opt/kafka/bin/kafka-topics.sh --create --topic mytestdb_history \
--bootstrap-server 192.168.1.134:9092,192.168.1.135:9092,192.168.1.136:9092 \
--partitions 1 --replication-factor 3

##重新提交任务
curl -X POST -H "Content-Type:application/json" -d @/opt/kafka/connect/mysql-cdc.json http://192.168.1.134:8083/connectors

 

10.查看同步数据

##表user
/opt/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server 192.168.1.134:9092,192.168.1.135:9092,192.168.1.136:9092 \
--topic mytestdb.db_admin.user \
--from-beginning

##表user01
/opt/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server 192.168.1.134:9092,192.168.1.135:9092,192.168.1.136:9092 \
--topic mytestdb.db_admin.user01 \
--from-beginning

 

11.数据验证
dml 可同步
ddl
alter table user01 add column name1 varchar(32);
ddl会同步到这个topic:mytestdb_history

/opt/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server 192.168.1.134:9092,192.168.1.135:9092,192.168.1.136:9092 \
--topic mytestdb_history --from-beginning

{
  "source" : {
    "server" : "mytestdb"
  },
  "position" : {
    "transaction_id" : null,
    "ts_sec" : 1790578986,
    "file" : "binlog.000299",
    "pos" : 82614449,
    "gtids" : "3f38e97d-cef5-11ee-a41e-d094667047fb:1-1,89f22099-6f76-11e9-b9b0-d094667047fb:1-4776526",
    "server_id" : 1
  },
  "databaseName" : "db_admin",
  "ddl" : "alter table user01 add column name1 varchar(32)",
  "tableChanges" : [ {
    "type" : "ALTER",
    "id" : "\"db_admin\".\"user01\"",
    "table" : {
      "defaultCharsetName" : "utf8mb4",
      "primaryKeyColumnNames" : [ "id" ],
      "columns" : [ {
        "name" : "id",
        "jdbcType" : -5,
        "typeName" : "BIGINT",
        "typeExpression" : "BIGINT",
        "charsetName" : null,
        "length" : 20,
        "position" : 1,
        "optional" : false,
        "autoIncremented" : true,
        "generated" : true,
        "comment" : null,
        "hasDefaultValue" : false,
        "enumValues" : [ ]
      }, {
        "name" : "name",
        "jdbcType" : 12,
        "typeName" : "VARCHAR",
        "typeExpression" : "VARCHAR",
        "charsetName" : "utf8mb4",
        "length" : 255,
        "position" : 2,
        "optional" : true,
        "autoIncremented" : false,
        "generated" : false,
        "comment" : null,
        "hasDefaultValue" : true,
        "enumValues" : [ ]
      }, {
        "name" : "email",
        "jdbcType" : 12,
        "typeName" : "VARCHAR",
        "typeExpression" : "VARCHAR",
        "charsetName" : "utf8mb4",
        "length" : 255,
        "position" : 3,
        "optional" : true,
        "autoIncremented" : false,
        "generated" : false,
        "comment" : null,
        "hasDefaultValue" : true,
        "enumValues" : [ ]
      }, {
        "name" : "name1",
        "jdbcType" : 12,
        "typeName" : "VARCHAR",
        "typeExpression" : "VARCHAR",
        "charsetName" : "utf8mb4",
        "length" : 32,
        "position" : 4,
        "optional" : true,
        "autoIncremented" : false,
        "generated" : false,
        "comment" : null,
        "hasDefaultValue" : true,
        "enumValues" : [ ]
      } ]
    },
    "comment" : null
  } ]
}

 

posted @ 2026-09-28 15:41  slnngk  阅读(3)  评论(0)    收藏  举报