数据同步工具--Canal

数据同步工具--Canal

  • 前言
  • canal简介
    • 定位
    • 工作原理
    • 名词解释
  • 实例部署
    • 环境准备
      • jdk1.8版本
      • zookeeper
      • 源端mysql环境参数初始化
      • canal安装包
    • 安装部署
      • 配置修改
      • 启动
      • 查看日志
  • 监控运维
    • 监控
    • 运维

前言

最近有数据同步相关的需求,遂在网上查看相关的数据同步工具,便发现了阿里开源出来的数据增量同步工具canal,翻阅官方文档之后,最终确定先使用canal将源端数据同步到kafka,再通过发布订阅模式将数据同步到不同的目标端这个整体方案,以下是我自个的一个搭建过程和其中总结的一些经验。。

canal简介

定位

基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了mysql

工作原理

数据同步工具--Canal_第1张图片

  1. canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
  2. mysql master收到dump请求,开始推送binary log给slave(也就是canal)
  3. canal解析binary log对象(原始为byte流)

名词解释

数据同步工具--Canal_第2张图片

  1. server代表一个canal运行实例,对应于一个jvm

  2. 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写入功能

连接数据库执行语句,查看写入功能是否开启
数据同步工具--Canal_第3张图片
没有开启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 [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.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

查看日志

  1. 查看canal日志
tail -f ./logs/canal/canal.log
  1. 查看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 过程中的一些总结,希望对你有所帮助!

欢迎关注我的个人微信公众号,一个菜鸟程序猿的技术技术分享和奔溃日常

一个菜鸟程序猿的技术技术分享和奔溃日常

你可能感兴趣的:(数据同步)