简介
基于数据库日志解析,提供增量数据订阅&消费 的一个开源组件,官网:https://github.com/alibaba/canal
MySQL主备复制原理
MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)
MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据
canal 工作原理
canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
canal 解析 binary log 对象(原始为 byte 流)
canal 应用架构
canal :canal Server + canal Client
mysql Instance↔ canal Instance ↔ canal Client
canal server代表一个canal运行实例,对应一个jvm,可对应(1...n)个数据队列(Instance)
Instance核心组件:
eventParser:数据源接入,模拟slave协议和master进行交互,解析协议
eventSink:Parser和Store连接器,进行数据过滤、加工、分发、归并
eventStore:数据存储 满足Ack <= Get <= put
metaManager:记录binlog解析位点和消费位点
Instance可通过spring xml的方式进行自定义配置
ps:高可用HA(High Availability)
安装与配置
mysql配置
#开启binlog;修改/etc/my.cnf,添加以下内容
#canal
log-bin=mysql-bin
binlog-format=ROW
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
#创建具有slave权限的账号
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
启动
下载 canal, release
wget https://github.com/alibaba/canal/releases/download/canal-1.0.17/canal.deployer-1.0.17.tar.gz
解压
mkdir /tmp/canal
tar zxvf canal.deployer-$version.tar.gz -C /tmp/canal
canal.properties(1) ;example?/instance.properties(1...n)
配置修改
vi conf/example/instance.properties
## mysql serverId
canal.instance.mysql.slaveId = 1234
#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.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp =
#username/password,需要改成自己的数据库信息
canal.instance.dbUsername = canal
canal.instance.dbPassword = canal
canal.instance.defaultDatabaseName =
canal.instance.connectionCharset = UTF-8
#table regex 白名单
canal.instance.filter.regex=.\*\\\\..\*
#table black regex 黑名单
canal.instance.filter.black.regex = .\*\\\\..\*
##如果系统是1个 cpu,需要将 canal.instance.parser.parallel 设置为 false
启动
sh bin/startup.sh
查看 server 日志
vi logs/canal/canal.log
查看 instance 的日志
vi logs/example/example.log
关闭
sh bin/stop.sh
canal Client示例
建立连接--订阅表--获取数据--确认提交|异常回滚--取消订阅--断开连接
Client connector
简单连接:SimpleCanalconnector
集群连接:ClusterCanalconnector
写累了 休息会~