一、简介

canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。

基于日志增量订阅和消费的业务包括

  • 数据库镜像
  • 数据库实时备份
  • 索引构建和实时维护(拆分异构索引、倒排索引等)
  • 业务 cache 刷新
  • 带业务逻辑的增量数据处理

当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x。

二、工作原理

MySQL主备复制原理

  • MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)
  • MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
  • MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据

canal 工作原理

  • canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
  • MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
  • canal 解析 binary log 对象(原始为 byte 流)

三、安装配置

本文基于canal的版本是1.1.5。配置的示例为从增量从mysql到消息队列kafka的例子。

1、mysql的binlog日志开启的配置

在mysql配置文件中修改配置,如果是默认mysql安装的,linux可以到/etc/my.cnf下修改配置,window在my.ini下修改。

如上图:在[mysql]区域中添加下面的配置

server-id=1

# 开启binlog
log-bin=mysql-bin # 选择ROW模式
binlog-format=ROW # 可以不设置,即所有数据库都启用
binlog-do-db=启用binlog的数据库名称,多个可以使用逗号隔开

然后重新启动mysql

sudo systemctl restart mysqld

使用下面命令查看是否已经有binlog日志生成

sudo ls /var/lib/mysql

如果有下图红框类型的binlog文件生成,就表示开启成功

2、下载

下载可以到github上对资源包进行下载

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

如果下载困难,可以到csdn资源地址上下载,也可联系我

地址:https://download.csdn.net/download/Chenftli/85084080

3、解压

解压时一定要创建好canal的目录,如果你直接使用上级目录就会直接将bin、conf、log等文件解压到上级目录里。

创建安装目录

mkdir /book/install/canal-1.1.5

将下载好的压缩包解压到安装目录下

tar -zxvf canal.deployer-1.1.5.tar.gz -C /book/install/canal-1.1.5
4、修改全局配置

cd到配置目录

cd /book/install/canal-1.1.5/conf

配置全局配置文件

vim /book/install/canal-1.1.5/conf/canal.properties

如图修改如下配置:

上面分别配置了zookeeper地址、消息队列使用kafka,kafka的server地址,这里我们没有修改canal.destinations配置,默认使用example,所以接下来的实例配置conf/example中。

5、修改实例配置

实例的配置在.conf/example下,修改instance.properties配置文件

vim instance.properties

修改如下配置:

# mysql数据库的地址
canal.instance.master.address=node01:3306 # mysql的用户名、密码
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal # 消息队列
canal.mq.topic=example
canal.mq.partition=0

四、启动示例、测试

cd到安装canal的bin文件下,使用startup.sh脚本启动

cd /book/install/canal-1.1.5/bin

startup.sh

使用kafka消费端查看对于topic是否可以接收到mysql变动的数据

./bin/kafka-console-consumer.sh --bootstrap-server 你的kafka集群地址 --topic canal中配置的kafkatopic

五、参考

[1] alibaba canal github:https://github.com/alibaba/canal

