大数据技术之Canal入门篇

文章目录

  • 大数据技术之Canal入门篇
    • 写在前面
    • 第 1 章 Canal 入门
      • 1.1 什么是 Canal
      • 1.2 MySQL 的Binlog
        • 1.2.1 什么是 Binlog
        • 1.2.2 Binlog 的分类
      • 1.3 Canal 的工作原理
        • 1.3.1 MySQL 主从复制过程
        • 1.3.2 Canal 的工作原理
      • 1.4 使用场景
    • 第 2 章 MySQL 的准备
      • 2.1 创建数据库
      • 2.2 创建数据表
      • 2.3 修改配置文件开启Binlog
      • 2.4 重启 MySQL 使配置生效
      • 2.5 测试 Binlog 是否开启
        • 2.6 赋权限
    • 第 3 章 Canal 的下载和安装
      • 3.1 下载并解压 Jar 包
      • 3.2 修改 canal.properties 的配置
      • 3.3 修改instance.properties
    • 案例测试Error说明
    • 官方文档参考

写在前面

  • Canal版本:Canal-1.1.2

官网:https://github.com/alibaba/canal/

官方文档:https://github.com/alibaba/canal/wiki

第 1 章 Canal 入门

1.1 什么是 Canal

阿里巴巴 B2B 公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了同步杭州和美国异地机房的需求,从 2010年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务。

Canal 是用 Java 开发的基于数据库增量日志解析,提供增量数据订阅&消费的中间件。目前。Canal 主要支持了 MySQL 的 Binlog 解析,解析完成后才利用 Canal Client 来处理获得的相关数据。(数据库同步需要阿里的 Otter 中间件,基于 Canal)。

1.2 MySQL 的Binlog

1.2.1 什么是 Binlog

MySQL 的二进制日志可以说 MySQL 最重要的日志了,它记录了所有的 DDL 和 DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL 的二进制日志是事务安全型的。

一般来说开启二进制日志大概会有 1%的性能损耗。二进制有两个最重要的使用场景:

  • 其一:MySQL Replication 在Master 端开启Binlog,Master 把它的二进制日志传递给Slaves来达到 Master-Slave 数据一致的目的。

  • 其二:自然就是数据恢复了,通过使用 MySQL Binlog 工具来使恢复数据。

二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的 DDL 和 DML(除了数据查询语句)语句事件。

1.2.2 Binlog 的分类

MySQL Binlog 的格式有三种,分别是 STATEMENT,MIXED,ROW。在配置文件中可以选择配置 binlog_format= statement|mixed|row。三种格式的区别:

1)statement:语句级,binlog 会记录每次一执行写操作的语句。相对 row 模式节省空间,但是可能产生不一致性,比如update tt set create_date=now(),如果用 binlog 日志进行恢复,由于执行时间不同可能产生的数据就不同。

  • 优点:节省空间。
  • 缺点:有可能造成数据不一致。

2)row:行级, binlog 会记录每次操作后每行记录的变化。

  • 优点:保持数据的绝对一致性。因为不管 sql 是什么,引用了什么函数,他只记录执行后的效果。
  • 缺点:占用较大空间。

3)mixed:statement 的升级版,一定程度上解决了,因为一些情况而造成的statement模式不一致问题,默认还是 statement,在某些情况下譬如:

  • 当函数中包含 UUID() 时;
  • 包含 AUTO_INCREMENT 字段的表被更新时;
  • 执行 INSERT DELAYED 语句时;用 UDF 时;会按照 ROW 的方式进行处理

优缺点:

  • 优点:节省空间,同时兼顾了一定的一致性。
  • 缺点:还有些极个别情况依旧会造成不一致,另外 statement 和 mixed 对于需要对

binlog 的监控的情况都不方便。

综合上面对比,Canal 想做监控分析,选择row 格式比较合适。

1.3 Canal 的工作原理

1.3.1 MySQL 主从复制过程

  • Master 主库将改变记录,写到二进制日志(Binary Log)中;
  • Slave 从库向 MySQL Master 发送 dump 协议,将 Master 主库的 binary log events 拷贝到它的中继日志(relay log);
  • Slave 从库读取并重做中继日志中的事件,将改变的数据同步到自己的数据库。

1.3.2 Canal 的工作原理

