思维导图

前言
在很多业务情况下,我们都会在系统中加入redis缓存做查询优化。
如果数据库数据发生更新,这时候就需要在业务代码中写一段同步更新redis的代码。
这种数据同步的代码跟业务代码糅合在一起会不太优雅,能不能把这些数据同步的代码抽出来形成一个独立的模块呢,答案是可以的。
架构图
canal是一个伪装成slave订阅mysql的binlog,实现数据同步的中间件。上一篇文章《canal入门》
我已经介绍了最简单的使用方法,也就是tcp模式。
实际上canal是支持直接发送到MQ的,目前最新版是支持主流的三种MQ:Kafka、RocketMQ、RabbitMQ。而canal的RabbitMQ模式目前是有一定的bug,所以一般使用Kafka或者RocketMQ。

本文使用Kafka,实现Redis与MySQL的数据同步。架构图如下:

通过架构图,我们很清晰就知道要用到的组件:MySQL、Canal、Kafka、ZooKeeper、Redis。
下面演示Kafka的搭建,MySQL搭建大家应该都会,ZooKeeper、Redis这些网上也有很多资料参考。
搭建Kafka
首先在官网下载安装包:

解压,打开/config/server.properties配置文件,修改日志目录:
1 | =./logs |
首先启动ZooKeeper,我用的是3.6.1版本:

接着再启动Kafka,在Kafka的bin目录下打开cmd,输入命令:
1 | kafka-server-start.bat ../../config/server.properties |
我们可以看到ZooKeeper上注册了Kafka相关的配置信息:

然后需要创建一个队列,用于接收canal传送过来的数据,使用命令:
1 | kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic canaltopic |
创建的队列名是canaltopic。

配置Cannal Server
canal官网下载相关安装包:
