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文件

  1. server:
  2. port: 8089
  3.  
  4. spring:
  5. jackson:
  6. date-format: yyyy-MM-dd HH:mm:ss
  7. time-zone: GMT+8
  8.  
  9. spring.datasource:
  10. address: 127.0.0.1:3306
  11. database: canal_manager
  12. username: xxxx
  13. assword: xxxxx
  14. driver-class-name: com.mysql.jdbc.Driver
  15. url: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false
  16. hikari:
  17. maximum-pool-size: 30
  18. minimum-idle: 1
  19.  
  20. canal:
  21. adminUser: admin
  22. 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配置启动时,会报错

  1. Caused by: com.alibaba.otter.canal.common.CanalException: requestGet for canal config error: canal.properties config is empty

注意,在主配置中,还是需要记得加入zk的地址配置,跟上面配置集群名字的时候输入的zk无关 (那个zk地址不知道有啥用):

  1. canal.zkServers = xxx.xx.xx.xx:2181,xxx.xx.xx.xx:2181,xxx.xx.xx.xx:2181

如果希望使用canal的集群模式(推荐使用),记得更改配置使用default-instance.xml,不要使用file-instance.xml配置,如下:

  1. #canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
  2. #canal.instance.global.spring.xml = classpath:spring/file-instance.xml
  3. 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内容如下:

  1. # register ip
  2. canal.register.ip =
  3.  
  4. # canal admin config
  5. canal.admin.manager = 127.0.0.1:8089
  6. canal.admin.port = 11110
  7. canal.admin.user = admin
  8. canal.admin.passwd = xxxxxxxxxxxxxx
  9.  
  10. # admin auto register
  11. canal.admin.register.auto = true
  12. 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的配置

  1. sh bin/startup.sh local
  1. 启动完成后,可以在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

