目录
修改conf/example/instance.properties
Canal原理:
canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
mysql master收到dump请求,开始推送binary log给slave(也就是canal)
canal解析binary log对象(原始为byte流)就可以拿到数据库的操作日志,用于实时业务日志数据同步到数仓。(大批量历史数据可以使用sqoop批量导出)
安装包下载:
Giyhub地址:https://github.com/alibaba/canal/releases
如果gihub下载太慢可以使用百度网盘下载(1.1.3版本)
链接:https://pan.baidu.com/s/14iaJ2fuij-rBhxvyrNqXtQ
提取码:8iin
解压:
[dw@hadoop02 soft]$mkdir canal
[dw@hadoop02 soft]$tar -zxvf canal.deployer-1.1.3.tar.gz -C /home/dw/soft/canal
mysql权限开启:
进入mysql查询如下语句show variables like '%log_bin%'
mysql> show variables like '%log_bin%'
-> ;
+---------------------------------+-----------------------------------------+
| Variable_name | Value |
+---------------------------------+-----------------------------------------+
| log_bin | ON |
| log_bin_basename | /home/data/mysql_binlog/mysql-bin |
| log_bin_index | /home/data/mysql_binlog/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+-----------------------------------------+
6 rows in set (0.00 sec)
显示bin_log的值为ON则表示开启,OFF则为关闭
如果显示为off,配置my.cnf(linux)文件增加以下配置
log-bin=mysql-bin #添加这一行就ok
binlog-format=ROW #选择row模式
server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId相同
修改配置文件canal.properties
修改conf/example/instance.properties
修改为你要监听的数据库账号密码
拷贝canal到另一台机器作为从节点
scp /soft/canal.deployer-1.1.3.tar.gz dw@ip:/soft
tar -zxvf canal.deployer-1.0.23.tar.gz -C /root/canal
修改slave配置文件
vi /root/canal/conf/example/instance.properties
## mysql serverId修改与master不同即可
canal.instance.mysql.slaveId = 1235
# position info修改成mysql地址即可
canal.instance.master.address = ip:3306
vi /root/canal/conf/canal.properties
# 用逗号隔开且不留空格
canal.zkServers=10.0.1.62:2181,10.0.1.64:2181,10.0.1.66:2181
canal.instance.global.spring.xml = classpath:spring/default-instance.xml
两台机器分别启动canal
zookeeper与canal的结构
/otter/canal:canal的根目录
/otter/canal/cluster:整个canal server的集群列表
/otter/canal/destinations:destination的根目录
/otter/canal/destinations/example/running:服务端当前正在提供服务的running节点
/otter/canal/destinations/example/cluster:针对某个destination的工作集群列表
/otter/canal/destinations/example/1001/running:客户端当前正在读取的running节点
/otter/canal/destinations/example/1001/cluster:针对某个destination的客户端列表
/otter/canal/destinations/example/1001/cursor:客户端读取的position信息
插入代码进行测试
public class TestCanal {
public static void main(String[] args) throws InterruptedException {
// 链接canal
CanalConnector connector = CanalConnectors.newClusterConnector("10.0.1.62,10.0.1.64,10.0.1.66",
"example", "", "");
connector.connect();
// 开启订阅日志
connector.subscribe();
// 循环订阅
while (true) {
try {
// 每次读取 1000 条
Message message = connector.getWithoutAck(1000);
System.out.println(message);
long batchID = message.getId();
int size = message.getEntries().size();
if (batchID == -1 || size == 0) {
Thread.sleep(1000); // 没有数据
} else {
System.out.println("数据进入===>"+message);
}
connector.ack(batchID);
} catch (Exception e) {
// TODO: handle exception
} finally {
Thread.sleep(1000);
}
}
}
}
效果如下