数据库binlog订阅和消费组件canal快速入门

一、什么是canal

1.定位

Canal是阿里巴巴开源的一款基于mysql数据库binlog增量日志分析提供数据订阅和消费功能的组件

2.原理

Canal原理

  • Canal模拟MySQL Slave协议,将自己伪装成MySQL Slave,将Master发送dump协议
  • Master将binlog同步到Slave(这里是Canal)
  • Canal解析binlog,可以做相关的后续操作,如同步发送到MQ,或同步到其他存储系统如ES

二、canal能做什么

  • 数据库镜像
  • 数据库实时备份
  • 多级索引 (卖家和买家各自分库索引)
  • search build
  • 业务cache刷新
  • 价格变化等重要业务消息

三、canal服务端安装

1.MySQL主节点配置
(1)开启binlog

修改mysql的配置文件,添加以下内容:

  1. log-bin = mysql-bin
  2. binlog-format = ROW
  3. server-id = 1
  • log-bin : 指定二进制日志文件的文件名,也是开启binlog的开关
  • binlog-format : binlog的日志格式,必须设置成ROW
  • server-id : 主节点的编号(不能与slave和canal的server-id相同)

修改配置后,请重启mysql

(2)为slave账户授权

通过mysql客户端连接到mysql服务器

  • 创建用于复制的账号(设置账号和密码)
  1. CREATE USER canal IDENTIFIED BY 'canal';
  • 为创建的账号授权
  1. GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
  • 刷新权限
  1. FLUSH PRIVILEGES
2.下载源码
(1)下载二进制包

https://github.com/alibaba/canal/releases

下载最新的稳定包

(2)编译成二进制包
3.修改配置

修改实例配置conf/example/instance.properties

  1. # position info
  2. canal.instance.master.address=127.0.0.1:3306
  3. canal.instance.master.journal.name=
  4. canal.instance.master.position=
  5. canal.instance.master.timestamp=
  6. canal.instance.master.gtid=
  7. # username/password
  8. canal.instance.dbUsername=canal
  9. canal.instance.dbPassword=canal
  10. canal.instance.connectionCharset = UTF-8
  11. canal.instance.defaultDatabaseName =test
  12. # table regex
  13. canal.instance.filter.regex=.*\\..*
  14. # table black regex
  15. canal.instance.filter.black.regex=

主要配置说明:

  • 连接的master节点配置
    • canal.instance.mysql.slaveId : 当前节点伪装成的slave的编号(1.0.26后自动生成,不用设置)
    • canal.instance.master.address : 主节点的地址
  • 账号设置
    • canal.instance.dbUsername : 用于复制的账号的用户名
    • canal.instance.dbPassword : 用于复制的账号的密码
    • canal.instance.connectionCharset : 连接数据库编码设置 
  • 表设置
    • canal.instance.filter.regex : 只关注的表(正则表达式),这里 .*\\..* 表示所有
4.启动canal
  1. bin/startup.sh
5.查看日志
  • logs/canal/canal.log : 查看服务的日志
  • logs/example/example.log : canal实例服务日志
  • logs/example/meta.log : 数据变更日志(有数据后自动生成)
6.检测canal搭建是否成功
(1)通过客户端进入mysql服务器,查看binlog
  • 查看主节点状态,获取二进制文件名称
  1. show master status;

二进制日志

  • 查找当前二进制日志的位置
  1. show binlog events in 'mysql-bin.000009';

注:这上语句还可以添加以下参数:

  • from : 起始的position位置
  • limit : 读取的起始offset和limit条数

数据库二进制日志变更日志

(2)打开数据变量日志文件
  1. tail -200f logs/example/meta.log

canal数据变更日志文件

(3)变更数据触发数据同步

通过客户端变更数据,如插入数据、修改数据或删除数据操作

查看前两个步骤的日志,比较两个position是否相同

7.canal其他操作
  • bin/stop.sh : 关闭canal
  • bin/restart.sh : 重启canal