什么是canal?
canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费
早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。
基于日志增量订阅和消费的业务包括
- 数据库镜像
- 数据库实时备份
- 索引构建和实时维护(拆分异构索引、倒排索引等)
- 业务 cache 刷新
- 带业务逻辑的增量数据处理
当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x
canal通过伪装成mysql的一台从服务器,通过binlog获取数据库日志再进行转发处理
部署准备
准备一台centos服务器
准备一台mysql服务器(也可以是一起的)
安装java```bash yum list java-1.8* yum install java-1.8.0-openjdk* -y
mysql需要配置成主服务器,增加server-id,建立数据库用户等 修改my.cnf ```bash server-id=1 ## 服务器id,主从同步要用到的 log-bin=mysql-bin ## 开启binlog binlog_format=row ## 设置binlog模式 binlog-do-db=## 你的数据库名字,多个用逗号分割,可以删除这行
执行sql语句增加用户
-- 使用命令登录:mysql -u root -p -- 创建用户 用户名:canal 密码:Canal@123456 create user 'canal'@'%' identified by 'Canal@123456'; -- 授权 *.*表示所有库 grant SELECT, REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'canal'@'%' identified by 'Canal@123456';
下载canal
下载地址:https://github.com/alibaba/canal/releases
下载
cd /tmp/canal-deployer wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz tar -zvxf canal.deployer-1.1.5.tar.gz cd ../ mv canal-deployer/ /usr/local/ ## 移动目录 cd /usr/local/canal-deployer/ ## 进入目录
部署安装canal
本文只先说明单机部署canal
配置项说明:
sh-4.4# tree conf/ conf/ |-- canal.properties (系统根配置文件) |-- canal_local.properties (instance级别的配置文件,每个instance一份) |-- example (数据库监听实例目录) | |-- h2.mv.db | |-- instance.properties | `-- meta.dat |-- logback.xml |-- metrics | `-- Canal\_instances\_tmpl.json `-- spring |-- base-instance.xml |-- default-instance.xml |-- file-instance.xml |-- group-instance.xml |-- memory-instance.xml `-- tsdb |-- h2-tsdb.xml |-- mysql-tsdb.xml |-- sql | `-- create_table.sql `-- sql-map |-- sqlmap-config.xml |-- sqlmap_history.xml `-- sqlmap_snapshot.xml 6 directories, 18 files sh-4.4#
我们只需要关注 example下的instance.properties即可:
# position info canal.instance.master.address=mysql-test:3306 # mysql连接地址 canal.instance.master.journal.name= # mysql binlog 起始文件 canal.instance.master.position= # binlog 的位置 canal.instance.master.timestamp= canal.instance.master.gtid= . .省略内容 . # username/password canal.instance.dbUsername=canal canal.instance.dbPassword=123456 canal.instance.connectionCharset = UTF-8 # enable druid Decrypt database password canal.instance.enableDruid=false #canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==
在上面的binlog日志文件配置可不填,启动后 canal将自动获取最后的数据配置,也可以自定义起始位置,然后获取旧数据
找到项目中的 /bin/start.sh文件,执行即可守护进程启动:
./bin/startup.sh ./bin/restart.sh ./bin/stop.sh
启动成功后,可以在logs目录找到日志,查看启动状态:
sh-4.4# tree logs logs |-- canal canal主服务日志 | |-- canal.log | `-- canal_stdout.log `-- example mysql实例连接日志 |-- example.log `-- meta.log 2 directories, 4 files sh-4.4#
go客户端连接
通过引入一个小小的canal 客户端,即可连接数据,具体教程可查看:
https://github.com/withlin/canal-go
运行截图: