简介
基于数据库日志解析,提供增量数据订阅&消费 的一个开源组件,官网: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</pre>
查看 instance 的日志
vi logs/example/example.log
关闭
sh bin/stop.sh
canal Client示例
建立连接--订阅表--获取数据--确认提交|异常回滚--取消订阅--断开连接
- Client connector
简单连接:SimpleCanalconnector
集群连接:ClusterCanalconnector
写累了 休息会~
来源:oschina
链接:https://my.oschina.net/zhangyaoJob/blog/3155958