很简单,就是把自己伪装成 Slave,假装从 Master 复制数据。

1.4 使用场景

  • 原始场景: 阿里 Otter 中间件的一部分

Otter 是阿里用于进行异地数据库之间的同步框架,Canal 是其中一部分。

  • 常见场景 1:更新缓存

  • 常见场景 2:抓取业务表的新增变化数据,用于制作实时统计(我们就是这种场景)

第 2 章 MySQL 的准备

2.1 创建数据库

2.2 创建数据表

CREATE TABLE user_info(
`id` VARCHAR(255),
`name` VARCHAR(255),
`sex` VARCHAR(255)
);

2.3 修改配置文件开启Binlog

[zhangsan@node01 module]$ sudo vim /etc/my.cnf
server-id=1  #配置mysql replaction需要定义,不能和canal的slaveId重复
log-bin=mysql-bin
binlog_format=row
binlog-do-db=gmall-2021

注意:binlog-do-db 根据自己的情况进行修改,指定具体要同步的数据库,如果不配置则表示所有数据库均开启Binlog

2.4 重启 MySQL 使配置生效

sudo systemctl restart mysqld

到/var/lib/mysql 目录下查看初始文件大小:154

[zhangsan@node01 lib]$ pwd
/var/lib
[zhangsan@node01  lib]$ sudo ls -l mysql
总用量 474152
-rw-r-----. 1 mysql mysql   56 8 月  7 2020 auto.cnf
drwxr-x---. 2 mysql mysql   4096 9 月  25 2020 azkaban
-rw-------. 1 mysql mysql   1680 8 月    7 2020 ca-key.pem
-rw-r--r--. 1 mysql mysql   1112 8 月    7 2020 ca.pem
drwxr-x--- 2 mysql mysql    4096 8 月  18 16:56 cdc_test
-rw-r--r--. 1 mysql mysql   1112 8 月    7 2020 client-cert.pem
-rw-------. 1 mysql mysql   1676 8 月    7 2020 client-key.pem
drwxr-x---. 2 mysql mysql   4096 9 月  25 2020 gmall_report
-rw-r----- 1 mysql mysql    1085 12 月  1 09:12 ib_buffer_pool
-rw-r-----. 1 mysql mysql 79691776 12 月 13 08:45 ibdata1
-rw-r-----. 1 mysql mysql 50331648 12 月 13 08:45 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 12 月 13 08:45 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 12 月 13 08:45 ibtmp1
drwxr-x--- 2 mysql mysql    4096 9 月  22 15:30 maxwell
drwxr-x---. 2 mysql mysql   4096 8 月  12 2020 metastore
drwxr-x---. 2 mysql mysql   4096 9 月  22 15:43 mysql
-rw-r-----. 1 mysql mysql   154 12 月 13 08:45 mysql-bin.000001
-rw-r----- 1 mysql mysql    19 12 月 13 08:45 mysql-bin.index
srwxrwxrwx 1 mysql mysql    0 12 月 13 08:45 mysql.sock
-rw------- 1 mysql mysql    5 12 月 13 08:45 mysql.sock.lock
drwxr-x---. 2 mysql mysql   4096 8 月    7 2020 performance_schema
-rw-------. 1 mysql mysql   1680 8 月    7 2020 private_key.pem
-rw-r--r--. 1   mysql   mysql   452 8 月 7 2020 public_key.pem
-rw-r--r--. 1   mysql   mysql   1112 8 月    7 2020 server-cert.pem
-rw --. 1   mysql   mysql   1680 8 月    7 2020 server-key.pem
drwxr-x---. 2   mysql   mysql   12288 8 月   7 2020 sys
drwxr-x--- 2 mysql mysql    4096 2 月    2 2021 test
[zhangsan@node01 lib]$

可以看到,mysql-bin.000001文件大小为154

2.5 测试 Binlog 是否开启

  • 插入数据
INSERT INTO user_info VALUES('1001','zhangsan','male');
  • 再次到/var/lib/mysql 目录下,查看index 文件的大小
