Debezium同步MySql数据锁表

本文介绍了解决Debezium同步MySql数据时查询缓慢的问题。提供了两种解决方案:一是设置snapshot.locking.mode为none,但存在数据丢失风险;二是通过解锁或KILL挂起的任务来解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

开启Debezium同步MySql数据任务后,发现查询某个表特别慢,结果迟迟不能返回.

通过

select * from information_schema.`PROCESSLIST` t where t.user = 'username'

查看发现,有大量查询处于 Waiting for table flush 状态

解决方法:

设置snapshot.locking.mode = none解决. 

但有丢数据风险,具体详情可以参考这个issue

找到另一种解决方法还未尝试 :

方案一
根据找到的 user ,host ,db 等信息,找相关人员问清楚,让执行解锁 unlock tables
方案二
确认没问题后进行暴力破解法 KILL , 然后 unlock tables

参考:

Debezium系列- snapshot锁表流程详解_数据新玩法-优快云博客_debezium 锁表

### 使用 Debezium 实现 MySQL 到 Elasticsearch 的实时数据同步 #### 配置概述 Debezium 是一种分布式平台,用于捕获数据库更改并将其发送到其他系统。它支持多种数据库作为源端,并提供灵活的目标端集成方式。要实现从 MySQL 到 Elasticsearch 的实时数据同步,可以按照以下方法完成部署和配置。 --- #### 1. 安装 Apache Kafka 和 Kafka Connect Debezium 基于 Kafka Connect 运行,因此需要先安装 Apache Kafka 及其组件。Kafka 提供消息队列功能,而 Kafka Connect 负责连接不同系统的数据管道。 - 下载并解压 Kafka: ```bash wget https://downloads.apache.org/kafka/3.0.0/kafka_2.13-3.0.0.tgz tar -xzf kafka_2.13-3.0.0.tgz cd kafka_2.13-3.0.0/ ``` - 启动 Zookeeper 和 Kafka Broker: ```bash bin/zookeeper-server-start.sh config/zookeeper.properties & bin/kafka-server-start.sh config/server.properties & ``` --- #### 2. 配置 MySQL 数据库 为了使 Debezium 正确捕捉 MySQL 中的数据变更事件,需启用二进制日志 (Binary Log),并将服务器模式设置为 ROW 格式[^1]。 - 修改 `my.cnf` 文件中的参数如下: ```ini [mysqld] server-id=1 log-bin=mysql-bin binlog-format=ROW gtid_mode=ON enforce_gtid_consistency=true ``` - 创建一个专门用于 CDC(Change Data Capture)的用户账户,并赋予必要的权限: ```sql CREATE USER 'debezium'@'%' IDENTIFIED BY 'dbz'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'debezium'@'%'; FLUSH PRIVILEGES; ``` --- #### 3. 部署 Debezium Connector for MySQL 使用 Kafka Connect 来加载 Debezium MySQL Source Connector。 - 准备 JSON 配置文件 (`mysql-to-elasticsearch.json`): ```json { "name": "inventory-connector", "config": { "connector.class": "io.debezium.connector.mysql.MySqlConnector", "tasks.max": "1", "database.hostname": "localhost", "database.port": "3306", "database.user": "debezium", "database.password": "dbz", "database.server.id": "184054", "database.server.name": "dbserver1", "table.whitelist": "your_database.your_table", "database.history.kafka.bootstrap.servers": "localhost:9092", "database.history.kafka.topic": "schema-changes.inventory" } } ``` - 将上述配置提交给 Kafka Connect REST API: ```bash curl -X POST -H "Content-Type: application/json" --data @mysql-to-elasticsearch.json http://localhost:8083/connectors ``` --- #### 4. 设置 Elasticsearch Sink Connector 为了让 Kafka 中的消息流入 Elasticsearch,还需要配置一个目标端的 Sink Connector。 - 编写另一个 JSON 配置文件 (`elasticsearch-sink.json`): ```json { "name": "elasticsearch-sink", "config": { "connector.class": "io.confluent.connect.elasticsearch.ElasticsearchSinkConnector", "tasks.max": "1", "topics": "dbserver1.your_database.your_table", "key.ignore": "true", "connection.url": "http://localhost:9200", "type.name": "_doc", "schema.ignore": "true" } } ``` - 提交此配置至 Kafka Connect: ```bash curl -X POST -H "Content-Type: application/json" --data @elasticsearch-sink.json http://localhost:8083/connectors ``` --- #### 5. 测试与验证 启动所有服务后,在 MySQL 中插入或更新记录,观察这些操作是否被成功复制到了 Elasticsearch 中。 - 查询 Elasticsearch 索引状态以确认数据已到达: ```bash curl -X GET "http://localhost:9200/_cat/indices?v" ``` 如果一切正常,则说明整个链路已经搭建完毕。 --- #### 注意事项 - 如果遇到延迟问题,可能是因为 Kafka 或网络瓶颈所致,建议优化集群性能。 - 对于大规模生产环境,推荐采用更高级别的架构设计,例如引入 Confluent Schema Registry 改善序列化机制[^3]。 --- ### 示例代码片段 以下是部分关键脚本: ```python import requests def create_connector(config_file_path, connect_url="http://localhost:8083/connectors"): with open(config_file_path, 'r') as file: payload = file.read() headers = {'Content-Type': 'application/json'} response = requests.post(connect_url, data=payload, headers=headers) return response.status_code, response.text ``` 调用该函数即可快速创建所需的 connectors。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CoderFusionZhu

不要打赏太多哦!我喝速溶就行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值