简介
安装admin客户端
官方文档demo:https://github.com/alibaba/canal/wiki/Canal-Admin-QuickStart
➜ canal.admin-1.1.5 ls
bin conf lib logs
修改配置
vim conf/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: root
password: test_001
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allow&PublicKeyRetrieval=true
hikari:
maximum-pool-size: 30
minimum-idle: 1
canal:
adminUser: admin
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
➜ canal.admin-1.1.5 ls ./lib | grep mysql
mysql-connector-java-5.1.48.jar
mysql-connector-java-8.0.15.jar
初始化数据库
mysql -uroot -p123456
#导入sql
source conf/canal_manager.sql
脚本执行成功后,可以看到我们数据库已经创建好canal_manager数据库了
- 初始化SQL脚本里会默认创建canal_manager的数据库,建议使用root等有超级权限的账号进行初始化
- canal_manager.sql默认会在conf目录下
启动
sh bin/startup.sh
查看 admin 日志
cat logs/admin.log
可以通过 http://127.0.0.1:8089/ 访问,默认密码:admin/123456
关闭
sh bin/stop.sh
服务端
就是之前配置采集mysql的那个
因为这里使用 Canal Admin 部署集群,所以 Canal Server 节点只需要关注 manager 相关的信息即可,具体的任务信息后续都通过 Canal Admin 下发,这一点与单机部署区别很大。
修改配置文件
vim conf/canal_local.properties
# canal服务端的ip最好使用主机映射
canal.register.ip = hadoop001
# 这个是webUI的配置
canal.admin.manager = 127.0.0.1:8089 #登录的ip
canal.admin.port = 11110 #交互的端口
canal.admin.user = admin #webUI的账号
canal.admin.passwd = 6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 #webUI密码的暗文
# admin auto register
canal.admin.register.auto = true
canal.admin.register.cluster = #集群的名字
上面配置的webUI的密码暗文需要到mysql的数据库查询的,我们配置的密码是123456,所以需要到数据库产生
- 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 启动时会报错。
启动
./bin/startup.sh local
启动完成后,就能在 canal-admin 看到canal-server服务已经注册进来了, 有错误看日志
各配置说明参考文档:https://github.com/alibaba/canal/wiki/AdminGuide
可以选择载入模板
集群版搭建
提前准备好zk
官方文档: https://github.com/alibaba/canal/wiki/Canal-Admin-Guide
创建集群
集群创建完成后,点击操作 - 主配置 - 载入配置,配置zk注册地址点击保存
各配置说明参考文档:https://github.com/alibaba/canal/wiki/AdminGuide
配置项:
修改集群/删除集群,属于基本的集群信息维护和删除
主配置,主要是指集群对应的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主机服务
新增完成后,就能够在列表看到新增的两台服务,此时状态是断开状态,是因为我们还没启动canal服务
配置项:
所属集群,可以选择为单机 或者 集群。一般单机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 配置文件
vim conf/canal_local.properties
# register ip,填写虚拟机ip,默认为空,建议填写,防止注册时读取网卡ip有误,导致ip注册错误
canal.register.ip =192.168.2.196
# canal admin config 管理端地址
canal.admin.manager = 192.168.2.196:8089
canal.admin.port = 11110
canal.admin.user = admin
canal.admin.passwd = 4ACFE3202A5FF5CF467898FC58AAB1D615029441
# admin auto register
canal.admin.register.auto = true
canal.admin.register.cluster =
启动服务
sh bin/startup.sh local
启动完成后就能够在列表看到,服务已经是启动状态
如果我们点击单个节点编辑配置,Admin 会提示我们集群模式下不允许修改单个节点的配置,需要在集群下面修改配置。
并且也已经将服务注册进zk了
问题
数据重复消费
上文提到数据重复消费,不断的切换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
canal.zkServers=hadoop:2181 ##zookeeper的ip和端口号
canal.instance.global.spring.xml = classpath:spring/default-instance.xml ##开启这个(默认被注释了)
example目录,并修改instance.properties
canal.instance.mysql.slaveId = 1234 ##另外一台机器改成1235,保证slaveId不重复即可
canal.instance.master.address = hadoop:3306 ##数据库的ip和端口
canal.instance.dbUsername=canal ##Mysql的用户名 (这个可以没有)
canal.instance.dbPassword=Canal2019! ##Mysql的密码(这个可以没有)
zk的客户端查看
查看在活跃的服务端
get /otter/canal/destinations/example/running
{"active":true,"address":"*.*.*.*:11111","cid":1}
查看在活跃的客户端
get /otter/canal/destinations/example/1001/running
{"active":true,"address":"*.*.*.*:55285","clientId":1001}
查看zookeeper同步的元数据
get /otter/canal/destinations/example/1001/cursor
{"@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}}
删除
rmr /otter/canal/destinations/example