canal简单介绍

简介

https://github.com/alibaba/canal

基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费

原理是使用程序模拟一个mysql的从库,使主库发送同步日志给程序,程序再对数据进行处理,比如同步到其他数据库。

使用

下图是一个典型的将mysql增量数据同步到es的流程

这里要注意的是,canal client不是连接数据库,而是必须连接到canal server上的

canal server: canal 服务端,内部可包含多个canal instance

canal instance: 运行在canal server中, 可被canal client连接

canal client: 集成在业务代码中,可连接canal instacne读取bin-log事件,并进行相应处理

安装canal 服务端

直接使用docker来安装
https://github.com/alibaba/canal/wiki/Docker-QuickStart

下载官方镜像及run.sh文档

shell 复制代码
docker pull canal/canal-server:latest
wget https://raw.githubusercontent.com/alibaba/canal/master/docker/run.sh

可以根据需要修改一下run.sh时面的一些端口和内存配置,然后编写自己的start.sh脚本

shell 复制代码
#!/bin/sh
run.sh -e canal.auto.scan=false \
      -e canal.instance.mysql.slaveId=10001 \
      -e canal.zkServers=192.168.1.10:1100 \
        -e canal.instance.global.spring.xml=classpath:spring/default-instance.xml \
                  -e canal.destinations=test \
                  -e canal.instance.master.address=127.0.0.1:3306  \
                  -e canal.instance.dbUsername=canal  \
                  -e canal.instance.dbPassword=canal  \
                  -e canal.instance.connectionCharset=UTF-8 \
                  -e canal.instance.tsdb.enable=true \
                  -e canal.instance.gtidon=false  \
                  -e canal.instance.filter.regex=.*\\..*

canal服务端配置说明:
https://github.com/alibaba/canal/wiki/AdminGuide

canal.destinations:实例列表

canal.instance.master.address: 源数据库地址

canal.instance.dbUsername:源数据库用户名

canal.instance.dbPassword: 源数据库密码

canal.instance.connectionCharset: 数据库连接字符集

canal.instance.filter.regex:需要处理的表(Perl正则表达式),多个规则使用','分隔

线上是使用阿云数据库,阿里云binlog是默认开启的,本地保留时间为18小时,一般来说够用了,不够的话就要去配置保存到oss了。https://github.com/alibaba/canal/wiki/aliyun-RDS-QuickStart

集成客户端

导入库

shell 复制代码
    compile('com.alibaba.otter:canal.client:1.1.6') {
        exclude group: 'org.slf4j'
        exclude group: 'ch.qos.logback'
    }
    compile('com.alibaba.otter:canal.protocol:1.1.6') {
        exclude group: 'org.slf4j'
        exclude group: 'ch.qos.logback'
    }

代码示例

java 复制代码
//创建连接
CanalConnector connector = CanalConnectors.newClusterConnector("192.168.1.10:1100", "test", "", "");
//连接服务端
connector.connect();
connector.subscribe();
//循环获取事件
while (running) {
    Message message = connector.getWithoutAck(batchSize); // 获取指定数量的数据
    long batchId = message.getId();
    int size = message.getEntries().size();
    if (batchId == -1 || size == 0) {
	//无数据时睡眠一会
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
        }
    } else {
	//开始处理数据
        for (CanalEntry.Entry entry : message.getEntries()) {
            switch (entry.getEntryType()) {
                case TRANSACTIONBEGIN:
                    processTransactionBegin(entry);
                    break;
                case ROWDATA:
                    processRawDataEntry(entry);
                    break;
                case TRANSACTIONEND:
                    processTransactionEnd(entry);
                    break;
            }
        }
    }

    if (batchId != -1) {
        connector.ack(batchId); // 提交确认
    }
}

值得注意的是,canal事件包含事务开始,数据,事务结束等,一般来说一个事务会在一个message中返回,但也有可能在多个message中,这个和batchSize、服务端缓冲区大小有关系。

一个message中只会包含一个事务。

在没有提交事务之前,binlog不会同步给从服务器,所以canal收到的事件都是提交之后的。

相关推荐
南墙上的石头16 小时前
麒麟 V10 重装人大金仓 V8R6 踩坑实录(含 MySQL 兼容模式)
数据库·mysql
无心水18 小时前
【全域智能营销实战】2、Spring AI 模块化架构深度解读:从 1.0 到 2.0 的演进与最佳实践
人工智能·spring·架构·harness·顶尖架构师·全域智能营销·harmess
执子手 吹散苍茫茫烟波18 小时前
RC 隔离级别下 MySQL InnoDB 死锁典型案例
数据库·mysql
峥无21 小时前
深入理解MySQL事务与MVCC机制
数据库·mysql
livemetee1 天前
【关于Spring声明式事务】
java·后端·spring
要开心吖ZSH1 天前
MVCC 进阶:快照读 vs 当前读、幻读与 Next-Key Lock
java·数据库·sql·mysql·mvcc
Esaka_Forever1 天前
Python 完整内存管理机制详解
开发语言·python·spring
万亿少女的梦1681 天前
基于Spring Boot的天空影院电影网站系统设计与实现
java·spring boot·mysql·vue·系统设计
万亿少女的梦1681 天前
基于Spring Boot的社区管理系统设计与实现
java·spring boot·mysql·vue·系统设计
殳翰1 天前
spring对junit的支持
spring·junit·sqlserver