简介

image.png

安装admin客户端

官方文档demo:https://github.com/alibaba/canal/wiki/Canal-Admin-QuickStart

  1. canal.admin-1.1.5 ls
  2. bin conf lib logs

修改配置

  1. vim conf/application.yml
  2. server:
  3. port: 8089
  4. spring:
  5. jackson:
  6. date-format: yyyy-MM-dd HH:mm:ss
  7. time-zone: GMT+8
  8. spring.datasource:
  9. address: 127.0.0.1:3306
  10. database: canal_manager
  11. username: root
  12. password: test_001
  13. driver-class-name: com.mysql.cj.jdbc.Driver
  14. url: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allow&PublicKeyRetrieval=true
  15. hikari:
  16. maximum-pool-size: 30
  17. minimum-idle: 1
  18. canal:
  19. adminUser: admin
  20. adminPasswd: 123456

注意:如果mysql使用的是 8.0.x 或者以上的版本需要将 driver-class-name 配置驱动更换为:com.mysql.cj.jdbc.Driver,然后将8.0以上版本的驱动 jar 包上传到 lib 目录下

mysql8 jar包下载, 注意解压把里面的包放到lib下
https://dev.mysql.com/downloads/file/?id=484819

  1. canal.admin-1.1.5 ls ./lib | grep mysql
  2. mysql-connector-java-5.1.48.jar
  3. mysql-connector-java-8.0.15.jar

初始化数据库

  1. mysql -uroot -p123456
  2. #导入sql
  3. source conf/canal_manager.sql

脚本执行成功后,可以看到我们数据库已经创建好canal_manager数据库了
image.png

  1. 初始化SQL脚本里会默认创建canal_manager的数据库,建议使用root等有超级权限的账号进行初始化
  2. canal_manager.sql默认会在conf目录下

启动

  1. sh bin/startup.sh

查看 admin 日志

  1. cat logs/admin.log

可以通过 http://127.0.0.1:8089/ 访问,默认密码:admin/123456
image.png
关闭

  1. sh bin/stop.sh

服务端

就是之前配置采集mysql的那个

因为这里使用 Canal Admin 部署集群,所以 Canal Server 节点只需要关注 manager 相关的信息即可,具体的任务信息后续都通过 Canal Admin 下发,这一点与单机部署区别很大。

修改配置文件

  1. vim conf/canal_local.properties
  2. # canal服务端的ip最好使用主机映射
  3. canal.register.ip = hadoop001
  4. # 这个是webUI的配置
  5. canal.admin.manager = 127.0.0.1:8089 #登录的ip
  6. canal.admin.port = 11110 #交互的端口
  7. canal.admin.user = admin #webUI的账号
  8. canal.admin.passwd = 6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 #webUI密码的暗文
  9. # admin auto register
  10. canal.admin.register.auto = true
  11. canal.admin.register.cluster = #集群的名字

上面配置的webUI的密码暗文需要到mysql的数据库查询的,我们配置的密码是123456,所以需要到数据库产生
image.png

  • canal.register.ip,这个配置用来指定当前 Canal Server 的 IP 信息,如果主机是多网卡,可以避免 IP 信息错乱的问题。
  • canal.admin.passwd,这里的密码就是之前配置 Canal Admin 里面配置的管理员密码,只不过这里并不是明文展示,使用 MySQL 的里面存的密码
  • canal.admin.register.auto,这里是自动注册的意思,如果没有配置,Canal Server 启动后需要自行在 Canal Admin 上面添加。
  • canal.admin.register.cluster这个配置如果不写代表当前的 Canal Server 是一个单机节点,如果添加的名字在 Canal Admin 上面没有提前注册,Canal Server 启动时会报错。

启动

  1. ./bin/startup.sh local

启动完成后,就能在 canal-admin 看到canal-server服务已经注册进来了, 有错误看日志
image.png
各配置说明参考文档:https://github.com/alibaba/canal/wiki/AdminGuide
可以选择载入模板
image.png

集群版搭建

