阿里巴巴 MySQL binlog 增量订阅&消费组件-canal

随声附和 提交于 2020-02-26 23:02:19

简介 

基于数据库日志解析,提供增量数据订阅&消费 的一个开源组件,官网: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 

写累了 休息会~

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!