目录
前言
这句介绍有几个关键字:增量日志,增量数据订阅和消费。
这里我们可以简单地把canal理解为一个用来同步增量数据的一个工具。
接下来我们看一张官网提供的示意图:
canal的工作原理就是把自己伪装成MySQL slave,模拟MySQL slave的交互协议向MySQL Mater发送 dump协议,MySQL mater收到canal发送过来的dump请求,开始推送binary log给canal,然后canal解析binary log,再发送到存储目的地,比如MySQL,Kafka,Elastic Search等等。
搭建环境
- 操作系统: CentOS Linux release 8.2.2004 (Core)
- MySQL版本: mysql8.0.20
- JDK版本:1.8(强力要求,否则会导致ES和canal-adapter无法启动)
- ElasticSearch版本:7.6.0
- canal版本: 1.1.3
- zookeeper
技术方案概览
- 开启MySQL的binary log日志记录
- 修改MySQL的binary log模式为
ROW
- canal-server充当MySQL集群的一个slave,获取master的binary log信息
- canal-server将拿到的binary log信息推送给canal-adapter
- canal-server和canal-adapter采用多节点部署的方式提高可用性
- canal-adapter将数据同步到es集群
MySQL配置
先配置mysql数据库,打开binlog写入功能,设置binlog-format
为ROW。默认配置文件路径为 /etc/my.cnf
增加或者修改以下内容
[mysqld] ## 设置server_id,同一局域网中需要唯一 server_id=101 ## 指定不需要同步的数据库名称 binlog-ignore-db=mysql ## 开启二进制日志功能 log-bin=mall-mysql-bin ## 设置二进制日志使用内存大小(事务) binlog_cache_size=1M ## 设置使用的二进制日志格式(mixed,statement,row) binlog_format=row ## 二进制日志过期清理时间。默认值为0,表示不自动清理。 expire_logs_days=7 ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。 ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 slave_skip_errors=1062
配置完成后重新启动MySQL,重启后执行下面的SQL语句查看binlog是否启用:
show variables like '%log_bin%';
再查看binlog模式:
show variables like 'binlog_format%';
接下来需要创建一个拥有从库权限的账号,用于订阅binlog,这里创建的账号为canal:canal;
CREATE USER canal IDENTIFIED BY 'canal'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; FLUSH PRIVILEGES;
安装canal
使用canal前请先确保安装了mysql、elasticsearch、jdk
本文章使用的各软件版本为MySQL 8.0.25,ElasticSearch 7.8.0,java-1.8.0-openjdk.x86_64
到canal github项目页面下载1.1.5版本的文件:Releases · alibaba/canal · GitHub
建议下载以下四个。其中下载源码是为了解决canal.adapter中的一个依赖冲突,要保存在自己开发用的电脑里,后面会讲到它。
canal的各个组件的用途各不相同,下面分别介绍下:
canal-deploy:用于监听MySQL的binlog,是一个伪装的MySQL从库,只负责从MySQL主库接收数据,不做处理。
canal-adapter:canal的客户端,从canal-deploy中获取数据,然后同步数据到目标数据源,我们用它将数据存储到ElasticSearch中。
canal-admin:为canal提供整体配置管理、节点运维等面向运维的功能,提供相对友好的WebUI操作界面,方便更多用户快速和安全的操作。
canal-deployer的配置与使用
解压deployer:
mkdir canal_deployer
tar -zxvf canal.deployer-1.1.5.tar.gz -C canal_deployer
修改配置文件conf/example/instance.properties
vi canal_deployer/conf/example/instance.properties
修改下面几项配置:
# 需要同步数据的MySQL地址
canal.instance.master.address=127.0.0.1:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=
# 用于同步数据的数据库账号
canal.instance.dbUsername=canal
# 用于同步数据的数据库密码
canal.instance.dbPassword=canal
# 数据库连接编码
canal.instance.connectionCharset = UTF-8
# 需要订阅binlog的表过滤正则表达式
canal.instance.filter.regex=.*\\..*
启动deployer:
canal_deployer/bin/startup.sh
启动成功后查看deployer的日志:
tail -f can