前言
canal 是阿里巴巴开源的一个项目,主要用途是基于 MySQL 数据库 binlog 日志解析,提供增量数据订阅和消费。
基于日志增量订阅和消费的业务包括:
- 数据库镜像
- 数据库实时备份
- 索引构建和实时维护(拆分异构索引、倒排索引等)
- 业务 cache 刷新
- 带业务逻辑的增量数据处理
MySQL 配置
修改 MySQL 配置文件/etc/mysql/my.cnf
,开启 binlog 写入功能,并配置模式为 ROW。
log-bin=mysql-bin # 开启
binlogbinlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
重启数据库,查看配置是否生效。命令是:sudo service mysql restart
mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.19 sec)
mysql>
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 4230 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
然后创建用户,并授权。
mysql> CREATE USER canal IDENTIFIED BY 'canal';
mysql> GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
mysql> FLUSH PRIVILEGES;
mysql> show grants for 'canal'@'%';
+----------------------------------------------------------------------------+
| Grants for canal@%% |
+----------------------------------------------------------------------------+
| GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO `canal`@`%` |
+----------------------------------------------------------------------------+
1 row in set (0.00 sec)
canal服务端
canal的原理呢,就是canal服务端来监听mysql的binlog,然后canal的客户端来连接并解析日志,达到自己想要的效果,比如增量数据到ES,我们用docker来启动服务端
第一步,拉取镜像
docker pull canal/canal-server:v1.1.4
第二步,写一个docker-compose,启动起来比较方便,或者直接使用它提供的脚本也可以。
version: '3'
services:
canal-server:
image: canal/canal-server:v1.1.4
container_name: canal-server
restart: unless-stopped
network_mode: host
ports:
- 11111:11111
environment:
- canal.auto.scan=false
- canal.instance.master.address=127.0.0.1:3306
- canal.instance.dbUsername=canal
- canal.instance.dbPassword=canal
- canal.instance.filter.regex=.*\\..*
- canal.destinations=test
- canal.instance.connectionCharset=UTF-8
- canal.instance.tsdb.enable=true
volumes:
- /root/canal/test/log/:/home/admin/canal-server/logs/
如果碰到
host network_mode is incompatible with port_bindings
这个错误,那我们直接用它默认的网络即可,将network_mode
删掉就好。
官方提供的shell脚本
# sh run.sh -e canal.auto.scan=false -e canal.destinations=test -e canal.instance.master.address=127.0.0.1:3306 -e canal.instance.dbUsername=canal -e canal.instance.dbPassword=canal -e canal.instance.connectionCharset=UTF-8 -e canal.instance.tsdb.enable=true -e canal.instance.gtidon=false
启动服务:
# docker-compose up
Recreating canal-server ... done
Attaching to canal-server
canal-server | DOCKER_DEPLOY_TYPE=VM
canal-server | ==> INIT /alidata/init/02init-sshd.sh
canal-server | ==> EXIT CODE: 0
canal-server | ==> INIT /alidata/init/fix-hosts.py
canal-server | ==> EXIT CODE: 0
canal-server | ==> INIT DEFAULT
canal-server | Generating SSH1 RSA host key: [ OK ]
canal-server | Starting sshd: [ OK ]
canal-server | Starting crond: [ OK ]
canal-server | ==> INIT DONE
canal-server | ==> RUN /home/admin/app.sh
canal-server | ==> START ...
canal-server | start canal ...
canal-server | start canal successful
canal-server | ==> START SUCCESSFUL ...
看见START SUCCESSFUL即启动成功。
canal客户端
直接copy官方的客户端代码即可,地址,我就不搬砖了
connected to 127.0.0.1:11111 Auth succed Subscribe succed
看到这个,即为成功
我们来验证一下,随便建个库,建个表,然后插入几条数据。
打印出的,db就是我们的库,table就是表,event_type字段1表示新增,2表示更新,3表示删除,data里就是我们的数据,可以根据自己的需要来灵活的变动。
补充
canal服务端启动之后,在docker-compose.yml
里设置的volumes
位置,会生成两个日志文件,分别是meta.log和test.log
,可以查看服务是不是正常,有没有报错信息。
后续如果要更改,更好的做法是将消息发送到消息队列,然后再从消息队列消费。在1.1.5版本中,官方支持了RabbitMQ,后续有时间再继续更新
- Post link: https://www.godhearing.cn/canal-tong-bu-es/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.