最终配置文件的配置如下:

  1. #################################################
  2. ######### common argument #############
  3. #################################################
  4.  
  5. # tcp bind ip
  6. canal.ip =
  7.  
  8. # register ip to zookeeper
  9. canal.register.ip =
  10. canal.port = 11111
  11. canal.metrics.pull.port = 11112
  12.  
  13. # canal instance user/passwd
  14. canal.user = xxxx
  15. canal.passwd = xxxxxxxxxxxxxxxxxxx
  16.  
  17. # canal admin config
  18. canal.admin.manager = 127.0.0.1:8089
  19. canal.admin.port = 11110
  20. canal.admin.user = xxxx
  21. canal.admin.passwd = xxxxxxxxxxxxxx
  22. canal.zkServers = xx.xx.xx.xx:xxxx,xx.xx.xx.xxx:xxxx,xx.xx.xx.xx:xxxx
  23.  
  24. # flush data to zk
  25. canal.zookeeper.flush.period = 1000
  26. canal.withoutNetty = false
  27.  
  28. # tcp, kafka, RocketMQ
  29. canal.serverMode = RocketMQ
  30.  
  31. # flush meta cursor/parse position to file
  32. canal.file.data.dir = ${canal.conf.dir}
  33. canal.file.flush.period = 1000
  34.  
  35. ## memory store RingBuffer size, should be Math.pow(2,n)
  36. canal.instance.memory.buffer.size = 16384
  37.  
  38. ## memory store RingBuffer used memory unit size , default 1kb
  39. canal.instance.memory.buffer.memunit = 1024
  40.  
  41. ## meory store gets mode used MEMSIZE or ITEMSIZE
  42. canal.instance.memory.batch.mode = MEMSIZE
  43. canal.instance.memory.rawEntry = true
  44.  
  45. ## detecing config
  46. canal.instance.detecting.enable = false
  47.  
  48. #canal.instance.detecting.sql = insert into retl.xdual values(1,now()) on duplicate key update x=now()
  49. canal.instance.detecting.sql = select 1
  50. canal.instance.detecting.interval.time = 3
  51. canal.instance.detecting.retry.threshold = 3
  52. canal.instance.detecting.heartbeatHaEnable = false
  53.  
  54. # support maximum transaction size, more than the size of the transaction will be cut into multiple transactions delivery
  55. canal.instance.transaction.size = 1024
  56.  
  57. # mysql fallback connected to new master should fallback times
  58. canal.instance.fallbackIntervalInSeconds = 60
  59.  
  60. # network config
  61. canal.instance.network.receiveBufferSize = 16384
  62. canal.instance.network.sendBufferSize = 16384
  63. canal.instance.network.soTimeout = 30
  64.  
  65. # binlog filter config
  66. # 这里可以对订阅的消息做过滤
  67. canal.instance.filter.druid.ddl = true
  68. canal.instance.filter.query.dcl = false
  69. canal.instance.filter.query.dml = false
  70. canal.instance.filter.query.ddl = false
  71. canal.instance.filter.table.error = false
  72. canal.instance.filter.rows = false
  73. canal.instance.filter.transaction.entry = false
  74.  
  75. # binlog format/image check
  76. canal.instance.binlog.format = ROW,STATEMENT,MIXED
  77. canal.instance.binlog.image = FULL,MINIMAL,NOBLOB
  78.  
  79. # binlog ddl isolation
  80. canal.instance.get.ddl.isolation = false
  81.  
  82. # parallel parser config
  83. canal.instance.parser.parallel = true
  84.  
  85. ## concurrent thread number, default 60% available processors, suggest not to exceed Runtime.getRuntime().availableProcessors()
  86. #canal.instance.parser.parallelThreadSize = 16
  87. ## disruptor ringbuffer size, must be power of 2
  88. canal.instance.parser.parallelBufferSize = 256
  89.  
  90. # table meta tsdb info
  91. canal.instance.tsdb.enable = true
  92. canal.instance.tsdb.dir = ${canal.file.data.dir:../conf}/${canal.instance.destination:}
  93. canal.instance.tsdb.url = jdbc:h2:${canal.instance.tsdb.dir}/h2;CACHE_SIZE=1000;MODE=MYSQL;
  94. canal.instance.tsdb.dbUsername = canal
  95. canal.instance.tsdb.dbPassword = canal
  96.  
  97. # dump snapshot interval, default 24 hour
  98. canal.instance.tsdb.snapshot.interval = 24
  99.  
  100. # purge snapshot expire , default 360 hour(15 days)
  101. canal.instance.tsdb.snapshot.expire = 360
  102.  
  103. # aliyun ak/sk , support rds/mq
  104. canal.aliyun.accessKey =
  105. canal.aliyun.secretKey =
  106.  
  107. #################################################
  108. ######### destinations #############
  109. #################################################
  110. canal.destinations =
  111.  
  112. # conf root dir
  113. canal.conf.dir = ../conf
  114.  
  115. # auto scan instance dir add/remove and start/stop instance
  116. canal.auto.scan = true
  117. canal.auto.scan.interval = 5
  118. canal.instance.tsdb.spring.xml = classpath:spring/tsdb/h2-tsdb.xml
  119.  
  120. #canal.instance.tsdb.spring.xml = classpath:spring/tsdb/mysql-tsdb.xml
  121. canal.instance.global.mode = manager
  122. canal.instance.global.lazy = false
  123. canal.instance.global.manager.address = ${canal.admin.manager}
  124.  
  125. #canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
  126.  
  127. #canal.instance.global.spring.xml = classpath:spring/file-instance.xml
  128. canal.instance.global.spring.xml = classpath:spring/default-instance.xml
  129.  
  130. ##################################################
  131. ######### MQ #############
  132. ##################################################
  133. canal.mq.servers = xx.xx.xx.xx:xxxx,xx.xx.xx.xxx:xxxx,xx.xx.xx.xx:xxxx
  134. canal.mq.retries = 0
  135. canal.mq.canalBatchSize = 50
  136. canal.mq.canalGetTimeout = 100
  137. canal.mq.flatMessage = true
  138. canal.mq.compressionType = none
  139. canal.mq.acks = all
  140.  
  141. #canal.mq.properties. =
  142. canal.mq.producerGroup = test_canal_cluster
  143.  
  144. # Set this value to "cloud", if you want open message trace feature in aliyun.
  145. canal.mq.accessChannel = local
  146.  
  147. # aliyun mq namespace
  148.  
  149. #canal.mq.namespace =
  150.  
  151. ##################################################
  152. ######### Kafka Kerberos Info #############
  153. ##################################################
  154. canal.mq.kafka.kerberos.enable = false
  155. canal.mq.kafka.kerberos.krb5FilePath = "../conf/kerberos/krb5.conf"
  156. 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路径

  1. /otter/canal/destinations/{xxxx}/running
  1. xxxx就是instance 名称,running节点表示它运行在哪个server上。

