前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Canal 安装

Canal 安装

作者头像
用户1483438
发布于 2022-07-26 13:42:05
发布于 2022-07-26 13:42:05
66100
代码可运行
举报
文章被收录于专栏:大数据共享大数据共享
运行总次数:0
代码可运行

简单介绍

下载

官网最新版本 我本地版本canal-1.1.2

image.png
image.png

解压安装

  • 在解压后的目录中创建一个canal目录 原因下面说
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[admin@hadoop102 software]$ mkdir /opt/module/canal
  • 解压到该目录中
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 tar -zxvf canal.deployer-1.1.2.tar.gz -C /opt/module/canal
  • 查看/opt/module/canal目录 之所以需要创建一个目录,就是因为canal解压之后,就是四个独立的文件(binconfliblogs),并没有被包装起来。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[admin@hadoop102 software]$ ll /opt/module/canal
总用量 4
drwxrwxr-x. 2 admin admin 76 731 19:18 bin
drwxrwxr-x. 5 admin admin 93 731 19:18 conf
drwxrwxr-x. 2 admin admin 4096 731 19:18 lib
drwxrwxr-x. 2 admin admin 6 1126 2018 logs

conf

  • 接入到conf目录中
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-rwxrwxr-x. 1 admin admin 4262 1126 2018 canal.properties
drwxrwxr-x. 2 admin admin 33 731 19:18 example
-rwxrwxr-x. 1 admin admin 3109 1126 2018 logback.xml
drwxrwxr-x. 2 admin admin 39 731 19:18 metrics
drwxrwxr-x. 3 admin admin 149 731 19:18 spring

有两个很重要的文件 第一个就是:canal.properties 第二个就是:example目录下的instance.properties 文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-rwxrwxr-x. 1 admin admin 1572 1126 2018 instance.properties

了解上面两个配置文件之前先看一张图

canal架构
canal架构

Canal Server:就是我们现在安装的Canal服务。 目前Canal是可以将数据写入到一些中间中,比如KafkaRabbitMQActiveMQ该版本应该是不支持的。

  • canal.properties: 就是用于做全局配置
  • instance.properties: 是可以有多个的,你需要订阅几个mysql的实例,就配置几个instance.properties即可。比如你有两台服务器,都装了mysql分别为A和B。那么你可以配置两个instance.properties一个监听A服务器,一个监听B服务器。至于怎么配置,后面说。 instance.properties :包括mysql服务器的账号密码,ip端口等信息。

配置 canal.properties

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.file.data.dir = ${canal.conf.dir}
canal.file.flush.period = 1000
## memory store RingBuffer size, should be Math.pow(2,n)
canal.instance.memory.buffer.size = 16384
## memory store RingBuffer used memory unit size , default 1kb
canal.instance.memory.buffer.memunit = 1024
## meory store gets mode used MEMSIZE or ITEMSIZE
canal.instance.memory.batch.mode = MEMSIZE
canal.instance.memory.rawEntry = true

## detecing config
canal.instance.detecting.enable = false
#canal.instance.detecting.sql = insert into retl.xdual values(1,now()) on duplicate key update x=now()
canal.instance.detecting.sql = select 1
canal.instance.detecting.interval.time = 3
canal.instance.detecting.retry.threshold = 3
canal.instance.detecting.heartbeatHaEnable = false

# support maximum transaction size, more than the size of the transaction will be cut into multiple transactions delivery
canal.instance.transaction.size =  1024
# mysql fallback connected to new master should fallback times
canal.instance.fallbackIntervalInSeconds = 60

# network config
canal.instance.network.receiveBufferSize = 16384
canal.instance.network.sendBufferSize = 16384
canal.instance.network.soTimeout = 30

# binlog filter config
canal.instance.filter.druid.ddl = true
canal.instance.filter.query.dcl = false
canal.instance.filter.query.dml = false
canal.instance.filter.query.ddl = false
canal.instance.filter.table.error = false
canal.instance.filter.rows = false
canal.instance.filter.transaction.entry = false

