Debezium是红帽开发的一款CDC产品,和阿里的Canel类似,都是同步binlog,不过强大了一点点。为了不再麻烦,下面称之为dbz。

达拉崩吧斑得贝迪卜多比鲁翁...

dbz的搭建依赖很多中间件:首先要有个MySQL库,dbz来读取数据库binlog(和数据库当前快照);读到后发给kafka,与kafka通信的叫connector;kafka自己是依赖zookeeper的。另外为了方便,我们也使用一个kafka的可视化客户端kafdrop。所以要用docker搭建,除了一个个创建容器,我们这里选择使用docker-compose。

参考 https://github.com/debezium/debezium-examples/blob/main/tutorial/README.md

完整的docker-compose.yml文件如下:

version: '2'
services:
zookeeper:
image: quay.io/debezium/zookeeper:${DEBEZIUM_VERSION}
ports:
- 2181:2181
- 2888:2888
- 3888:3888
networks:
- kafka_network
kafka:
image: quay.io/debezium/kafka:${DEBEZIUM_VERSION}
ports:
- 9092:9092
- 29092:29092
- 29093:29093
networks:
- kafka_network
links:
- zookeeper
environment:
ZOOKEEPER_CONNECT: zookeeper:2181
ALLOW_PLAINTEXT_LISTENER: "yes"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL_SAME_HOST:PLAINTEXT,EXTERNAL_DIFFERENT_HOST:PLAINTEXT
KAFKA_LISTENERS: EXTERNAL_SAME_HOST://:29092,EXTERNAL_DIFFERENT_HOST://:29093,INTERNAL://:9092
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:9092,EXTERNAL_SAME_HOST://localhost:29092,EXTERNAL_DIFFERENT_HOST://10.136.184.253:29093
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
kafdrop:
image: obsidiandynamics/kafdrop
restart: "no"
environment:
KAFKA_BROKERCONNECT: "kafka:9092"
JVM_OPTS: "-Xms16M -Xmx512M -Xss180K -XX:-TieredCompilation -XX:+UseStringDeduplication -noverify"
ports:
- 9000:9000
depends_on:
- kafka
networks:
- kafka_network
mysql:
image: quay.io/debezium/example-mysql:${DEBEZIUM_VERSION}
ports:
- 3306:3306
networks:
- kafka_network
environment:
- MYSQL_ROOT_PASSWORD=debezium
- MYSQL_USER=mysqluser
- MYSQL_PASSWORD=mysqlpw
connect:
image: quay.io/debezium/connect:${DEBEZIUM_VERSION}
ports:
- 8083:8083
links:
- kafka
- mysql
networks:
- kafka_network
environment:
- BOOTSTRAP_SERVERS=kafka:9092
- GROUP_ID=1
- CONFIG_STORAGE_TOPIC=my_connect_configs
- OFFSET_STORAGE_TOPIC=my_connect_offsets
- STATUS_STORAGE_TOPIC=my_connect_statuses
networks:
kafka_network:
name: kafka_docker_example_net

这个文件改造自官方的github样例:https://github.com/debezium/debezium-examples/blob/main/tutorial/docker-compose-mysql.yaml。

差异点主要有:

  • kafka暴露的端口,示例只有9092,但是我配置了3个。如果只开放9092,我们只能通过docker内部访问kafka。增加了29092使得我们可以在本地主机访问kafka并消费,所以29092必须开放。如果要其他电脑(能通过IP访问到你)也能消费到你docker里面的消息,则要通过29093,所以可以根据需要开放
  • kafka的环境参数。示例只指定了zookeeper地址,我这里为了配合开放29092和29093,增加了更多配置,可以根据需要裁剪
  • kafdrop,示例没用这个软件,我们这里自己加上的
  • networks,为这些软件指定网络组,使用默认的也行。

