基于 canal,我们可以监听 MySQL 表的更新事件,借以实现数据同步或者通知刷新,话不多说,进入正题。
在 github 网页上的 canal 下载页,有如下几个压缩包:
所以,哪个是我们需要的呢?canal.adapter 是为了与其他数据系统适配而开发的工具,例如 hbase,es 等;canal.admin 是 canal 的管理界面; canal.deployer 是真正伪装成 MySQL slave 的服务。
简单情形下,我们一般使用 canal.deployer 和 canal.admin 即可。如果只是单实例启动 canal,只需要 canal.deployer 就行,canal.admin 提供了 canal 的配置管理功能,在生产环境更建议使用。
1. 启动 canal.admin
从配置文件入手,这是一个典型的 spring web 应用,canal.admin 依赖 MySQL 数据库,初始化脚本 "canal_manager.sql" 在工程中可找到 ,注意 canal.adminUser 和 canal.adminPasswd,是 canal.deployer 连接 canal.admin 时提供的凭据。
server: port: 8089 spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 spring.datasource: address: 127.0.0.1:3306 database: canal_manager username: canal password: canal driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false hikari: maximum-pool-size: 30 minimum-idle: 1 canal: adminUser: admin adminPasswd: admin
SQL 脚本执行后,直接启动即可。登录时,默认的用户名和密码可能存在问题,可以通过代码生成密码的密文,然后替换 canal_user 表的密码字段。
上图代码得到密码 admin1234 的密文,然后修改 canal_user 数据库。
密码重置后,正常登录。
2. 新建集群,canal.deployer 集群依赖 zookeeper,首先安装 zk,说明一下,依赖 zk 建立的 canal 集群,只有一个实例处于工作状态,其余实例待命,所以 2 个实例足够了。
通过 admin 管理 canal,原来 canal.properties 配置文件中的大部分内容转移到了集群配置中。
通常设置 canal.serverMode = kafka 或者 rocketMQ 是常用的做法,同时正确配置 MQ 的地址,canal.instance.global.mode 必须设置为 manager,canal.destinations 需要留空。
3. 创建 server,填写的 ip 和端口信息,必须与后续启动的 canal.deployer 保持一致
4. 创建 instance,instance 真正执行监听 binglog 的任务,可以认为一个 instance 对应一个 MySQL 实例,
因为本文使用 MQ 模式,binlog 监听事件发送到 kafka 中,canal 提供了一种 MySQL 库、表到 kafka topic 的映射,下面的配置监听指定的数据库,并将不同的数据库事件发送到对应的 kafka topic 中
# 保留 db_order 库中所有表和 db_customer 库中所有表的 binlog 事件
canal.instance.filter.regex=db_order\\..*,db_customer\\..*
# 不保留 canal_manager 库的 binlog 事件 canal.instance.filter.black.regex=canal_manager\\..*
# db_order 的事件发送到 canal_topic_order 中,db_customer 的事件发送到 canal_topic_customer 中 canal.mq.dynamicTopic=canal_topic_order:db_order,canal_topic_customer:db_customer
5. 启动 canal.deployer
在 canal.admin 页面中配置好集群、server 和 instance 后,着手 canal.deployer 的启动,deployer 在启动时向 admin 注册,并从 admin 拉取 instance 的配置信息。
因为主要的配置在 canal.admin 页面的集群中,canal.deployer 自身的配置很少了,下面是 canal.properties 文件示例,
canal.deployer 在启动时会监听多个端口
################################################# ######### common argument ############# ################################################# # tcp bind ip canal.ip = # register ip to zookeeper
# 默认使用 canal.register.ip 和 canal.admin.port 作为 server 的名称 canal.register.ip = 192.168.56.1 canal.port = 11111 canal.metrics.pull.port = 11112 # canal instance user/passwd # canal.user = canal # canal.passwd = E3619321C1A937C46A0D8BD1DAC39F93B27D4458 # canal admin config
# 即 admin 的地址 canal.admin.manager = 127.0.0.1:8089
# 这个端口是 deployer 监听的端口,admin 通过该端口向 deployer 发送指令 canal.admin.port = 11110
# deployer 启动时连接 admin,此处的 user 和 passwd 是 admin 中的 canal.adminUser 和 canal.adminPasswd canal.admin.user = admin
# 通过前面的 SecurityUtil#scrambleGenPass 可以生成密文 canal.admin.passwd = 4ACFE3202A5FF5CF467898FC58AAB1D615029441 # admin auto register #canal.admin.register.auto = true #canal.admin.register.cluster = #canal.admin.register.name =
配置完成后,启动 deployer 即可。
6. 订阅 MQ 中的 topic,消费事件。