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文件如下:

  1. version: '2'
  2. services:
  3. zookeeper:
  4. image: quay.io/debezium/zookeeper:${DEBEZIUM_VERSION}
  5. ports:
  6. - 2181:2181
  7. - 2888:2888
  8. - 3888:3888
  9. networks:
  10. - kafka_network
  11. kafka:
  12. image: quay.io/debezium/kafka:${DEBEZIUM_VERSION}
  13. ports:
  14. - 9092:9092
  15. - 29092:29092
  16. - 29093:29093
  17. networks:
  18. - kafka_network
  19. links:
  20. - zookeeper
  21. environment:
  22. ZOOKEEPER_CONNECT: zookeeper:2181
  23. ALLOW_PLAINTEXT_LISTENER: "yes"
  24. KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL_SAME_HOST:PLAINTEXT,EXTERNAL_DIFFERENT_HOST:PLAINTEXT
  25. KAFKA_LISTENERS: EXTERNAL_SAME_HOST://:29092,EXTERNAL_DIFFERENT_HOST://:29093,INTERNAL://:9092
  26. KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:9092,EXTERNAL_SAME_HOST://localhost:29092,EXTERNAL_DIFFERENT_HOST://10.136.184.253:29093
  27. KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
  28. kafdrop:
  29. image: obsidiandynamics/kafdrop
  30. restart: "no"
  31. environment:
  32. KAFKA_BROKERCONNECT: "kafka:9092"
  33. JVM_OPTS: "-Xms16M -Xmx512M -Xss180K -XX:-TieredCompilation -XX:+UseStringDeduplication -noverify"
  34. ports:
  35. - 9000:9000
  36. depends_on:
  37. - kafka
  38. networks:
  39. - kafka_network
  40. mysql:
  41. image: quay.io/debezium/example-mysql:${DEBEZIUM_VERSION}
  42. ports:
  43. - 3306:3306
  44. networks:
  45. - kafka_network
  46. environment:
  47. - MYSQL_ROOT_PASSWORD=debezium
  48. - MYSQL_USER=mysqluser
  49. - MYSQL_PASSWORD=mysqlpw
  50. connect:
  51. image: quay.io/debezium/connect:${DEBEZIUM_VERSION}
  52. ports:
  53. - 8083:8083
  54. links:
  55. - kafka
  56. - mysql
  57. networks:
  58. - kafka_network
  59. environment:
  60. - BOOTSTRAP_SERVERS=kafka:9092
  61. - GROUP_ID=1
  62. - CONFIG_STORAGE_TOPIC=my_connect_configs
  63. - OFFSET_STORAGE_TOPIC=my_connect_offsets
  64. - STATUS_STORAGE_TOPIC=my_connect_statuses
  65. networks:
  66. kafka_network:
  67. 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 调整),所以我们在搭建前指定环境变量

  1. export DEBEZIUM_VERSION=2.1

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

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

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


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

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

  1. curl --location --request POST 'http://0.0.0.0:8083/connectors' \
  2. --header 'Accept: application/json' \
  3. --header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
  4. --header 'Content-Type: application/json' \
  5. --data-raw '{
  6. "name": "fastpass_latest-connector",
  7. "config": {
  8. "connector.class": "io.debezium.connector.mysql.MySqlConnector",
  9. "tasks.max": "1",
  10. "database.hostname": "localhost",
  11. "database.port": "3306",
  12. "database.user": "debezium",
  13. "database.password": "PQEXQPm7DDXEYtw4Qs6Xh3mXJgv4vCy5",
  14. "database.server.id": "6500",
  15. "snapshot.locking.mode": "none",
  16. "table.include.list":"fastpass.admin_etcd_config",
  17. "topic.prefix": "latest1",
  18. "database.include.list": "fastpass",
  19. "schema.history.internal.kafka.bootstrap.servers": "kafka:9092",
  20. "schema.history.internal.kafka.topic": "schema-changes.fastpass_latest"
  21. }
  22. }'

这个请求改造自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. go-admin migrate 数据表迁移

    目录 视频教程 应用场景 目录说明 数据迁移 迁移步骤 配置数据库 常用命令示例 新建模型实例 3.1 方式一:不编译运行(推荐) 3.2 方式二:编译并运行迁移 3.3 方式三:golangIDE ...

  2. MQTT的使用一

    MQTT:物联网消息传递标准 简介 MQTT是用于物联网(IoT)的OASIS标准消息传递协议.它被设计为一种非常轻量级的发布/订阅消息传送,非常适合以较小的代码占用量和最小的网络带宽连接远程设备.如 ...

  3. ES6常用知识点笔记

    ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准. 因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015(简称ES2015).虽然浏览器在不 ...

  4. 使用 Python 旋转PDF页面、或调整PDF页面顺序

    在将纸质文档扫描成PDF电子文档时,有时可能会出现页面方向翻转或者页面顺序混乱的情况.为了确保更好地浏览和查看PDF文件,本文将分享一个使用Python来旋转PDF页面或者调整PDF页面顺序的解决方案 ...

  5. C语言:输入一个整数并让其逆反输出。123->321

    主要思想为: a)计算输入的位数有多少个 b)计算出最高位的单位(若最高位为是万位, 那么需要一个变量存储最高位数值1000) c)用取模的方法从个位数开始进行取出每一个单位上的数字 d)从个位数开始 ...

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

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

  7. PVT:特征金字塔在Vision Transormer的首次应用,又快又好 | ICCV 2021

    论文设计了用于密集预测任务的纯Transformer主干网络PVT,包含渐进收缩的特征金字塔结构和spatial-reduction attention层,能够在有限的计算资源和内存资源下获得高分辨率 ...

  8. 最小生成树Kruskal算法的实现原理

    到底什么是最小生成树 最小生成树算法应用范围比较广,例如在网络的铺设当中难免会出现环路,需要要生成树算法来取出网络中的环,防止网络风暴的发生.那到底什么是最小生成树呢?我这里就不给严谨的定义了,这种定 ...

  9. Nginx 修饰符 Location 详解

    概述 location 指令可以用在虚拟服务器 server 部分,并且意味着提供来自客户端的 URI 或者内部重定向访问. location 的定义如下: location [modifier] u ...

  10. Vue cli使用Element UI

    当前的测试环境如下: ---- 新版的@vue/cli ---- Vue2.x版本 第一步:安装Element UI npm i element-ui -S 第二步:引入Element UI 在mai ...