另外,目前对binlog的订阅支持gtid模式和position模式,通过以下参数设置

  1. # enable gtid use true/false
  2. 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中的消息格式如下:

  1. {
  2.  
  3. "data":[
  4.  
  5. {
  6. "albumid":"1",
  7. "picid":"1234",
  8. "attribute":"5",
  9. "lastmodified":"2020-05-15 18:13:35",
  10. "created":"2019-09-04 18:18:51"
  11. }
  12. ],
  13. "database":"dbvtest",
  14. "es":1589537615000,
  15. "id":75,
  16. "isDdl":false,
  17. "mysqlType":{
  18. "albumid":"int(10) unsigned",
  19. "picid":"int(10) unsigned",
  20. "attribute":"varchar(200)",
  21. "lastmodified":"timestamp",
  22. "created":"timestamp"
  23. },
  24. "old":[
  25. {
  26. "attribute":"2",
  27. "lastmodified":"2020-05-15 17:42:57"
  28. }
  29. ],
  30. "pkNames":[
  31. "albumid"
  32. ],
  33. "sql":"",
  34. "sqlType":{
  35. "albumid":4,
  36. "picid":4,
  37. "attribute":12,
  38. "lastmodified":93,
  39. "created":93
  40. },
  41. "table":"album",
  42. "ts":1589537615877,
  43. "type":"UPDATE"
  44. }

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版本)的更多相关文章

  1. 「从零单排HBase 10」HBase集群多租户实践

    在HBase1.1.0发布之前,HBase同一集群上的用户.表都是平等的,大家平等共用集群资源.容易碰到两个问题: 一是某些业务较其他业务重要,需要在资源有限的情况下优先保证核心重要业务的正常运行 二 ...

  2. 「从零单排HBase 12」HBase二级索引Phoenix使用与最佳实践

    Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs对HBase数据进行增删改查,构建二级索引.当然,开源产品嘛,自然需要注意“避坑”啦,阿丸会把使用方式和最佳实践都告 ...

  3. 「从零单排HBase 04」HBase高性能查询揭秘

    先给结论吧:HBase利用compaction机制,通过大量的读延迟毛刺和一定的写阻塞,来换取整体上的读取延迟的平稳. 1.为什么要compaction 在上一篇 HBase读写 中我们提到了,HBa ...

  4. 「从零单排HBase 05」核心特性region split

    HBase拥有出色的扩展性,其中最依赖的就是region的自动split机制. 1.split触发时机与策略 前面我们已经知道了,数据写入过程中,需要先写memstore,然后memstore满了以后 ...

  5. 「从零单排HBase 06」你必须知道的HBase最佳实践

    前面,我们已经打下了很多关于HBase的理论基础,今天,我们主要聊聊在实际开发使用HBase中,需要关注的一些最佳实践经验. 1.Schema设计七大原则 1)每个region的大小应该控制在10G到 ...

  6. 「从零单排HBase 09」Hbase的那些数据结构和算法

    在之前学习MySQL的时候,我们知道存储引擎常用的索引结构有B+树索引和哈希索引. 而对HBase的学习,也离不开索引结构的学习,它使用了一种LSM树((Log-Structured Merge-Tr ...

  7. 「从零单排canal 04」 启动模块deployer源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  8. 「从零单排canal 05」 server模块源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  9. 「从零单排canal 01」 canal 10分钟入门(基于1.1.4版本)

    1.简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据 订阅 和 消费.应该是阿里云DTS(Data Transfer Servi ...

随机推荐

  1. 树莓派ssh总掉线

    之前入手了一个树莓派,但是远程ssh连接经常掉线,开始以为是电源不行,导致机器重启,后面加了一个显示器,观察了一段时间,发现机器并没有重启,应该是WiFi掉线了,在网上发现,树莓派如果一段网络没有流量 ...

  2. webpack指南(一)HRM+Tree Shaking

    参考:https://www.cnblogs.com/PasserByOne/p/12084323.html https://blog.csdn.net/qq593249106/article/det ...

  3. 循序渐进VUE+Element 前端应用开发(1)--- 开发环境的准备工作

    之前一直采用VS进行各种前端后端的开发,随着项目的需要,正逐步融合纯前端的开发模式,开始主要选型为Vue + Element 进行BS前端的开发,后续会进一步整合Vue + AntDesign的界面套 ...

  4. IIS 报 :HTTP Error 503. The service is unavailable.

    打开IIS 找到你对应的网站名称然后你会发现应用池停止了 点击你对应的网站右键点击启动既可

  5. JAVA局部变量和成员变量的区别

    成员变量与局部变量的区别 1.在类中的位置不同 成员变量:在类中方法外面 局部变量:在方法或者代码块中,或者方法的声明上(即在参数列表中) 2.在内存中的位置不同 成员变量:在堆中(方法区中的静态区) ...

  6. Spark SQL源码解析(五)SparkPlan准备和执行阶段

    Spark SQL原理解析前言: Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述 Spark SQL源码解析(二)Antlr4解析Sql并生成树 Spark SQL源码解析(三 ...

  7. Android_存储之文件存储

    前面几篇随笔 讲到的关于存储的,SharedPreferences.Room.数据库等 最终都是以文件形式 存储到手机上的(除特殊的存储于手机内存的:如Room可以创建内存数据库). 这些存储方式,A ...

  8. android小Demo--七彩霓虹灯效果

    七彩霓虹灯效果,基于网上的小Demo进行修改. 在android项目values文件夹下创建文件colors.xml,配置七种颜色: <?xml version="1.0" ...

  9. 【图机器学习】cs224w Lecture 13 & 14 - 影响力最大化 & 爆发检测

    目录 Influence Maximization Propagation Models Linear Threshold Model Independent Cascade Model Greedy ...

  10. No grammar constraints (DTD or XML Schema) referenced in the document.的两种解决办法

    方法一:常用方法 关闭XML验证 工具栏:windows => preferences => xml => xml files => validation => Indi ...