目前(2023年10月24日)的dbz版本是2.1(需要根据https://github.com/debezium/debezium-examples/blob/main/tutorial/README.md#using-mysql 调整),所以我们在搭建前指定环境变量

export DEBEZIUM_VERSION=2.1

然后在docker-compose.yml所在目录执行docker-compose up -d,经过几分钟就能全部启动

docker-compose up -d
[+] Building 0.0s (0/0)
[+] Running 5/5
Container debezium-zookeeper-1 Running 0.0s
Container 64813a30b3e3_debezium-mysql-1 Running 0.0s
Container debezium-kafka-1 Running 0.0s
Container debezium-kafdrop-1 Running 0.0s
Container debezium-connect-1 Started 0.7s

我们可以访问本机的8083端口查看connector状态,9000端口访问kafdrop。


接下来连接数据库,我们需要一个能访问binlog的用户(当然前提是数据库开启了binlog),这个用户要有REPLICATION SLAVE, REPLICATION CLIENT 权限。如果你用root访问,那当然具有最高权限,不用主动去增加了。

然后向8083端口POST连接请求,具体如下

curl --location --request POST 'http://0.0.0.0:8083/connectors' \
--header 'Accept: application/json' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "fastpass_latest-connector",
"config": {
"connector.class": "io.debezium.connector.mysql.MySqlConnector",
"tasks.max": "1",
"database.hostname": "localhost",
"database.port": "3306",
"database.user": "debezium",
"database.password": "PQEXQPm7DDXEYtw4Qs6Xh3mXJgv4vCy5",
"database.server.id": "6500",
"snapshot.locking.mode": "none",
"table.include.list":"fastpass.admin_etcd_config",
"topic.prefix": "latest1",
"database.include.list": "fastpass",
"schema.history.internal.kafka.bootstrap.servers": "kafka:9092",
"schema.history.internal.kafka.topic": "schema-changes.fastpass_latest"
}
}'

这个请求改造自https://github.com/debezium/debezium-examples/blob/main/tutorial/register-mysql.json,主要的差异是

  • snapshot.locking.mode,这里我摸设置成不加锁,不然它会把库锁住,同步完快照再释放锁去同步binlog,因为不加锁的话,在同步快照和binlog之间的数据可能会丢失
  • table.include.list,示例没有指定同步哪些表,这样会同步库里所有的表,我们这里只同步某一个表

接下来写程序监听就行了,默认的topic是topic.prefix+database+table,比如latest1.fastpass.admin_etcd_config

通过Docker搭建Debezium同步MySQL的数据变化的更多相关文章

  1. 如何通过 Docker 部署 Logstash 同步 Mysql 数据库数据到 ElasticSearch

    在开发过程中,我们经常会遇到对业务数据进行模糊搜索的需求,例如电商网站对于商品的搜索,以及内容网站对于内容的关键字检索等等.对于这些高级的搜索功能,显然数据库的 Like 是不合适的,通常我们采用 E ...

  2. Canal:同步mysql增量数据工具,一篇详解核心知识点

    老刘是一名即将找工作的研二学生,写博客一方面是总结大数据开发的知识点,一方面是希望能够帮助伙伴让自学从此不求人.由于老刘是自学大数据开发,博客中肯定会存在一些不足,还希望大家能够批评指正,让我们一起进 ...

  3. Docker搭建Redis5.0并挂载数据

    记录 Docker 搭建 Redis5.0 并挂载数据过程,搭建参考自 Docker Hub 系列文章欢迎访问:https://www.itwxe.com/posts/9e76db89/ 一.简单挂载 ...

  4. 定期从Docker上部署的MySQL备份数据

    前段时间公司停电,正巧赶上周一领导要开会要过一遍项目,然而项目所依赖的MySQL数据库是直接部署在宿主机,且因为各人部署方式不同的原因,花了很久才在开会前启动起来.于是开完会后,我第一件事就是把原先依 ...

  5. 使用docker 搭建基础的 mysql 应用

    mysql server是眼下比較流行的开源数据库server.以下介绍怎样使用docker来做一个mysql数据库服务 从站点直接 pull 一个 mysql 的镜像 core@localhost ...

  6. ElasticSearch 安装 go-mysql-elasticsearch 同步mysql的数据

    一.首先在Centos6.5上安装 go 语言环境 下载Golang语言包:https://studygolang.com/dl [hoojjack@localhost src]$ ls apache ...

  7. 几篇关于MySQL数据同步到Elasticsearch的文章---第一篇:Debezium实现Mysql到Elasticsearch高效实时同步

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484358&idx=1&sn=3a78347 ...

  8. 使用Logstash来实时同步MySQL数据到ES

    上篇讲到了ES和Head插件的环境搭建和配置,也简单模拟了数据作测试 本篇我们来实战从MYSQL里直接同步数据 一.首先下载和你的ES对应的logstash版本,本篇我们使用的都是6.1.1 下载后使 ...

  9. docker应用-6(mysql+mycat 搭建数据库集群)

    上一节,通过使用overlay网络,搭建了跨主机的docker容器集群.下面,在这个跨主机的docker容器集群环境下,搭建mysql 数据库集群. mysql主从自动备份和自动切换 从数据安全性考虑 ...

  10. 基于Docker搭建MySQL主从复制

    摘要: 本篇博文相对简单,因为是初次使用Docker,MySQL的主从复制之前也在Centos环境下搭建过,但是也忘的也差不多了,因此本次尝试在Docker中搭建. 本篇博文相对简单,因为是初次使用D ...

