「从零单排canal 02」canal集群版 + admin控制台 最新搭建姿势(基于1.1.4版本)
canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据 订阅 和 消费。应该是阿里云DTS(Data Transfer Service)的开源版本,开源地址:
https://github.com/alibaba/canal。
canal从1.1.4版本开始引入了admin控制台,有了很多不一样的配置方式。在搭建过程中如果仅仅按照wiki的用户手册,还是容易踩很多坑的。因此,将笔者在搭建过程中的步骤记录下来,作为官方wiki的 补充,希望能有所帮助。
根据本文内容与搭建顺序 ,并搭配对应的官网文档链接,应该就能快速搭建完成了,enjoy~
1. 部署canal-admin
1)部署服务
官方文档地址:
https://github.com/alibaba/canal/wiki/Canal-Admin-QuickStart
主要配置application.yml文件
server:
port: 8089 spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8 spring.datasource:
address: 127.0.0.1:3306
database: canal_manager
username: xxxx
assword: xxxxx
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false
hikari:
maximum-pool-size: 30
minimum-idle: 1 canal:
adminUser: admin
adminPasswd: admin
这里需要注意,canal的adminPasswd并不是登陆admin的密码,登陆admin的密码是设置在对应的数据库中的,默认为123456。
另外,因为 Canal Admin 是一个管理系统,需要使用数据库存放配置信息,只用在 MySQL 中执行 Canal Admin 提供的数据库初始化文件即可,该文件在“conf/canal_manager.sql”路径下面。
2)登陆浏览器访问
上面的 Canal Admin 配置好了之后直接根据“/bin/startup.sh”启动 Canal Admin 即可,在浏览器上面输入 hostip:8089 即可进入到管理页面,如果使用的默认的配置信息,用户名入”admin”,密码输入”123456”即可访问首页。
进入到首页点击集群的菜单栏,然后选择新建集群。
在里面输入集群的名称以及 Zookeeper即可,这里的集群目前还没有任务节点,后续通过配置 Canal Server 的自动注册功能,便可以查看该集群下面拥有的节点。
创建集群后,需要先配置集群 主配置,载入模板即可。
如果没有载入这个模版,那么在canal-server执行 sh bin/startup.sh local 命令,读取canal_local.propeties配置启动时,会报错
Caused by: com.alibaba.otter.canal.common.CanalException: requestGet for canal config error: canal.properties config is empty
注意,在主配置中,还是需要记得加入zk的地址配置,跟上面配置集群名字的时候输入的zk无关 (那个zk地址不知道有啥用):
canal.zkServers = xxx.xx.xx.xx:2181,xxx.xx.xx.xx:2181,xxx.xx.xx.xx:2181
如果希望使用canal的集群模式(推荐使用),记得更改配置使用default-instance.xml,不要使用file-instance.xml配置,如下:
#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
2. 部署canal-server
注意,建议先部署好admin,再来部署canal-server,省事不少。
官方文档地址:
https://github.com/alibaba/canal/wiki/QuickStart
注意,不同于单机版的properties配置,使用admin后,各种配置通过admin全局管理,所以只需要配置canal_local.properties即可。canal_local.properties内容如下:
# register ip
canal.register.ip = # canal admin config
canal.admin.manager = 127.0.0.1:8089
canal.admin.port = 11110
canal.admin.user = admin
canal.admin.passwd = xxxxxxxxxxxxxx # admin auto register
canal.admin.register.auto = true
canal.admin.register.cluster =
对各个参数说明一下:
- canal.register.ip:用来指定当前 Canal Server 的 IP 信息,如果主机是多网卡,可以避免 IP 信息错乱的问题。
- canal.admin.passwd:这里的密码就是之前配置 Canal Admin 里面配置的adminPasswd,只不过这里并不是明文展示,使用 MySQL 的”select password("admin")”语句查询处理过的密码,注意查询结果前面的”*”要去掉。
- canal.admin.register.auto:这里是自动注册的意思,如果没有配置,Canal Server 启动后需要自行在 Canal Admin 上面添加。
- canal.admin.register.cluster:这个配置如果不写代表当前的 Canal Server 是一个单机节点,如果添加的名字在 Canal Admin 上面没有提前注册,Canal Server 启动时会报错。
启动server,切记切记带上参数local,这样才会读取canal_local.properties的配置
sh bin/startup.sh local
启动完成后,可以在admin界面看到server的连接信息
同时,登陆zk,查看是否已经注册成功。
3. 配置canal-server
采用admin的集群模式后,集群内的canal-server通过zk做HA,因此,canal-server的配置也只能通过集群做全局配置。
就是前面的集群配置-主配置进入。
另外,canal作为一个增量数据抓取模块,抓到变更信息后需要投递。
通过canal.sererMode配置
这里也限制了,一个集群内的canal只能支持一种投递模式。
我们目前暂时以投递RocketMQ为例进行配置。
官方文档地址:
https://github.com/alibaba/canal/wiki/Canal-Kafka-RocketMQ-QuickStart
最终配置文件的配置如下:
#################################################
######### common argument #############
################################################# # tcp bind ip
canal.ip = # register ip to zookeeper
canal.register.ip =
canal.port = 11111
canal.metrics.pull.port = 11112 # canal instance user/passwd
canal.user = xxxx
canal.passwd = xxxxxxxxxxxxxxxxxxx # canal admin config
canal.admin.manager = 127.0.0.1:8089
canal.admin.port = 11110
canal.admin.user = xxxx
canal.admin.passwd = xxxxxxxxxxxxxx
canal.zkServers = xx.xx.xx.xx:xxxx,xx.xx.xx.xxx:xxxx,xx.xx.xx.xx:xxxx # flush data to zk
canal.zookeeper.flush.period = 1000
canal.withoutNetty = false # tcp, kafka, RocketMQ
canal.serverMode = RocketMQ # 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 = # 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 = manager
canal.instance.global.lazy = false
canal.instance.global.manager.address = ${canal.admin.manager} #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 ##################################################
######### MQ #############
##################################################
canal.mq.servers = xx.xx.xx.xx:xxxx,xx.xx.xx.xxx:xxxx,xx.xx.xx.xx:xxxx
canal.mq.retries = 0
canal.mq.canalBatchSize = 50
canal.mq.canalGetTimeout = 100
canal.mq.flatMessage = true
canal.mq.compressionType = none
canal.mq.acks = all #canal.mq.properties. =
canal.mq.producerGroup = test_canal_cluster # Set this value to "cloud", if you want open message trace feature in aliyun.
canal.mq.accessChannel = local # aliyun mq namespace #canal.mq.namespace = ##################################################
######### Kafka Kerberos Info #############
##################################################
canal.mq.kafka.kerberos.enable = false
canal.mq.kafka.kerberos.krb5FilePath = "../conf/kerberos/krb5.conf"
canal.mq.kafka.kerberos.jaasFilePath = "../conf/kerberos/jaas.conf"
4. 配置canal instance(以投递MQ为例)
Canal Admin 提供了 Canal Instance 的管理功能。
我们尝试通过 UI 界面添加需要监听的数据库,让该 Instance 消费 binlog 并将事件发送到 MQ。
- 点击“新建 Instance”按钮创建 Instance
- 点击“载入模板”,进行配置修改。
主要修改以下配置:
- ”canal.instance.mysql.slaveId”:目前1.1.4版本已经不需要配置,系统自动生成
- ”canal.instance.master.address”:配置你的数据库地址
- canal.instance.dbUsername:数据库用户名
- canal.instance.dbPassword:数据库密码
- canal.mq.topic:mq的topic
- canal.instance.filter.regex=订阅的库表名单(例如:dbvtest\\..*),具体参考https://github.com/alibaba/canal/wiki/AdminGuide
保存,启动,观察日志,没有报错即可。
同时可以从 canal-server的 操作-详情 进入,查看可以看到正在运行的instance
这里需要注意,如果没有正确注册到zk,那么每个canal-server都会有一个正在运行的instance,会导致变更投递多次。
如果正确注册了zk,同一个集群下,每个instance应该只在某一个cannal-server中运行。
可以查看zk路径
/otter/canal/destinations/{xxxx}/running
xxxx就是instance的 名称,running节点表示它运行在哪个server上。
另外,目前对binlog的订阅支持gtid模式和position模式,通过以下参数设置
# enable gtid use true/false
canal.instance.gtidon=false
在demo过程中,发现高可用模式下,gtid无法正常更新到zk,而position模式使用正常。
gtid模式在canal高可用模式下可能存在bug(参考issue:
https://github.com/alibaba/canal/issues/2616),暂时不建议使用。
5. 演练订阅
在rds执行以下sql
UPDATE `album` SET `attribute`='5' WHERE `albumid`='1';
在MQ中的消息格式如下:
{ "data":[ {
"albumid":"1",
"picid":"1234",
"attribute":"5",
"lastmodified":"2020-05-15 18:13:35",
"created":"2019-09-04 18:18:51"
}
],
"database":"dbvtest",
"es":1589537615000,
"id":75,
"isDdl":false,
"mysqlType":{
"albumid":"int(10) unsigned",
"picid":"int(10) unsigned",
"attribute":"varchar(200)",
"lastmodified":"timestamp",
"created":"timestamp"
},
"old":[
{
"attribute":"2",
"lastmodified":"2020-05-15 17:42:57"
}
],
"pkNames":[
"albumid"
],
"sql":"",
"sqlType":{
"albumid":4,
"picid":4,
"attribute":12,
"lastmodified":93,
"created":93
},
"table":"album",
"ts":1589537615877,
"type":"UPDATE"
}
6. 监控告警
官方文档地址:
https://github.com/alibaba/canal/wiki/Prometheus-QuickStart
如果你已经有一套prometheus的监控体系,我们只需要导入模板(
canal/conf/metrics/Canal_instances_tmpl.json)即可,完美~
都看到最后了,原创不易,点个关注,点个赞吧~
知识碎片重新梳理,构建Java知识图谱:github.com/saigu/JavaK…(历史文章查阅非常方便)
「从零单排canal 02」canal集群版 + admin控制台 最新搭建姿势(基于1.1.4版本)的更多相关文章
- 「从零单排HBase 10」HBase集群多租户实践
在HBase1.1.0发布之前,HBase同一集群上的用户.表都是平等的,大家平等共用集群资源.容易碰到两个问题: 一是某些业务较其他业务重要,需要在资源有限的情况下优先保证核心重要业务的正常运行 二 ...
- 「从零单排HBase 12」HBase二级索引Phoenix使用与最佳实践
Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs对HBase数据进行增删改查,构建二级索引.当然,开源产品嘛,自然需要注意“避坑”啦,阿丸会把使用方式和最佳实践都告 ...
- 「从零单排HBase 04」HBase高性能查询揭秘
先给结论吧:HBase利用compaction机制,通过大量的读延迟毛刺和一定的写阻塞,来换取整体上的读取延迟的平稳. 1.为什么要compaction 在上一篇 HBase读写 中我们提到了,HBa ...
- 「从零单排HBase 05」核心特性region split
HBase拥有出色的扩展性,其中最依赖的就是region的自动split机制. 1.split触发时机与策略 前面我们已经知道了,数据写入过程中,需要先写memstore,然后memstore满了以后 ...
- 「从零单排HBase 06」你必须知道的HBase最佳实践
前面,我们已经打下了很多关于HBase的理论基础,今天,我们主要聊聊在实际开发使用HBase中,需要关注的一些最佳实践经验. 1.Schema设计七大原则 1)每个region的大小应该控制在10G到 ...
- 「从零单排HBase 09」Hbase的那些数据结构和算法
在之前学习MySQL的时候,我们知道存储引擎常用的索引结构有B+树索引和哈希索引. 而对HBase的学习,也离不开索引结构的学习,它使用了一种LSM树((Log-Structured Merge-Tr ...
- 「从零单排canal 04」 启动模块deployer源码解析
基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...
- 「从零单排canal 05」 server模块源码解析
基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...
- 「从零单排canal 01」 canal 10分钟入门(基于1.1.4版本)
1.简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据 订阅 和 消费.应该是阿里云DTS(Data Transfer Servi ...
随机推荐
- Python格式化字符串(格式化输出)
熟悉C语言 printf() 函数的读者能够轻而易举学会 Python print() 函数,它们是非常类似的. print() 函数使用以%开头的转换说明符对各种类型的数据进行格式化输出,具体请看下 ...
- 案例(一) 利用机器算法RFM模型做用户价值分析
一.案例背景 在产品迭代过程中,通常需要根据用户的属性进行归类,也就是通过分析数据,对用户进行归类,以便于在推送及转化过程中获得更大的收益. 本案例是基于某互联网公司的实际用户购票数据为研究对象, ...
- mysql运维入门5:MySQL+kepalived高可用架构
keepalive 类似3/4/7层交换机制的软件,也就是平时说的第三层.第四层.第七层交换 作用是检测web服务器的状态,如果有一台web服务器.mysql服务器宕机.或工作出现故障,keepali ...
- PAT-1057 Stack (树状数组 + 二分查找)
1057. Stack Stack is one of the most fundamental data structures, which is based on the principle of ...
- RAC配置2个私网网卡使用HAIP服务
如果是在oracle 10gRAC, 私网网卡冗余保护只能使用操作系统网卡绑定方式,但是到了oracle 11g,如果担心一个私网网卡故障导致rac节点驱逐,可以使用2个私网网卡,Oracle将自动使 ...
- js学习零碎只是汇总
虽然JS是弱类型语言,但也有变量声明,作用域(局部和全局). 1.基础输出语句: alert();以弹框的方式将括号内的信息输出到页面上,有一个确定按钮. console.log();常 ...
- ArrayList简介
ArrayList简介 ArrayList以数组为底层数据结构的集合,是一个动态的数组队列,就是说该类的容量可以增长,与一般的数组不同. public class ArrayList<E> ...
- Event Loop、 宏任务和微任务
本文将介绍我自己对JS Event Loop 和 宏任务.微任务的理解. 二话不说先上图: 接下来将会针对此图讲解什么是Event Loop 什么事宏任务和微任务(其实聪明的你们通过图大体也能了解的是 ...
- python的生成器和迭代器
三.推倒式从时间上比较:集合 字典 元祖 列表 (从小到大)占用内存比较:字典 集合 列表 元祖 (从大到小) 字典是可进行hash操作,操作的是字典的key ,而对list进行hash操作的时候操作 ...
- 【C++】常见易犯错误之数值类型取值溢出与截断(2)
本节内容紧接上节,解决红色字体遗留问题.本节所有例子运行环境: win10 + VS2015 + X64 + debug 在上节例子中,查看变量 c .d .d+1 的类型. //// Console ...