canal+Kafka实现mysql与redis数据同步

如果这时候数据库数据发生变更操作,就不得不在业务代码中写一段同步更新redis的代码,但是这种 数据同步的代码和业务代码糅合在一起 看起来不是很优雅,而且还会出现数据不一致问题。那能不能把这部分同步代码从中抽离出来,形成独立模块呢?答案是肯定的,下面通过canal结合Kafka来实现mysql与redis之间的...
canal+Kafka实现mysql与redis数据同步
前言
上篇文章简单介绍canal概念,本文结合常见的缓存业务去讲解canal使用。在实际开发过程中,通常都会把数据往redis缓存中保存一份,做下简单的查询优化。如果这时候数据库数据发生变更操作,就不得不在业务代码中写一段同步更新redis的代码,但是这种 数据同步的代码和业务代码糅合在一起 看起来不是很优雅,而且还会出现数据不一致问题。那能不能把这部分同步代码从中抽离出来,形成独立模块呢?答案是肯定的,下面通过canal结合Kafka来实现mysql与redis之间的数据同步。
架构设计
通过上述结构设计图可以很清晰的知道用到的组件:MySQL、Canal、Kafka、ZooKeeper、Redis。

Kafka&Zookeeper搭建
首先在 官网 下载Kafka:
下载后解压文件夹,可以看到以下几个文件:
Kafka内部自带了zookeeper,所以暂不需要去下载搭建zookeeper集群,本文就使用Kafka自带zookeeper来实现。
通过上述zookeeper启动命令以及Kafka启动命令把服务启动,可以通过以下简单实现下是否成功:
Canal搭建
canal搭建具体可以参考上文,这里只讲解具体的参数配置:
找到/conf目录下的canal.properties配置文件:
然后配置instance,找到/conf/example/instance.properties配置文件:
经过上述配置后,就可以启动canal了。
测试
环境搭建完成后,就可以编写代码进行测试。
1、引入pom依赖
2、封装Redis工具类
在application.yml文件增加以下配置:
封装一个操作Redis的工具类:
3、创建MQ消费者进行同步
创建一个CanalBean对象进行接收:
最后就可以创建一个消费者CanalConsumer进行消费:
测试Mysql与Redis同步
mysql对应的表结构如下:
启动项目后,新增一条数据:
可以在控制台看到以下输出:
如果更新呢?试一下Update语句:
同样可以在控制台看到以下输出:
经过测试完全么有问题。

总结
既然canal这么强大,难道就没缺点嘛?答案当然是存在的啦,比如:canal只能同步增量数据、不是实时同步而是准实时同步、MQ顺序问题等; 尽管有一些缺点,毕竟没有一样技术或者产品是完美的,最重要是合适。比如公司目前有个视图服务提供宽表搜索查询功能就是通过 同步Mysql数据到Es采用Canal+Kafka的方式来实现的。
2022-07-05
mengvlog 阅读 10 次 更新于 2025-07-21 23:29:55 我来答关注问题0
  • 答案是肯定的,下面通过canal结合Kafka来实现mysql与redis之间的数据同步。架构设计 通过上述结构设计图可以很清晰的知道用到的组件:MySQL、Canal、Kafka、ZooKeeper、Redis。Kafka&Zookeeper搭建 首先在 官网 下载Kafka:下载后解压文件夹,可以看到以下几个文件:Kafka内部自带了zookeeper,所以暂不需要去...

  • canal.instance.rds.accesskey= canal.instance.rds.secretkey= (3)配置数据输出方式 配置数据输出方式 canal.mq.topic=test 指定数据传输格式 canal.mq.flatMessage = false (4)配置kafka通常参数和账号信息 canal.mq.producerGroup 客户端group组名,同一个topic下的不同group组互不影响 canal.mq....

  •  文暄生活科普 canal零基础实战

    简单来说,Canal是一个用于同步增量数据的工具。通过模仿MySQL slave的交互协议,向MySQL master发送dump协议,实现从master到Canal的binary log推送。Canal解析这些binary log后,将其转换成易于使用的对象,最终发送到如MySQL、Kafka、Elastic Search等存储目的地。Canal工作原理Canal工作原理基于模拟MySQL slave...

  •  文暄生活科普 CloudCanal x Debezium 打造实时数据流动新范式

    CloudCanal支持将数据库数据以Debezium格式写入目标端Kafka,并在兼容性方面做了大量优化。此次版本更新则实现了从Kafka消费Debezium格式数据,并同步至对端数据库或数仓的能力,形成基于Kafka中转的端到端数据迁移同步能力。此功能可平滑对接使用其他工具且以Debezium数据格式载体的需求。操作示例包括创建MySQL Sou...

  •  青柠姑娘17 记一次canal delay 调优过程

    三、调优的过程 找到可能的原因之后,就开始仔细地看了一下canal的kafka发送逻辑。在这个过程中,看到了kafka的几个参数,canal的默认值如下 1、kafka.acks = all,这里的ack有3个选项,0、1、all 。all是要等topic的某个分区的所有副本都同步完数据后才会给客户端响应,1只要topic的leader分区接收到...

檬味博客在线解答立即免费咨询

mySQL相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部