全栈工程师开发手册 (作者:栾鹏)
架构系列文章
POC的目的:
1、与MYSQL的对接方式,配置文档
2、订阅的延迟
3、订阅后宕机消息会不会丢失
4、能不能从指定的点开始重新订阅
5、高并发写入的时候,日志的顺序是否还能保持,不考虑消费的情况订阅是否会延迟
Canal介绍
官网地址:https://github.com/alibaba/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
Mysql主备复制原理
从上层来看,复制分成三步:
master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看);
slave将master的binary log events拷贝到它的中继日志(relay log);
slave重做中继日志中的事件,将改变反映它自己的数据。
Canal工作原理
原理相对比较简单:
canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
mysql master收到dump请求,开始推送binary log给slave(也就是canal)
canal解析binary log对象(原始为byte流)
参考:https://www.cnblogs.com/jager/p/6594941.html
mysql的配置修改
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
docker 部署Canal服务端
docker run --name canal-server -e canal.instance.master.address=192.168.83.128:3306 -e canal.instance.dbUsername=root -e canal.instance.dbPassword=admin -p 11111:11111 -d canal/canal-server
k8s部署HA版本
需要zookeeper的支持
可以参考:https://www.cnblogs.com/jager/p/6594941.html
https://github.com/alibaba/canal/wiki/AdminGuide
部署
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客户端订阅的日志
删除表中的记录可以看到订阅的消息
自定义客户端
到此为止整个canal环境搭建完成。
不过canal-example是一个已经编译好的包,如果我们需要对源码进行修改,输出一些我们自己想要的信息,可以重新开发canal客户端。
客户端源码官方下载地址:https://github.com/alibaba/canal/wiki/ClientExample
Simple客户端例子:SimpleCanalClientTest
Cluster客户端例子:ClusterCanalClientTest
https://github.com/liukelin/canal_mysql_nosql_sync/blob/master/canal-client/src/canal/client/CanalClientTest.java