材料:canal 服务器部署包 canal.deployer-1.0.24.tar.gz
(https://pan.baidu.com/s/1uujF_kvSYArTaJRAGS3PVQ)
配置: conf 目录下的 canal.properties
懒人使用法(配置能用就可以,好吧,一点也不专业。):
区别就是cursor文件有没有在ZK上面记录。
后面三个是指定日志解析的节点,不填的话 第一次启动默认就是在当前时间节点开始解析binarylog日志。(后续启动都会读取cursor继续解析binarylog)
(cursor里面就是这个: {"@type":“com.alibaba.otter.canal.protocol.position.LogPosition”,“identity”:{“slaveId”:-1,“sourceAddress”:{“address”:“127.0.0.1”,“port”:3306}},“postion”:{“included”:false,“journalName”:“mysql-bin.000006”,“position”:166609270,“serverId”:1,“timestamp”:1525661348000}})
#################################################
## mysql serverId
canal.instance.mysql.slaveId = 1234
# position info
canal.instance.master.address =
canal.instance.master.journal.name =
canal.instance.master.position =
canal.instance.master.timestamp =
# username/password
canal.instance.dbUsername =
canal.instance.dbPassword =
canal.instance.defaultDatabaseName =
canal.instance.connectionCharset = UTF-8
# table regex
canal.instance.filter.regex = .\…
# table black regex
canal.instance.filter.black.regex =
#################################################
注意点:一个server 就一个client连接的上去。(不肯定,我这边是这样。)
依赖
com.alibaba.otter
canal.client
1.0.24
org.springframework
spring
连接
//zkServers节点名字,instanceName 上面配置的目录名字 后面两个是用户名密码 不用配置
CanalConnector canalConnector = CanalConnectors.newClusterConnector(zkServers, instanceName, null, null);
//连接
canalConnector.connect();
//订阅
canalConnector.subscribe();
//连接可用就一直请求数据
while(canalConnector.checkValid()){
// 未确认的获取数据 超时,数据量随便设置
try {
Message msg = canalConnector.getWithoutAck(messageBatchSize, messageTimeout, TimeUnit.MILLISECONDS);
if (msg == null || msg.getEntries().isEmpty()) {
try {
Thread.sleep(50L);
} catch (InterruptedException e) {
log.error("Thread error {}", e);
}
return;
}
batchId = msg.getId();
if (batchId <= 0) {
return;
}
//todo msg就是实际的事件 msg怎么解析请参考附件。msg 是 entry的集合 (一个entry就是一个ddl 或者dml (没有查询)), entry 有header 跟rowchange。 细节有点多,写不清楚,所以还是看代码来的实际一点。
//解析完成的确认(这样就会推到下一个节点继续解析)
canalConnector.ack(batchId);
} catch (Exception e) {
if (batchId > 0) {
try {
canalConnector.rollback(batchId);
} catch (Exception ex) {
log.error("##Canal rollback error!");
throw new Exception("##Canal rollback error!");
}
}
log.error("##Canal consumer error.");
}
}
canalConnector.unsubscribe();
canalConnector.disConnect();