最近有数据同步相关的需求,遂在网上查看相关的数据同步工具,便发现了阿里开源出来的数据增量同步工具canal,翻阅官方文档之后,最终确定先使用canal将源端数据同步到kafka,再通过发布订阅模式将数据同步到不同的目标端这个整体方案,以下是我自个的一个搭建过程和其中总结的一些经验。。
基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了mysql
server代表一个canal运行实例,对应于一个jvm
instance对应于一个数据队列即一个数据同步任务(1个server对应1…n个instance)
必须为1.8版本以上,否则启动canal时会报错,无法启动,同时canal自己适配的客户端同步工具adapter也是需要1.8版本以上的jdk
搭建zk集群是为了实现canal服务端的高可用,canal通过唯一的instance(destination)名称(需要自己保证名称的唯一性)将实例信息注册到zk上,相同instance名称的服务端实例会被视为同一个canal集群的服务端,集群以主备方式存在,当主实例因为一些原因挂掉之后,zk会将备实例启动,整个canal集群中只会有一个实例运行。
连接数据库执行语句,查看写入功能是否开启
没有开启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安装包下载地址:
https://github.com/alibaba/canal/releases
建议选择最新稳定版,修改了很多老版本的bug
因为同步消息发送到的kafka集群需要进行身份验证,而当前版本都不支持该功能,所有我在1.1.3版本的基础上修改源码增加了鉴权功能,然后自行编译打包,大家按需操作,附编译打包步骤
git clone [email protected]: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.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
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
tail -f ./logs/canal/canal.log
tail -f ./logs/example/example.log
canal自身集成了prometheus,但是我只关注实例状态和同步延时这两个关键指标,所以便使用比较简单的方式监控。
prometheus集成地址:
https://github.com/alibaba/canal/wiki/Prometheus-QuickStart
#登录zk,使用命令查看工作节点状态
#命令
get /otter/canal/destinations/example/running
#返回结果
{"active":true,"address":"10.20.144.51:11111","cid":1}
#登录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}
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 过程中的一些总结,希望对你有所帮助!
欢迎关注我的个人微信公众号,一个菜鸟程序猿的技术技术分享和奔溃日常