# binlog format/image check
canal.instance.binlog.format = ROW,STATEMENT,MIXED
canal.instance.binlog.image = FULL,MINIMAL,NOBLOB

# binlog ddl isolation
canal.instance.get.ddl.isolation = false
# parallel parser config
canal.instance.parser.parallel = true
## concurrent thread number, default 60% available processors, suggest not to exceed Runtime.getRuntime().availableProcessors()
#canal.instance.parser.parallelThreadSize = 16
## disruptor ringbuffer size, must be power of 2
canal.instance.parser.parallelBufferSize = 256

# table meta tsdb info
canal.instance.tsdb.enable = true
canal.instance.tsdb.dir = ${canal.file.data.dir:../conf}/${canal.instance.destination:}
canal.instance.tsdb.url = jdbc:h2:${canal.instance.tsdb.dir}/h2;CACHE_SIZE=1000;MODE=MYSQL;
canal.instance.tsdb.dbUsername = canal
canal.instance.tsdb.dbPassword = canal
# dump snapshot interval, default 24 hour
canal.instance.tsdb.snapshot.interval = 24
# purge snapshot expire , default 360 hour(15 days)
canal.instance.tsdb.snapshot.expire = 360

# aliyun ak/sk , support rds/mq
canal.aliyun.accesskey =
canal.aliyun.secretkey =

#################################################
#########               destinations            #############
#################################################
canal.destinations = example
# conf root dir
canal.conf.dir = ../conf
# auto scan instance dir add/remove and start/stop instance
canal.auto.scan = true
canal.auto.scan.interval = 5

canal.instance.tsdb.spring.xml = classpath:spring/tsdb/h2-tsdb.xml
#canal.instance.tsdb.spring.xml = classpath:spring/tsdb/mysql-tsdb.xml

canal.instance.global.mode = spring
canal.instance.global.lazy = false
#canal.instance.global.manager.address = 127.0.0.1:1099
#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
canal.instance.global.spring.xml = classpath:spring/file-instance.xml
#canal.instance.global.spring.xml = classpath:spring/default-instance.xml

中间件相关的配置(暂时不用改)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##################################################
#########                    MQ                      #############
##################################################
canal.mq.servers = 127.0.0.1:6667
canal.mq.retries = 0
canal.mq.batchSize = 16384
canal.mq.maxRequestSize = 1048576
canal.mq.lingerMs = 1
canal.mq.bufferMemory = 33554432
canal.mq.canalBatchSize = 50
canal.mq.canalGetTimeout = 100
canal.mq.flatMessage = true
canal.mq.compressionType = none
canal.mq.acks = all

若开启了中间件,那么要将canal.serverMode改成kafka或者RocketMQ

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#tcp, kafka, RocketMQ
canal.serverMode = tcp

目前只需要改一个地方,设置canal.ip,将其设置为当前服务器的IP即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
canal.ip =192.168.102.55

配置 instance.properties

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#################################################
## mysql serverId , v1.0.26+ will autoGen
# canal.instance.mysql.slaveId=0

# enable gtid use true/false
canal.instance.gtidon=false

# position info
canal.instance.master.address=127.0.0.1:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=

# rds oss binlog
canal.instance.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=

# table meta tsdb info
canal.instance.tsdb.enable=true
#canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
#canal.instance.tsdb.dbUsername=canal
#canal.instance.tsdb.dbPassword=canal

#canal.instance.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp =
#canal.instance.standby.gtid=

# 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
#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==

# table regex
canal.instance.filter.regex=.*\\..*
# table black regex
canal.instance.filter.black.regex=

# mq config
canal.mq.topic=example
canal.mq.partition=0
# hash partition config
#canal.mq.partitionsNum=3
#canal.mq.partitionHash=mytest.person:id,mytest.role:id
#################################################

配置要订阅的mysql的实例信息

  • 打开canal.instance.mysql.slaveId,用于配置从机(slave)Id。必须与mysql中的server-id不同。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
canal.instance.mysql.slaveId=2
  • position info 用于配置从主机那个位置开始订阅消息(图1959)

