canal如果不实现HA,也可以运行,此时不需要zookeeper。如果canal 需要实现HA,需要依赖zookeeper,核心配置如:canal.zkServers = master:2181,slave1:2181,slave2:2181
Canal Server+Canal Client HA
Canal server 和 client 端的高可用方案依赖 zookeeper, 启动 canal server 和 client 的时候
都会 zookeeper 读取信息. Canal 在 zookeeper 存储的数据结构如下
:/otter
└── canal
└── destinations
└── example # canal 实例名称
├── 1001 # canal client 信息
│ ├── cursor # 当前消费的 mysql binlog 位点
│ ├── filter # binlog 过滤条件
│ └── running # 当前正在运行的 canal client 服务器
├── cluster # canal server 列表
│ └── 10.93.61.86:11111
└── running # 当前正在运行的 canal server 服务器
Canal server 和 client 启动的时候都会去抢占 zk 对应的 running 节点, 保证只有一个
server 和 client 在运行, 而 server 和 client 的高可用切换也是基于监听 running 节点进行的.
1.机器准备
3 个节点 Zookeeper 集群:master,slave1,slave2
2 个节点 Canal 服务端节点:master,slave1
Mysql 节点:slave2
2.下载 canal
下载地址:https://github.com/alibaba/canal/releases/tag/canal-1.1.2
3.解压缩
mkdir /home/hadoop/app/canal-ha
tar zxvf canal.deployer-1.1.2.tar.gz -C /home/hadoop/app/canal-ha
解压完成后,进入 /home/hadoop/app/canal 目录,可以看到如下结构
4.修改配置文件
1)cd conf ,修改 canal.properties
#zk 集群地址
canal.zkServers = master:2181,slave1:2181,slave2:2181
#全局的 spring 配置方式的组件文件
canal.instance.global.spring.xml = classpath:spring/default-instance.xml
图解:把上面注释掉
备注:
default-instance.xml 介绍:store 选择了内存模式,其余的 parser/sink 依赖的位点管理选择了持久化模式,目前持久化的方式主要是写入 zookeeper,保证数据集群共享.
特点:支持 HA
场景:生产环境,集群化部署.
2)修改 instance.properties
#canal 伪装的 mysql slave 的编号,不能与 mysql 数据库与其他的 slave 重复
canal.instance.mysql.slaveId=1234(两台 canal 不能一样)
要监听的数据库的地址和端口号
canal.instance.master.address=slave1:3306
username/password
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
5.另外一台 canal server 配置
配置同上。
注意:
两台机器上的instance目录的名字需要保证完全一致,HA模式是依赖于instance name
进行管理,同时必须都选择 default-instance.xml 配置.
6.启动相关服务
1)启动 Zookeeper 服务
runRemoteCmd.sh “/home/hadoop/app/zookeeper/bin/zkServer.sh start” all
2)启动 Canal 服务(两个 canal 同时启动)
两个节点分别执行如下命令启动 canal 服务:
bin/startup.sh
启动后,你可以查看 logs/example/example.log,只会看到一台机器上出现了启动成功的日志。
查看一下 zookeeper 中的节点信息,也可以知道当前工作的节点。
3)客户端链接消费数据
可以直接指定 zookeeper 地址和 instance name,canal client 会自动从 zookeeper 中的 running
节点,获取当前服务的工作节点,然后与其建立链接:连接成功后,canal server 会记录当前正在工作的 canal client 信息,比如客户端 ip,链接的
端口信息等.
数据消费成功后,canal server 会在 zookeeper 中记录下当前最后一次消费成功的 binlog 位点.
(下次你重启 client 时,会从这最后一个位点继续进行消费)
图解:修改数据库,运行程序测试下
这里有个报错:找不到positon,之前做过测试,zookeeper将上面的删掉,重新启动就好了
4)canal HA 测试
重启 master 节点 canal 服务
bin/stop.sh
图解:停止canal后,看到程序先显示 canal not run ,再显示 连接上了
此时 slave1 节点会立马启动 example instance,提供新的数据服务,Zookeeper 可以看到 slave1信息。
与此同时,客户端也会随着 canal server 的切换,通过获取 zookeeper 中的最新地址,与新
的 canal server 建立链接,继续消费数据,整个过程自动完成。