数据同步工具--Canal
数据同步工具--Canal前言canal简介定位工作原理名词解释实例部署环境准备jdk1.8版本zookeeper源端mysql环境参数初始化canal安装包安装部署配置修改启动查看日志监控运维监控运维前言最近有数据同步相关的需求,遂在网上查看相关的数据同步工具,便发现了阿里开源出来的数据增量同步工具canal,翻阅官方文档之后,最终确定先使用canal将源端数据同步到kafka,再通过发布订..
数据同步工具--Canal
前言
最近有数据同步相关的需求,遂在网上查看相关的数据同步工具,便发现了阿里开源出来的数据增量同步工具canal,翻阅官方文档之后,最终确定先使用canal将源端数据同步到kafka,再通过发布订阅模式将数据同步到不同的目标端这个整体方案,以下是我自个的一个搭建过程和其中总结的一些经验。。
canal简介
定位
基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了mysql
工作原理
- canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
- mysql master收到dump请求,开始推送binary log给slave(也就是canal)
- canal解析binary log对象(原始为byte流)
名词解释
-
server代表一个canal运行实例,对应于一个jvm
-
instance对应于一个数据队列即一个数据同步任务(1个server对应1…n个instance)
实例部署
环境准备
jdk1.8版本
必须为1.8版本以上,否则启动canal时会报错,无法启动,同时canal自己适配的客户端同步工具adapter也是需要1.8版本以上的jdk
zookeeper
搭建zk集群是为了实现canal服务端的高可用,canal通过唯一的instance(destination)名称(需要自己保证名称的唯一性)将实例信息注册到zk上,相同instance名称的服务端实例会被视为同一个canal集群的服务端,集群以主备方式存在,当主实例因为一些原因挂掉之后,zk会将备实例启动,整个canal集群中只会有一个实例运行。
源端mysql环境参数初始化
- 开启mysql的binlog写入功能
连接数据库执行语句,查看写入功能是否开启
没有开启log_bin的值是OFF,开启之后是ON
若为OFF,修改mysql的my.cnf配置文件,并重启MySQL实例
log-bin=mysql-bin #添加这一行就ok
binlog-format=ROW #选择row模式
- 创建数据同步数据库用户,并赋权
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
canal安装包
不同版本canal安装包下载地址:
https://github.com/alibaba/canal/releases
建议选择最新稳定版,修改了很多老版本的bug
因为同步消息发送到的kafka集群需要进行身份验证,而当前版本都不支持该功能,所有我在1.1.3版本的基础上修改源码增加了鉴权功能,然后自行编译打包,大家按需操作,附编译打包步骤
git clone git@github.com:alibaba/canal.git
cd canal;
mvn clean install -Dmaven.test.skip -Denv=release
编译完成后,会在根目录下产生
target/canal.deployer-$version.tar.gz
安装部署
- 解压缩
mkdir canal
tar zxvf canal.deployer-$version.tar.gz -C ./canal
解压后目录结构如下
配置修改
以下为同步到kafka所需修改配置,不做过多解释,具体配置作用查看canal的git文档:
https://github.com/alibaba/canal/wiki/AdminGuide
- 修改canal.properties
canal.zkServers = 127.0.0.1:2181,127.0.0.1:2182
canal.serverMode = kafka
canal.destinations = example
canal.instance.global.spring.xml = classpath:spring/default-instance.xml
canal.mq.servers = 127.0.0.1:9092,127.0.0.1:9094
- 修改instance.properties
canal.instance.master.address=127.0.0.1:3306
canal.instance.dbUsername=canaluser
canal.instance.dbPassword=canalpwd
canal.instance.connectionCharset = UTF-8
canal.instance.defaultDatabaseName =canaltest
canal.instance.filter.regex=canaltest\\..*
canal.mq.topic=testCanalTopic1
canal.mq.partition=0
-
canal.properties:系统根配置文件
-
instance.properties:instance级别的配置文件,每个instance一份
-
instance与canal.properties内的destinations配置对应,每个对应一个同名文件夹
启动
sh ./bin/startup.sh
查看日志
- 查看canal日志
tail -f ./logs/canal/canal.log
- 查看instance日志
tail -f ./logs/example/example.log
监控运维
监控
canal自身集成了prometheus,但是我只关注实例状态和同步延时这两个关键指标,所以便使用比较简单的方式监控。
prometheus集成地址:
https://github.com/alibaba/canal/wiki/Prometheus-QuickStart
- zookeeper集群状态监控
- canal服务端状态监控
#登录zk,使用命令查看工作节点状态
#命令
get /otter/canal/destinations/example/running
#返回结果
{"active":true,"address":"10.20.144.51:11111","cid":1}
- canal消费延迟监控
#登录zk,查看数据消费信息
#命令
get /otter/canal/destinations/example/1001/cursor
#结果返回,可通过当前时间与消费时间差值获取消费延迟
{"@type":"com.alibaba.otter.canal.protocol.position.LogPosition","identity":{"slaveId":-1,"sourceAddress":{"address":"10.20.144.15","port":3306}},"postion":{"included":false,"journalName":"mysql-bin.002253","position":2574756,"timestamp":1363688722000}
运维
- canal修改位点重新消费步骤
1. 关闭客户端 或 消费者
2. 关闭服务端
3. 修改需要重置位点的destination下instance.properties的配置文件中的canal.instance.master.journal.name = <此position对应的binlog名称>
canal.instance.master.position = <此position>
canal.instance.master.timestamp=<毫秒>
4.删除zk中对应destination的1001及其1001/下所有子节点
ex:rmr /otter/canal/destinations/example/1001
5. 重启服务端,查看相关日志
6. 重启客户端
以上就是我在搭建和使用 canal 过程中的一些总结,希望对你有所帮助!
欢迎关注我的个人微信公众号,一个菜鸟程序猿的技术技术分享和奔溃日常
更多推荐
所有评论(0)