-rw  --. 1   mysql   mysql   1680 8 月    7 2020 ca-key.pem
-rw-r--r--. 1   mysql   mysql   1112 8 月    7 2020 ca.pem
drwxr-x---  2   mysql   mysql   4096 8 月  18 16:56 cdc_test
-rw-r--r--. 1   mysql   mysql   1112 8 月    7 2020 client-cert.pem
-rw --. 1   mysql   mysql   1676 8 月    7 2020 client-key.pem
drwxr-x---. 2   mysql   mysql   4096 9 月  25 2020 gmall_report
-rw-r-----  1   mysql   mysql   1085 12 月  1 09:12 ib_buffer_pool
-rw-r-----. 1   mysql   mysql   79691776 12 月 13 08:45 ibdata1
-rw-r-----. 1   mysql   mysql   50331648 12 月 13 08:45 ib_logfile0
-rw-r-----. 1   mysql   mysql   50331648 12 月 13 08:45 ib_logfile1
-rw-r-----  1   mysql   mysql   12582912 12 月 13 08:45 ibtmp1
drwxr-x---  2   mysql   mysql   4096 9 月  22 15:30 maxwell
drwxr-x---. 2   mysql   mysql   4096 8 月  12 2020 metastore
drwxr-x---. 2   mysql   mysql   4096 9 月  22 15:43 mysql
-rw-r-----. 1   mysql   mysql   452 12 月 13 08:45 mysql-bin.000001
-rw-r-----  1   mysql   mysql   19 12 月 13 08:45 mysql-bin.index
srwxrwxrwx  1   mysql   mysql   0 12 月 13 08:45 mysql.sock
-rw-------  1   mysql   mysql   5 12 月 13 08:45 mysql.sock.lock
drwxr-x---. 2   mysql   mysql   4096 8 月    7 2020 performance_schema
-rw --. 1   mysql   mysql   1680 8 月    7 2020 private_key.pem
-rw-r--r--. 1   mysql   mysql   452 8 月 7 2020 public_key.pem
-rw-r--r--. 1   mysql   mysql   1112 8 月    7 2020 server-cert.pem
-rw --. 1   mysql   mysql   1680 8 月    7 2020 server-key.pem
drwxr-x---. 2   mysql   mysql   12288 8 月   7 2020 sys
drwxr-x--- 2 mysql mysql    4096 2 月    2 2021 test
[zhangsan@node01 lib]$

可以看到,mysql-bin.000001文件大小变大了(452)

2.6 赋权限

在 MySQL 中执行:修改MySQL密码长度;赋予canal用户select权限

mysql> set global validate_password_length=4;
mysql> set global validate_password_policy=0;
mysql> GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO
'canal'@'%' IDENTIFIED BY 'canal' ;

查看mysql库下的user表

第 3 章 Canal 的下载和安装

3.1 下载并解压 Jar 包

https://github.com/alibaba/canal/releases

下载完之后 将canal.deployer-1.1.2.tar.gz 拷贝到/opt/sortware目录下,然后解压到/opt/module/canal-1.1.2 包下

注意:canal 解压后是分散的,我们在指定解压目录的时候需要将canal 指定上

3.2 修改 canal.properties 的配置

[zhangsan@node01 conf]$ pwd
/opt/module/canal/conf
[zhangsan@node01 conf]$ vim canal.properties #################################################
#########   common argument ############# #################################################
canal.id = 1 canal.ip = canal.port = 11111
canal.metrics.pull.port = 11112 canal.zkServers =
# flush data to zk canal.zookeeper.flush.period = 1000 canal.withoutNetty = false
# tcp, kafka, RocketMQ canal.serverMode = tcp
# flush meta cursor/parse position to file

说明:这个文件是 canal 的基本通用配置,canal 端口号默认就是 11111,修改 canal 的输出 model,默认 tcp,改为输出到kafka

多实例配置如果创建多个实例,通过前面 canal 架构,我们可以知道,一个 canal 服务中可以有多个instance,conf/下的每一个 example 即是一个实例,每个实例下面都有独立的配置文件。默认只有一个实例 example,如果需要多个实例处理不同的 MySQL 数据的话,直接拷贝出多个 example,并对其重新命名,命名和配置文件中指定的名称一致,然后修改 canal.properties 中的 canal.destinations=实例 1,实例 2,实例 3。

#################################################
#########   destinations    ############# #################################################
canal.destinations = example

3.3 修改instance.properties