提前准备好zk
官方文档: https://github.com/alibaba/canal/wiki/Canal-Admin-Guide
image.png
创建集群
image.png
集群创建完成后,点击操作 - 主配置 - 载入配置,配置zk注册地址点击保存
image.png
各配置说明参考文档:https://github.com/alibaba/canal/wiki/AdminGuide
image.png
配置项:
修改集群/删除集群,属于基本的集群信息维护和删除
主配置,主要是指集群对应的canal.properties配置,设计上一个集群的所有server会共享一份全局canal.properties配置
(如果有个性化的配置需求,可以创建多个集群) 查看server,主要是指查看挂载在这个集群下的所有server列表
[

](https://blog.csdn.net/u012946310/article/details/109382279)
Server 管理,新增集群server
新增两个server,选择刚刚新建的 springboot_canal_demo 集群
Server Ip分别是 192.168.2.196、192.168.2.169两台server主机服务
image.png
新增完成后,就能够在列表看到新增的两台服务,此时状态是断开状态,是因为我们还没启动canal服务
image.png
配置项:

所属集群,可以选择为单机 或者 集群。一般单机Server的模式主要用于一次性的任务或者测试任务
Server名称,唯一即可,方便自己记忆
Server Ip,机器ip
admin端口,canal 1.1.4版本新增的能力,会在canal-server上提供远程管理操作,默认值11110
tcp端口,canal提供netty数据订阅服务的端口
metric端口, promethues的exporter监控数据端口 (未来会对接监控)

配置启动 192.168.2.196、192.168.2.169 机器canal服务
进入 conf 目录下,编辑 canal_local.properties 配置文件

  1. vim conf/canal_local.properties

image.png

  1. # register ip,填写虚拟机ip,默认为空,建议填写,防止注册时读取网卡ip有误,导致ip注册错误
  2. canal.register.ip =192.168.2.196
  3. # canal admin config 管理端地址
  4. canal.admin.manager = 192.168.2.196:8089
  5. canal.admin.port = 11110
  6. canal.admin.user = admin
  7. canal.admin.passwd = 4ACFE3202A5FF5CF467898FC58AAB1D615029441
  8. # admin auto register
  9. canal.admin.register.auto = true
  10. canal.admin.register.cluster =

启动服务

  1. sh bin/startup.sh local

启动完成后就能够在列表看到,服务已经是启动状态
如果我们点击单个节点编辑配置,Admin 会提示我们集群模式下不允许修改单个节点的配置,需要在集群下面修改配置。
image.png
并且也已经将服务注册进zk了
image.png

问题

数据重复消费

上文提到数据重复消费,不断的切换server数据就不断地重新被消费,之所以被会这样就是zookeeper没有同步client的meta数据,两个服务器在zookeeper中保存的元数据不一样,所以在互相切换的时候,服务端不认为是一个客户端在消费(其实每个server有且只能有一个client)。问题的根源找到了,就是在配置高可用的时候,有配置问题。

原来是一个服务器,我直接将所有的文件拷贝过去,所有的配置都是一样的,后来拷贝的连接数据库连接不上,查看发现数据的配置canal.instance.master.address 是localhost拷贝过来的文件,后来将localhost改成了数据的真实的ip:...,改完之后高可用就可以用,在使用的过程中出现了数据重复。

排查找到了zookeeper元数据问题,核对发现get /otter/canal/destinations/example/1001/cursor ,一个服务端的元数据中”address”:”hadoop”,而另一个的address 是localhost,就是因为这两个切换,导致数据重复消费。

解决:
修改conf/example/instance.properties文件,将canal.instance.master.address的值都改成真实的ip,不要用主机映射的名字

例:canal.instance.master.address =192.168.123.45:3306

元数据配置问题

canal服务端
修改canal.properties,加上zookeeper配置,spring配置选择default-instance.xml

  1. canal.zkServers=hadoop:2181 ##zookeeper的ip和端口号
  2. canal.instance.global.spring.xml = classpath:spring/default-instance.xml ##开启这个(默认被注释了)

example目录,并修改instance.properties

  1. canal.instance.mysql.slaveId = 1234 ##另外一台机器改成1235,保证slaveId不重复即可
  2. canal.instance.master.address = hadoop:3306 ##数据库的ip和端口
  3. canal.instance.dbUsername=canal ##Mysql的用户名 (这个可以没有)
  4. canal.instance.dbPassword=Canal2019! ##Mysql的密码(这个可以没有)

zk的客户端查看

  1. 查看在活跃的服务端
  2. get /otter/canal/destinations/example/running
  3. {"active":true,"address":"*.*.*.*:11111","cid":1}
  4. 查看在活跃的客户端
  5. get /otter/canal/destinations/example/1001/running
  6. {"active":true,"address":"*.*.*.*:55285","clientId":1001}
  7. 查看zookeeper同步的元数据
  8. get /otter/canal/destinations/example/1001/cursor
  9. {"@type":"com.alibaba.otter.canal.protocol.position.LogPosition","identity":{"slaveId":-1,"sourceAddress":{"address":"hadoop","port":3306}},"postion":{"gtid":"","included":false,"journalName":"mysql-bin.000005","position":28477,"serverId":1,"timestamp":1558665144000}}
  10. 删除
  11. rmr /otter/canal/destinations/example