图1959
图1959

mysql-bin.* 文件,当mysql重启时会滚动一个文件,或文件数据达到500M时滚动一个文件。

问题来了,000012 有154个字节数据,那么需要从那个字节开始读呢?于是需要执行一个sql命令查看。

执行 SHOW MASTER STATUS; sql 命名

 image.png
image.png

该命令记录当前主机写入的数据最新位置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# position info
canal.instance.master.address=127.0.0.1:3306 # mysql服务器地址
canal.instance.master.journal.name=mysql-bin.000012 # SHOW MASTER STATUS; 查询的结果
canal.instance.master.position=154 # SHOW MASTER STATUS; 查询的结果
canal.instance.master.timestamp= #暂时不用配
canal.instance.master.gtid= #暂时不用配

配置canal用户(登录上主机,并拥有从机的同步权限)

通常默认的用户和密码就是canal

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# username/password
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal

我们不改他,在mysql中直接创建canal用户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%' IDENTIFIED BY 'canal';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

若出现上面类型的错误;说明是密码的策略达不到mysql的要求。解决方案降低密码强度,修改策略

SHOW VARIABLES LIKE 'validate_password%'; 可以查看密码策略

降低密码强度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set global validate_password_policy=0;
set global validate_password_length=1;

重新执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%' IDENTIFIED BY 'canal';

修改完成之后,记得还原

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set global validate_password_length=8; 
set global validate_password_policy=MEDIUM;

为了是账号立即生效,需要执行FLUSH PRIVILEGES;命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

验证canal用户是否成功创建成功

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select host,user from mysql.user ;
+-----------+-----------+
| host      | user      |
+-----------+-----------+
| %         | canal     |
| %         | root      |
| localhost | mysql.sys |
+-----------+-----------+
3 rows in set (0.00 sec)

最后