我们这里只读取一个 MySQL 数据,所以只有一个实例,这个实例的配置文件在conf/example 目录下

[zhangsan@node01 example]$ pwd
/opt/module/canal/conf/example
[zhangsan@node01 example]$ vim instance.properties
  • 配置 MySQL 服务器地址

Note:canal.instance.mysql.slaveId的值不能跟/etc/my.cnf的server-id值一样;因为canal相当于一个从节点,主从复制时,server-id就不能一样。

#################################################
## mysql serverId , v1.0.26+ will autoGen
canal.instance.mysql.slaveId=20# enable gtid use true/false
canal.instance.gtidon=false# position info
canal.instance.master.address=node01:3306
  • 配置连接 MySQL 的用户名和密码,默认就是我们前面授权的canal
# username/password
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal canal.instance.connectionCharset = UTF-8
canal.instance.defaultDatabaseName =test
# enable druid Decrypt database password
canal.instance.enableDruid=false

案例测试Error说明

报错信息:查看日志,在canal安装目录下的logs/canal/canal.log,前提是canal.properties的配置项canal.destinations = example 没有更改,如果是更改为【test_xxx】,则日志位于canal安装目录下的logs/test_xxx/test_xxx.log

[zhangsan@node01 canal]$ cat canal.log
2023-01-07 15:10:56.713 [main] INFO  com.alibaba.otter.canal.deployer.CanalLauncher - ## set default uncaught exception handler
2023-01-07 15:10:56.759 [main] INFO  com.alibaba.otter.canal.deployer.CanalLauncher - ## load canal configurations
2023-01-07 15:10:56.771 [main] INFO  com.alibaba.otter.canal.deployer.CanalStarter - ## start the canal server.
2023-01-07 15:10:56.851 [main] INFO  com.alibaba.otter.canal.deployer.CanalController - ## start the canal server[192.102.153.10(192.102.153.10):11111]
2023-01-07 15:10:58.627 [main] INFO  com.alibaba.otter.canal.deployer.CanalStarter - ## the canal server is running now ......
2023-01-07 15:10:58.822 [canal-instance-scan-0] INFO  com.alibaba.otter.canal.deployer.CanalController - auto notify start doris-load successful.
2023-01-07 15:15:34.251 [New I/O server worker #1-1] ERROR c.a.otter.canal.server.netty.handler.SessionHandler - something goes wrong with channel:[id: 0x71dc2f6d, /192.102.153.1:57500 => /192.102.153.10:11111], exception=java.io.IOException: Connection reset by peerat sun.nio.ch.FileDispatcherImpl.read0(Native Method)at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)at sun.nio.ch.IOUtil.read(IOUtil.java:192)at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:322)at org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:281)at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:201)at org.jboss.netty.util.internal.IoWorkerRunnable.run(IoWorkerRunnable.java:46)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

关于这个error,我查找了一些资料,但是都没有帮助

https://github.com/alibaba/canal/issues/3585

同时也遇到过下面的error

https://github.com/alibaba/canal/issues/640

实时监控MySQL数据不成功

原因:因为一开始解压canal的时候,没有先创建一个安装目录,直接将canal解压了,导致canal的目录分散了,然后就将分散的目录都移动到新建的目录canal-1.1.5下

解决方法:

直接删除掉canal-1.1.5目录即可,重新解压安装canal

官方文档参考

  • AdminGuide

https://github.com/alibaba/canal/wiki/AdminGuide

  • ClientAPI

https://github.com/alibaba/canal/wiki/ClientAPI

  • ClientExample

https://github.com/alibaba/canal/wiki/ClientExample

结束!

大数据技术之Canal入门篇相关推荐

  1. 大数据技术——Hadoop3.X入门搭建+安装调优(1.入门)

    文章目录 一.大数据概论 二.Hadoop概述 三.Hadoop 运行环境搭建 (开发 重点) 3.1 模板虚拟机环境准备 3.2 克隆虚拟机 3.3 在hadoop102安装JDK 3.4 在had ...

  2. 大数据技术背景介绍(开号篇)

    1.什么是大数据? 大数据(Big Data),指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需要新处理模式才能具有更强的决策力.洞察发现力和流程优化能力的海量.高增长率和多样 ...

  3. 大数据技术概述与入门

    一.大数据概述 大数据概念最初来自于2009年的<自然>杂志, Ginsberg采用大数据搜索引擎查询数据并对流行性流感活动进行检测,之后在2011年2月<科学>杂志通过社会调 ...

  4. 大数据竞赛平台——Kaggle 入门篇

    这篇文章适合那些刚接触Kaggle.想尽快熟悉Kaggle并且独立完成一个竞赛项目的网友,对于已经在Kaggle上参赛过的网友来说,大可不必耗费时间阅读本文.本文分为两部分介绍Kaggle,第一部分简 ...

  5. 大数据技术——Hadoop3.X入门搭建+安装调优(2.HDFS)

    文章目录 一.HDFS概述 1.1 HDFS产出背景及定义 1.2 HDFS优缺点 1.3 HDFS组成架构 1.4 HDFS文件块大小(面试重点) 二.HDFS的Shell操作(开发重点) 2.1 ...

  6. 《大数据技术从零开始》自学知识库(2022年整理)

    文章目录 计算机组成原理 操作系统 数据结构与算法 计算机网络 Linux系统 Java Scala Python MySQL 分布式系统 Netty Hadoop HDFS MapReduce Ya ...

  7. 【学习笔记】大数据技术之HBase

    大数据技术之HBase 思考? 1. RegionServer和Master的区别? 2. Hbase端口 3. HBase写流程中,为什么要和zk进行交互? 第 1 章 HBase 简介 1.1 H ...

  8. 尚硅谷大数据技术Scala教程-笔记04【集合】

    视频地址:尚硅谷大数据技术之Scala入门到精通教程(小白快速上手scala)_哔哩哔哩_bilibili 尚硅谷大数据技术Scala教程-笔记01[Scala课程简介.Scala入门.变量和数据类型 ...

  9. 大数据竞赛平台——Kaggle 入门

    大数据竞赛平台--Kaggle 入门篇 这篇文章适合那些刚接触Kaggle.想尽快熟悉Kaggle并且独立完成一个竞赛项目的网友,对于已经在Kaggle上参赛过的网友来说,大可不必耗费时间阅读本文.本 ...

最新文章

  1. 当一回标题党“数理系优秀校友访谈”
  2. 数据中心的供配电与空调
  3. 关于linux的服务器搭建,关于搭建linux日志服务器
  4. 自动化要不要学python-老男孩linux自动化运维|做人工智能为什么要学Python呢?
  5. 在Word中如何实现后退?
  6. chosen jquery ajax搜索,基于chosen插件实现人员选择树搜索自动筛选功能
  7. 数据科学 IPython 笔记本 8.14 自定义 Matplotlib:配置和样式表
  8. 虚拟机NAT模式下 Host ‘192.168.x.1‘ is not allowed to connect to this MySQL server 问题解决!
  9. 声学信号频谱图分类(十三)
  10. iOS 全局变量(转)
  11. 终于会用c#中的delegate(委托)和event(事件)了
  12. vim配置——C/C++代码自动补全
  13. idea在 keymap下的eclipse的快捷键
  14. java detach_Java Node.detach方法代码示例
  15. vue单页面应用项目优化总结
  16. Android开发-API指南-uses-feature(1)
  17. php利用七牛云的对象存储完成图片上传-高效管理图片(用php搭建一个自己的图床) nice!!!
  18. qq邮箱 实现邮件的发送
  19. 用 BERT 精简版 DistilBERT+TF.js,提升问答系统 2 倍性能
  20. C 生化危机 SDUT

热门文章

  1. 关于机器人状态估计(13)-线性代数有多重要?18.06总结
  2. 小程序页面传值、页面与组件通信方式总结
  3. 男人二十岁后应该学会的习惯 - 褪墨
  4. SPSS Modeler建立ODBC数据源使用数据库文件
  5. java后台实现支付宝支付接口、支付宝订单查询接口 前端为APP
  6. cf 940E Cashback
  7. Echart实现折线图
  8. 基于TI AM5728(浮点双DSP C66x +双ARM Cortex-A15)的开发板
  9. SAP应用界面开发:SELECT-OPTIONS对象、PARAMETERS 对象
  10. 产业洞察:4成云计算企业落地北京,资本加持之下形成良好应用生态