一、什么是canal
1.定位
Canal是阿里巴巴开源的一款基于mysql数据库binlog增量日志分析提供数据订阅和消费功能的组件
2.原理
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的配置文件,添加以下内容:
log-bin=mysql-bin
binlog-format=ROW
server-id=1
log-bin : 指定二进制日志文件的文件名,也是开启binlog的开关
binlog-format : binlog的日志格式,必须设置成ROW
server-id : 主节点的编号(不能与slave和canal的server-id相同)
修改配置后,请重启mysql
(2)为slave账户授权
通过mysql客户端连接到mysql服务器
创建用于复制的账号(设置账号和密码)
CREATE USER canal IDENTIFIED BY'canal';
为创建的账号授权
GRANT SELECT,REPLICATION SLAVE,REPLICATION CLIENT ON*.*TO'canal'@'%';
刷新权限
FLUSH PRIVILEGES
2.下载源码(1)下载二进制包
下载最新的稳定包
(2)编译成二进制包
3.修改配置
修改实例配置conf/example/instance.properties
# position info
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=
# username/password
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset=UTF-8
canal.instance.defaultDatabaseName=test
# table regex
canal.instance.filter.regex=.*\\..*
# table black regex
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.启动canalbin/startup.sh
5.查看日志logs/canal/canal.log : 查看服务的日志
logs/example/example.log : canal实例服务日志
logs/example/meta.log : 数据变更日志(有数据后自动生成)
6.检测canal搭建是否成功(1)通过客户端进入mysql服务器,查看binlog查看主节点状态,获取二进制文件名称
show master status;
查找当前二进制日志的位置
show binlog eventsin'mysql-bin.000009';
注:这上语句还可以添加以下参数:
from : 起始的position位置
limit : 读取的起始offset和limit条数
(2)打开数据变量日志文件tail-200flogs/example/meta.log
(3)变更数据触发数据同步
通过客户端变更数据,如插入数据、修改数据或删除数据操作
查看前两个步骤的日志,比较两个position是否相同
7.canal其他操作bin/stop.sh : 关闭canal
bin/restart.sh : 重启canal