这样canal就按照和配置好了,接下啦就可以进行使用了。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
东哥手把手帮你刷通二叉树|第二期
上篇文章 手把手教你刷二叉树(第一篇) 连刷了三道二叉树题目,很多读者直呼内行。其实二叉树相关的算法真的不难,本文再来三道,手把手带你看看树的算法到底怎么做。
labuladong
2021/09/23
2430
labuladong的算法小抄之js实现-第0章-学习算法和刷题的框架思维
文章直达地址: https://labuladong.gitbook.io/algo/di-ling-zhang-bi-du-xi-lie/xue-xi-shu-ju-jie-gou-he-suan-fa-de-gao-xiao-fang-fa
用户1974410
2022/09/20
3390
【算法】499- 数据结构和算法学习指南
这是好久之前的一篇文章 学习数据结构的框架思维 的修订版。之前那篇文章收到广泛好评,没看过也没关系,这篇文章会涵盖之前的所有内容,并且会举很多代码的实例,谈谈如何使用框架思维,并且给对于算法无从下手的朋友给一点具体可执行的刷题建议。
pingan8787
2020/02/18
4470
六道入门树题目带你走入树结构的世界
需要修改一些条件,只需要在返回结果加上一个或者条件,tree1和tree2的左右子树分别比较即可
冷环渊
2022/04/06
1960
六道入门树题目带你走入树结构的世界
数据结构和算法学习指南
这篇文章会涵盖之前的所有内容,并且会举很多代码的实例,谈谈如何使用框架思维,并且给对于算法无从下手的朋友给一点具体可执行的刷题建议。
五分钟学算法
2020/02/24
7170
剑指offer:重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
帅地
2019/03/11
2.2K0
重建二叉树
该文讲述了如何通过递归的方法重建二叉树。首先,介绍了递归的基本思路,然后给出了具体的代码实现。通过一个例子来演示了如何通过递归的方法构建二叉树。
用户1148830
2018/01/03
6460
图解「剑指Offer」之用前序和中序遍历序列构建二叉树
题目中给出的是 前序 + 中序 的组合,那么我们仔细观察对比一下 前序遍历 与 中序遍历。
五分钟学算法
2019/08/30
3.8K0
图解「剑指Offer」之用前序和中序遍历序列构建二叉树
[labuladong算法小抄]手把手带你刷二叉树(第一期)
我们公众号的成名之作 学习数据结构和算法的框架思维 中多次强调,先刷二叉树的题目,先刷二叉树的题目,先刷二叉树的题目,因为很多经典算法,以及我们前文讲过的所有回溯、动归、分治算法,其实都是树的问题,而树的问题就永远逃不开树的递归遍历框架这几行破代码:
唯一Chat
2021/02/25
9980
[labuladong算法小抄]手把手带你刷二叉树(第一期)
leetcode刷题(97)——105. 从前序与中序遍历序列构造二叉树
通过上面的图观察规律,前序遍历第一个值肯定是根结点,中序遍历,根结点左边都是左子树,右边都是右子树
老马的编程之旅
2022/06/22
1880
leetcode刷题(97)——105. 从前序与中序遍历序列构造二叉树
【数据结构与算法】一起搞定面试中的二叉树题目(二)
作者:IOExceptioner 本文继续一起搞定面试中的二叉树(一)一文总结二叉树相关的面试题。 12. 二叉树的前序遍历 迭代解法 ArrayList<Integer> preOrder(TreeNode root){ Stack<TreeNode> stack = new Stack<TreeNode>(); ArrayList<Integer> list = new ArrayList<Integer>(); if(root == null){ return l
用户1634449
2018/10/18
5520
东哥手把手带你刷二叉树|第三期
接前文 手把手带你刷二叉树(第一期)和 手把手带你刷二叉树(第二期),本文继续来刷二叉树。
labuladong
2021/09/23
6270
LeetCode通关:连刷三十九道二叉树,刷疯了!
大家好,我是拿输出博客来督促自己刷题的老三,这一节我们来刷二叉树,二叉树相关题目在面试里非常高频,而且在力扣里数量很多,足足有几百道,不要慌,我们一步步来。我的文章很长,你们 收藏一下。
三分恶
2021/09/08
8570
剑指offer--重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
AI那点小事
2020/04/18
2840
东哥手把手带你套框架刷通二叉树|第一期
我们公众号的成名之作 学习数据结构和算法的框架思维 中多次强调,先刷二叉树的题目,先刷二叉树的题目,先刷二叉树的题目,因为很多经典算法,以及我们前文讲过的所有回溯、动归、分治算法,其实都是树的问题,而树的问题就永远逃不开树的递归遍历框架这几行破代码:
labuladong
2021/09/23
5940
二叉树八股文:递归改迭代通用模板
之前经常讲涉及递归的算法题,我说过写递归算法的一个技巧就是不要试图跳进递归细节,而是从递归框架上思考,从函数定义去理解递归函数到底该怎么实现。
labuladong
2021/09/23
4370
LintCode 前序遍历和中序遍历树构造二叉树题目代码
题目 根据前序遍历和中序遍历树构造二叉树. 注意事项 你可以假设树中不存在相同数值的节点 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 / 1 3 代码 /** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { *
desperate633
2018/08/22
2200
leetcode刷题(97)——106. 从中序与后序遍历序列构造二叉树
这样的遍历顺序差异,导致了preorder和inorder数组中的元素分布有如下特点:
老马的编程之旅
2022/06/22
1740
leetcode刷题(97)——106. 从中序与后序遍历序列构造二叉树
我的刷题经验总结
两年前刚开这个公众号的时候,我写了一篇 学习数据结构和算法的框架思维,现在已经 5w 多阅读了,这对于一篇纯技术文来说是很牛逼的数据。
labuladong
2021/10/14
7990
通过前序+中序和后序+中序来构建二叉树
首先我们要知道,三种不同遍历方式的过程。看下图很容易理解,并且不容易忘。 前序遍历:根 左 右 中序遍历:左 根 右 后序遍历:左 右 根
帅地
2019/12/24
2.5K0
推荐阅读
相关推荐
东哥手把手帮你刷通二叉树|第二期
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验