canal的使用的更多相关文章

  1. 使用canal分析binlog(二) canal源码分析

    在能够跑通example后有几个疑问 1. canal的server端对于已经读取的binlog,client已经ack的position,是否持久化,保存在哪里 2. 即使不启动zookeeper, ...

  2. 使用canal分析binlog(一) 入门

    canal介绍 canal是应阿里巴巴存在杭州和美国的双机房部署,存在跨机房同步的业务需求而提出的.早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求.不过早期的数据库同步 ...

  3. 缓存一致性和跨服务器查询的数据异构解决方案canal

    当你的项目数据量上去了之后,通常会遇到两种情况,第一种情况应是最大可能的使用cache来对抗上层的高并发,第二种情况同样也是需要使用分库 分表对抗上层的高并发...逼逼逼起来容易,做起来并不那么乐观, ...

  4. Canal 同步异常分析:Could not find first log file name in binary log index file

    文章首发于[博客园-陈树义],点击跳转到原文Canal同步异常分析:Could not find first log file name in binary log index file. 公司搜索相 ...

  5. 【源码】canal和otter的高可靠性分析

    一般来说,我们对于数据库最主要的要求就是:数据不丢.不管是主从复制,还是使用类似otter+canal这样的数据库同步方案,我们最基本的需求是,在数据不丢失的前提下,尽可能的保证系统的高可用,也就是在 ...

  6. MySQL增量订阅&消费组件Canal POC

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

  7. 中间件——canal小记

    接到个小需求,将mysql的部分数据增量同步到es,但是不仅仅是使用canal而已,整体的流程是mysql>>canal>>flume>>kafka>> ...

  8. 【源码分析】Canal之Binlog的寻找过程

    binlog的寻找过程可能的场景如下: instance第一次启动 发生数据库主备切换 canal server HA情况下的切换 所以这个过程是能够保证binlog不丢失的关键点. 本文从源码的角度 ...

  9. 【Canal源码分析】Canal Instance启动和停止

    一.序列图 1.1 启动 1.2 停止 二.源码分析 2.1 启动 这部分代码其实在ServerRunningMonitor的start()方法中.针对不同的destination,启动不同的Cana ...

  10. CanalSharp-mysql数据库binlog的增量订阅&消费组件Canal的.NET客户端

    一.前言 CanalSharp是阿里巴巴开源项目mysql数据库binlog的增量订阅&消费组件 Canal 的.NET客户端,关于什么是 Canal?又能做什么?我会在后文为大家一一介绍.C ...

随机推荐

  1. SpringMVC获取请求参数-基本类型

    1.Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配 (json形式) <dependency> <groupId>com.faste ...

  2. 测试脚本配置、ORM必知必会13条、双下划线查询、一对多外键关系、多对多外键关系、多表查询

    测试脚本配置 ''' 当你只是想测试django中的某一个文件内容 那么你可以不用书写前后端交互的形式而是直接写一个测试脚本即可 脚本代码无论是写在应用下的test.py还是单独开设py文件都可以 ' ...

  3. 谈谈.NET Core下如何利用 AsyncLocal 实现共享变量

    前言 在Web 应用程序中,我们经常会遇到这样的场景,如用户信息,租户信息本次的请求过程中都是固定的,我们希望是这种信息在本次请求内,一次赋值,到处使用.本文就来探讨一下,如何在.NET Core 下 ...

  4. 伪元素 Before & Aster

    1. html 结构 <label class="is-required" for="name">姓名</label> <inpu ...

  5. PAT练习——1094 The Largest Generation (25 point(s))

    题目如下: #include<iostream> #include<vector> #include<algorithm> using namespace std; ...

  6. 看看JDK1.7与1.8的内存模型差异

    JDK1.7与1.8的区别的内存模型差异? jsk1.7的内存模型: 堆分为初生代和老年代,大小比例为1:2,初生代又分为eden.from.to三个区域,大小比例为8:1:1 方法区:有代码区.常量 ...

  7. 集成算法(Bagging & Boosting)

    用多种分类器一起完成同一份任务 Bagging策略(有放回的,随机的,子集大小一样的,m个训练集用同一个模型) Boosting-提升策略(串联) AdaBoost算法

  8. Linux 实现静态路由实验

    环境: 四台主机: A主机:eth0 NAT模式 R1主机:eth0 NAT模式,eth1 仅主机模式 R2主机:eth0 桥接模式,eth1仅主机模式 B主机:eth0 桥接模式 手动修改IP地址 ...

  9. Swift字符串操作-持续更新-2022

    Swift字符串追加 var str = "OC" str.append(" Swfit") print(str) // 输出结果: OC Swift 输出结果 ...

  10. 干货|SQL语句大全,所有的SQL都在这里了(建议收藏)

    一个执着于技术的公众号 一.基础 1.登录数据库 mysql -uroot -p123123 2.创建数据库 create database <数据库名> 3.删除数据库 drop dat ...