首页 > 数据库 >MySQL的CDC数据实时同步

MySQL的CDC数据实时同步

时间:2024-04-12 14:46:51浏览次数:30  
标签:CDC -- 实时 kafka topic 2181 sh MySQL 172.19

MySQL的CDC数据实时同步

 背景

近段时间,业务系统架构基本完备,数据层面的建设比较薄弱,因为笔者目前工作重心在于搭建一个小型的数据平台。优先级比较高的一个任务就是需要近实时同步业务系统的数据(包括保存、更新或者软删除)到一个另一个数据源,持久化之前需要清洗数据并且构建一个相对合理的便于后续业务数据统计、标签系统构建等扩展功能的数据模型。基于当前团队的资源和能力,优先调研了Alibaba开源中间件Canal的使用。

这篇文章简单介绍一下如何快速地搭建一套Canal相关的组件。

关于Canal#

简介#

下面的简介和下一节的原理均来自于Canal项目的README

Canal[kə'næl],译意为水道/管道/沟渠,主要用途是基于MySQL数据库增量日志解析,提供增量数据订阅和消费。早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务trigger获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。

基于日志增量订阅和消费的业务包括:

  • 数据库镜像
  • 数据库实时备份
  • 索引构建和实时维护(拆分异构索引、倒排索引等)
  • 业务Cache刷新
  • 带业务逻辑的增量数据处理

Canal的工作原理#

MySQL主备复制原理:

  • MySQLMaster实例将数据变更写入二进制日志(binary log,其中记录叫做二进制日志事件binary log events,可以通过show binlog events进行查看)
  • MySQLSlave实例将masterbinary log events拷贝到它的中继日志(relay log
  • MySQLSlave实例重放relay log中的事件,将数据变更反映它到自身的数据

Canal的工作原理如下:

  • Canal模拟MySQL Slave的交互协议,伪装自己为MySQL Slave,向MySQL Master发送dump协议
  • MySQL Master收到dump请求,开始推送binary logSlave(即Canal
  • Canal解析binary log对象(原始为byte流),并且可以通过连接器发送到对应的消息队列等中间件中

关于Canal的版本和部件#

截止笔者开始编写本文的时候(2020-03-05),Canal的最新发布版本是v1.1.5-alpha-12019-10-09发布的),最新的正式版是v1.1.42019-09-02发布的)。其中,v1.1.4主要添加了鉴权、监控的功能,并且做了一些列的性能优化,此版本集成的连接器是TcpKafkaRockerMQ。而v1.1.5-alpha-1版本已经新增了RabbitMQ连接器,但是此版本的RabbitMQ连接器暂时不能定义连接RabbitMQ的端口号,不过此问题已经在master分支中修复(具体可以参看源码中的CanalRabbitMQProducer类的提交记录)。换言之,v1.1.4版本中目前能使用的内置连接器只有TcpKafkaRockerMQ三种,如果想尝鲜使用RabbitMQ连接器,可以选用下面的两种方式之一:

  • 选用v1.1.5-alpha-1版本,但是无法修改RabbitMQport属性,默认为5672
  • 基于master分支自行构建Canal

目前,Canal项目的活跃度比较高,但是考虑到功能的稳定性问题,笔者建议选用稳定版本在生产环境中实施,当前可以选用v1.1.4版本,本文的例子用选用的就是v1.1.4版本,配合Kafka连接器使用。Canal主要包括三个核心部件:

  • canal-admin:后台管理模块,提供面向WebUICanal管理能力。
  • canal-adapter:适配器,增加客户端数据落地的适配及启动功能,包括REST、日志适配器、关系型数据库的数据同步(表对表同步)、HBase数据同步、ES数据同步等等。
  • canal-deployer:发布器,核心功能所在,包括binlog解析、转换和发送报文到连接器中等等功能都由此模块提供。

一般情况下,canal-deployer部件是必须的,其他两个部件按需选用即可。

Kafka一般操作

kafka相关 ##解决offsets问题(问题现象:日志一直报offsets) bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group group2 --reset-offsets --topic new_video_test --to-latest --execute   20200727 kafka问题解决 1)删除 kafka的data下的文件 2)执行上面offsets问题的命令 3)修改配置文件   ##kafka停止服务 sh /data/kafka/kafka_2.13-2.4.0/bin/kafka-server-stop.sh ##kafka启动服务并监控日志 sh /data/kafka/kafka_2.13-2.4.0/bin/kafka-server-start.sh /data/kafka/kafka_2.13-2.4.0/config/server.properties ##kafka后台启动 sh /data/kafka/kafka_2.13-2.4.0/bin/kafka-server-start.sh -daemon /data/kafka/kafka_2.13-2.4.0/config/server.properties   ./kafka-topics.sh --create --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --replication-factor 3 --partitions 15 --topic world_tt_video   /data/kafka_jk/kafka_2.13-2.4.0/bin/kafka-server-start.sh -daemon /data/kafka_jk/kafka_2.13-2.4.0/config/server.properties . 配置文件(主配置文件) servser.properties   1、查询topic,进入kafka目录: bin/kafka-topics.sh --list --zookeeper localhost:2181   2、查询topic内容: bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topicName --from-beginning   查看 kafka 消息是否发送 sh /data/kafka/kafka_2.13-2.4.0/bin/kafka-console-consumer.sh --bootstrap-server 47.102.14.62:9092 --from-beginning --topic new_video_master ./kafka-console-consumer.sh --bootstrap-server 192.168.169.18:9092 --from-beginning --topic test_world1 ./kafka-console-consumer.sh --bootstrap-server 192.168.169.18:9093 --from-beginning --topic test_score ./kafka-console-consumer.sh --bootstrap-server 192.168.169.19:9092 --from-beginning --topic test-word-playlist sh /data/kafka/kafka_2.13-2.4.0/bin/kafka-console-consumer.sh --bootstrap-server 172.19.167.100:9092,172.19.167.105:9092,172.19.167.106:9092 --from-beginning --topic world_tt_video   sh /data/kafka/kafka_2.13-2.4.0/bin/kafka-console-consumer.sh --bootstrap-server 172.19.167.100:9092,172.19.167.105:9092,172.19.167.106:9092 --from-beginning --topic video-score /data/kafka/kafka_2.13-2.4.0/bin/kafka-console-consumer.sh --bootstrap-server 172.19.167.97:9092 --from-beginning --topic tt-user-task ##重新消费 ./kafka-consumer-groups.sh --bootstrap-server 172.19.167.100:9092,172.19.167.105:9092,172.19.167.106:9092:9092 --group tt_video --reset-offsets --to-offset 0 --topic world_tt_video --execute earliest latest     bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list 47.102.14.62:9092 --topic new_video_master --time -2 计算消息的消息堆积情况   kafka-consumer-groups --bootstrap-server master:9092 --describe --group test_kafka_game_x_g1   ##查看消费者 ./kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --group tt_video ./kafka-run-class.sh kafka.admin.ConsumerGroupCommand --zookeeper 127.0.0.1:2181 --group intelligence_uat   ${KAFKA_HOME}/bin/kafka-consumer-groups.sh --bootstrap-server ip:9092 --list // 查看具体组的详细描述信息 ${KAFKA_HOME}/bin/kafka-consumer-groups.sh --bootstrap-server 192.168.47.133:9092 --describe --group groupname   指定自己的分组 自己消费的topic会显示kafka总共有多少数据,以及已经被消费了多少条 结果:   GROUP TOPIC PID OFFSET LOGSIZE LAG 消费者组 话题id 分区id 当前已消费的条数 总条数 未消费的条数       /kafka/consumers/instance/offsets/world_tt_video/0 56128 /brokers/topics/world_tt_video/partitions/0   ##查看副本 ../bin/kafka-topics.sh --zookeeper 192.168.169.18:2181 --describe --topic test_world1 ##查看group详情 ./kafka-consumer-groups.sh --bootstrap-server 47.102.14.62:9092 --describe --group group2 ./kafka-consumer-groups.sh --bootstrap-server 192.168.169.18:9092 --describe --group logstash_test1 ./kafka-consumer-groups.sh --bootstrap-server 192.168.169.18:9093 --describe --group logstash_test_vv ./kafka-consumer-groups.sh --bootstrap-server 192.168.169.18:9093 --describe --group logstash_test_community ./kafka-consumer-groups.sh --bootstrap-server 192.168.169.19:9092 --describe --group logstash_playlist_test   ./kafka-consumer-groups.sh --bootstrap-server 172.19.167.97:9092 --describe --group logstash_task ./kafka-consumer-groups.sh --bootstrap-server 172.19.167.100:9092,172.19.167.105:9092,172.19.167.106:9092 --describe --group tt_video logstash_task_master ./kafka-consumer-groups.sh --bootstrap-server 172.19.167.97:9092 --describe --group logstash_task ./kafka-consumer-groups.sh --bootstrap-server 172.19.167.100:9092,172.19.167.105:9092,172.19.167.106:9092 --describe --group logstash_video_prd   ./kafka-consumer-groups.sh --bootstrap-server 172.19.167.100:9092,172.19.167.105:9092,172.19.167.106:9092 --group tt_video --reset-offsets --to-latest --topic world_tt_video --execute   ##删除group ./kafka-consumer-groups.sh --bootstrap-server 192.168.169.18:9092 --delete --group console-consumer-62327 ./kafka-consumer-groups.sh --bootstrap-server 192.168.169.18:9093 --delete --group console-consumer-16161 ##查看topic ./kafka-topics.sh --zookeeper 192.168.169.15:2181 --list ./kafka-topics.sh --bootstrap-server 192.168.169.18:9092 --list ./kafka-topics.sh --bootstrap-server 192.168.169.18:9093 --list ./kafka-topics.sh --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --list ./kafka-topics.sh --zookeeper 172.19.167.97:2181 --list   ./bin/kafka-console-consumer.sh --zookeeper 192.168.169.19:2181 --topic testTopic --consumer.config config/consumer.properties 删除topic ./bin/kafka-topics --delete --zookeeper 【zookeeper server:port】 --topic 【topic name】 ./kafka-topics.sh --zookeeper 192.168.169.18:2181 --delete --topic test1 ./kafka-topics.sh --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --delete --topic test1 ##查看partition(副本) ./kafka-topics.sh --zookeeper 192.168.169.15:2181 --topic new_video_master --describe ./kafka-topics.sh --zookeeper 192.168.169.18:2181 --topic test_world1 --describe ./kafka-topics.sh --zookeeper 192.168.169.18:3181 --topic test_score --describe ./kafka-topics.sh --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --topic world_tt_video --describe ./kafka-topics.sh --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --topic video-score --describe   ##修改partition ./kafka-topics.sh --zookeeper 192.168.169.15:2181 --topic new_video_master --alter --partitions 10 ./kafka-topics.sh --zookeeper 192.168.169.18:2181 --topic test_world1 --alter --partitions 10 ./kafka-topics.sh --zookeeper 192.168.169.18:2181 --topic test_score --alter --partitions 10 ./kafka-topics.sh --zookeeper 192.168.169.18:2181 --topic test_video --alter --partitions 10 ##新建topic ./kafka-topics.sh --create --zookeeper 192.168.169.18:2181 --replication-factor 1 --partitions 10 --topic test_score ./kafka-topics.sh --create --zookeeper 192.168.169.18:2181 --replication-factor 1 --partitions 10 --topic test_video   ./kafka-topics.sh --create --zookeeper 192.168.169.18:2181 --replication-factor 1 --partitions 10 --topic test-tt-user-task ./kafka-topics.sh --create --zookeeper 192.168.169.19:2181 --replication-factor 1 --partitions 10 --topic test_topic_playlist ./kafka-topics.sh --create --zookeeper 192.168.169.19:2181 --replication-factor 1 --partitions 10 --topic master_topic_playlist   ./kafka-topics.sh --create --zookeeper 192.168.169.18:3181 --replication-factor 1 --partitions 10 --topic test_video ./kafka-topics.sh --create --zookeeper 192.168.169.18:3181 --replication-factor 1 --partitions 10 --topic master_score ./kafka-topics.sh --create --zookeeper 192.168.169.18:3181 --replication-factor 1 --partitions 10 --topic test_community_own   ./kafka-topics.sh --create --zookeeper 172.19.167.97:2181 --replication-factor 1 --partitions 10 --topic topic-playlist ./kafka-topics.sh --create --zookeeper 172.19.167.97:2181 --replication-factor 1 --partitions 10 --topic topic-playlist-words   ./kafka-topics.sh --create --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --replication-factor 3 --partitions 5 --topic topic-playlist-words6 ./kafka-topics.sh --create --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --replication-factor 3 --partitions 15 --topic world_tt_video   ./kafka-topics.sh --create --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --replication-factor 3 --partitions 15 --topic video-score ./kafka-topics.sh --create --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --replication-factor 3 --partitions 15 --topic tt-user-task ./kafka-topics.sh --create --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --replication-factor 3 --partitions 15 --topic task-tttt ./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test1 ##消费者消费数据 ./kafka-console-consumer.sh --bootstrap-server 172.19.167.100:9092,172.19.167.105:9092,172.19.167.106:9092 --from-beginning --topic world_tt_video   ##查看group列表 ./kafka-consumer-groups.sh --bootstrap-server 192.168.169.15:9092 --list ./kafka-consumer-groups.sh --bootstrap-server 192.168.169.18:9092 --list ./kafka-consumer-groups.sh --bootstrap-server 192.168.169.18:9093 --list ./kafka-consumer-groups.sh --bootstrap-server 172.19.167.97:9092 --list ./kafka-consumer-groups.sh --bootstrap-server 172.19.167.100:9092,172.19.167.105:9092,172.19.167.106:9092 --list --new-consumer ./kafka-create-topic.sh --partition 1 --replica 1 --zookeeper localhost:2181 --topic test latest earliest

标签:CDC,--,实时,kafka,topic,2181,sh,MySQL,172.19
From: https://www.cnblogs.com/muyi-yang/p/18131173

相关文章

  • MySQL数据库下载及安装教程
    MySQL数据库下载及安装教程(最最新版)一、下载mysql数据库二、安装Mysql三、验证是否安装成功(一)、命令提示符cmd窗口验证(二)、MySQL控制台验证一、下载mysql数据库进入MySQL官方网站(https://www.mysql.com/downloads/),按下图顺序点击进入下载页面。 注意:这里MSIInstal......
  • mysql半同步复制
    1、首先在master上面安装插件INSTALLPLUGINrpl_semi_sync_masterSONAME'semisync_master.so';QueryOK,0rowsaffected(0.01sec)2、设置master全局变量和超时时间SETGLOBALrpl_semi_sync_master_enabled=1;QueryOK,0rowsaffected(0.00sec)查看变量是否开......
  • Mysql中Varchar(50)和varchar(500)区别是什么?
    一.问题描述我们在设计表结构的时候,设计规范里面有一条如下规则:对于可变长度的字段,在满足条件的前提下,尽可能使用较短的变长字段长度。为什么这么规定,我在网上查了一下,主要基于两个方面基于存储空间的考虑基于性能的考虑网上说Varchar(50)和varchar(500)存储空间上是......
  • MySQL 查看主机和版本信息
    1、使用SELECT@@hostname查看主机名  2、使用SELECT@@versionASVersion;查看版本信息 3、一起查看SELECT@@hostnameASHostname,@@versionASVersion; ......
  • 实况窗助力美团打造鸿蒙原生外卖新体验,用户可实时掌握外卖进展
    自2023年华为宣布全新HarmonyOS NEXT蓄势待发,鸿蒙原生应用全面启动以来,已有金融、旅行、社交等多个领域的企业和开发者陆续宣布加入鸿蒙生态。其中,美团作为国内头部的科技零售企业,是首批加入鸿蒙生态的伙伴,其下的美团外卖App基于HarmonyOS SDK高效展开了鸿蒙原生应用的开发,仅用6......
  • windows MySQL报错Packet for query is too large问题解决
    1、报错Cause:com.mysql.cj.jdbc.exceptions.PacketTooBigException:Packetforqueryistoolarge(11,792,709>4,194,304).Youcanchangethisvalueontheserverbysettingthe'max_allowed_packet'variable.出现问题的原因:批量插入数据量过大MySQL根据配置......
  • mysql~GROUP_CONCAT实现关系表的行转列
    作用GROUP_CONCAT是MySQL中用于将查询结果集中的多行数据合并为单个字符串的聚合函数。它将每行数据的指定字段值连接起来,并以指定的分隔符分隔,最终返回一个包含所有值的字符串。以下是GROUP_CONCAT函数的一般语法:SELECTGROUP_CONCAT(column_nameSEPARATOR',')FROMt......
  • MySQL binlog超过binlog_expire_logs_seconds阈值没有删除案例
    生产环境有一套3个节点的MySQLInnoDBCluster,MySQL的版本为Serverversion:8.0.35MySQLCommunityServer-GPL,早上突然收到Zabbix的告警,其中一个节点出现空间告警:"/data:Diskspaceislow(used>80%)"检查分析后发现是因为MySQL的binlog没有清理导致空间报警,如下所示(b......
  • Qt编译MySQL驱动
    Qt编译MySQL驱动参考:qt6.5.0MySQL驱动手动编译以及数据库连接详细教程以及注意事项附资源链接_qt编译mysql驱动-CSDN博客由于MySQL等数据库的client库遵循的协议与GPL不兼容,因此Qt发布时不带有这些驱动,需要自行编译。在Qt5版本的编译由于使用傻瓜式的qmake,要简单很多:QT出现没......
  • docker 中使用 php--apache并加入 mysql 插件
    官方镜像说明页:可根据自己需要,选择对应版本的php进行下载。这里使用php7.4+apache服务的镜像为例:dockerpullphp:7.4.33-apache运行容器:dockerrun--namejiuta-php-apache-7.4-d-p9000:80\-v/mnt/datadisks/docker-root/jiuta/www:/var/www/html\--log-o......