随机推荐

  1. java代码审计跨站脚本(XSS)--反射型

    一.基础:跨站脚本(Xss) 一.原理: 恶意攻击者往web页面里插入恶意js代码,而在服务端没有对数据进行严格的过滤.当用户浏览页面时,js代码必须在该html页面中(hrml必须要存在这个而已艾玛 ...

  2. protobuf 文档

    文档地址: https://golang-tech-stack.com/tutorial/pb 学习视频: https://www.bilibili.com/video/BV1Y3411j7EM?p= ...

  3. Swift中Tuple的比较

    Swift中Tuple的比较遵循如下规则: 1 被比较的Tuple中包含的元素个数必须一样,并且对应元素的类型也必须一样: 2 比较的结果由整个Tuple的比较结果来决定.比如,如果是相等比较,那么必 ...

  4. idea推送代码忽略指定文件,文件夹配置

    idea推送代码忽略指定文件,文件夹配置 今天碰到一个问题,配置了.gitignore文件后没有生效,整了半天,最后发现一种直接配置的方法,可以指定文件夹,或者指定文件类型 打开设置

  5. 🔥🔥🔥httpsok-v1.8.0 SSL证书自动续签就应该这么简单

    httpsok-v1.8.0 SSL证书自动续签就应该这么简单 简介 一行命令,一分钟轻松搞定SSL证书自动续期 httpsok 是一个便捷的 HTTPS 证书自动续签工具,专为 Nginx 服务器设 ...

  6. Unraid 使用 Docker Compose 安装 Immich 套件无法启用人脸识别的原因及修复方法

    原因 问题原因是官方教程中的 docker-compose.yml 指明的机器学习组件 immich-machine-learning 中的 container_name 与 也就是 docker-c ...

  7. WPF自定义控件,如何使得xaml涉及器中的修改能立即反应到预览

    这是我无意中发现的,xaml中设置的是依赖属性而不是包装器,所以我们可以直接在注册依赖属性那里设置回调,触发某个控件重绘,比如本身或父控件重绘. xaml设计器就会实时更新 1 // !!!由于xam ...

  8. HC32L110(六) AS06-VTB07H V5.0测试板AT指令固件

    目录 HC32L110(一) HC32L110芯片介绍和Win10下的烧录 HC32L110(二) HC32L110在Ubuntu下的烧录 HC32L110(三) HC32L110的GCC工具链和VS ...

  9. linux下使用chattr创建一个连root都无法删除的文件

    一.关于chattr,lsattr 1.chattr 的作用:改变一个Linux文件系统上的文件属性. 2.chattr用来改变文件.目录的属性,lsattr用来查看文件.目录的属性. 3.chatt ...

  10. WPF开发快速入门【6】下拉框与枚举类型

    概述 本文讲述下拉框和枚举类型进行绑定的一些操作. 下拉框的基本操作 设计部分: <ComboBox ItemsSource="{Binding Fruits}" Selec ...