MySQL增量订阅消费组件Canal POC

POC的目的:
1、与MySQL的对接方式,配置文档
2、订阅的延迟
3、订阅后宕机消息会不会丢失
4、能不能从指定的点开始重新订阅
5、高并发写入的时候,日志的顺序是否还能保持,不考虑消费的情况订阅是否会延迟

Canal介绍

官网地址:https://github.com/alibaba/canal

MySQL主备复制原理

MySQL增量订阅消费组件Canal POC

从上层来看,复制分成三步:

master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看);

slave将master的binary log events拷贝到它的中继日志(relay log);

slave重做中继日志中的事件,将改变反映它自己的数据。

Canal工作原理

MySQL增量订阅消费组件Canal POC

原理相对比较简单:

canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议

mysql master收到dump请求,开始推送binary log给slave(也就是canal)

canal解析binary log对象(原始为byte流)

Canal安装部署 下载canal

直接下载,访问:https://github.com/alibaba/canal/releases,也可以在linux上直接联网下载:

服务端包:https://github.com/alibaba/canal/releases/download/v1.0.23/canal.deployer-1.0.23.tar.gz

客户端包:https://github.com/alibaba/canal/releases/download/v1.0.23/canal.example-1.0.23.tar.gz

解压canal

Mkdir /app/canal

Mkdir /app/canal-example

Tar zxvf canal.deployer-1.0.23.tar.gz -C /app/canal

Tar zxvf canal.example-1.0.23.tar.gz -C /app/canal-example

MySQL配置修改

a. canal的原理是基于mysql binlog技术,所以这里一定需要开启mysql的binlog写入功能,建议配置binlog模式为row.

**针对阿里云RDS账号默认已经有binlog dump权限,不需要任何权限或者binlog设置,可以直接跳过这一步**

[mysqld]

log-bin=mysql-bin #添加这一行就ok

binlog-format=ROW #选择row模式

server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复

b. canal的原理是模拟自己为mysql slave,所以这里一定需要做为mysql slave的相关权限.

CREATE USER canal IDENTIFIED BY 'canal'; 

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';

-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;

FLUSH PRIVILEGES;

针对已有的账户可直接通过grant

Canal配置修改 vi conf/example/instance.properties ################################################# ## mysql serverId canal.instance.mysql.slaveId = 1234   # position info,需要改成自己的数据库信息 canal.instance.master.address = 172.16.0.158: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 canal.instance.connectionCharset = UTF-8   # table regex canal.instance.filter.regex = .*\\..*   #################################################

说明:

Canal-Server启停 sh bin/startup.sh 启动 sh bin/stop.sh  停止 vi logs/canal/canal.log  查看canal日志 vi logs/example/example.log  查看instance的日志 Canal-Client启停 Cd /app/canal-example sh bin/startup.sh 启动canal客户端 sh bin/stop.sh  停止canal客户端 tail -f /app/canal-example/logs/example/entry.log 查看canal客户端订阅的日志

尝试修改mysql数据库,如上述我们配置的库是canal,我们创建一个userinfo的用户表,可以在entry.log里面打印出userinfo的信息

Canal-Client开发

到此为止整个canal环境搭建完成。

不过canal-example是一个已经编译好的包,如果我们需要对源码进行修改,输出一些我们自己想要的信息,可以重新开发canal客户端。

客户端源码官方下载地址:https://github.com/alibaba/canal/wiki/ClientExample

Canal-Server HA配置

更多配置策略请参考官方文档:https://github.com/alibaba/canal/wiki/AdminGuide

a. 修改canal.properties,加上zookeeper配置

canal.zkServers=172.16.7.122:2181 canal.instance.global.spring.xml = classpath:spring/default-instance.xml

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/309b2fbade1cfe8889d2a64e048de0b2.html