canal 学习笔记
一、canal是什么
canal,译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。canal的工作原理就是把自己伪装成MySQL slave,模拟MySQL slave的交互协议向MySQL Mater发送 dump协议,MySQL mater收到canal发送过来的dump请求,开始推送binary log给canal,然后canal解析binary log,再发送到存储目的地。
二、binLog日志
它记录了所有的DDL DML等语句,以事件的方式记录 ,也可以用来做数据恢复,包含两类文件:
- 类是索引文件 .index 结尾用于记录所有的二进制文件。
- 进制文件(以.0000为后缀) 记录数据库所有的DDL和DML。
binlog的分类:
- statement:语句级别 会记录每一次执行写操作的语句,相对row模式节省空间 可能产生不一致性。
- row: 行级 记录每次操作后每行记录的变化 会保持数据的一致性 但是占用空间较大。
- mixed: 混合以上两种。
三、canal的链接模式
首先需要下载canal,并删除startUp.bat的如下内容,否则会启动报错。
-Dlogback.configurationFile="%logback_configurationFile%”
然后双击startUp.bat 就能正常启动了。并在工程中引入canal 的maven
<dependency><groupId>com.alibaba.otter</groupId><artifactId>canal.client</artifactId><version>1.1.4</version>
</dependency>
还需要对mysql的binlog日志进行开启,并设置为行级(row)模式。
TCP模式:
首先canal.properties 文件修改模式为TCP
canal.serverMode = tcp
修改实例的配置文件,需要提前为canal创建账户并赋予权限。
canal.instance.mysql.slaveId=0 # 这个slaveid需要保持全局唯一# username/password
canal.instance.dbUsername=canal # 用户名
canal.instance.dbPassword=root # 用密码
canal.instance.connectionCharset = UTF-8 # 字符集
接下来就需要写监听的代码:
public class CanalMain {public static void main(String[] args) throws InterruptedException, InvalidProtocolBufferException {// 单机下的canal 链接 destination 指定的是canal的监听对象,用户名和密码一般不用填写CanalConnector canalConnector = CanalConnectors.newSingleConnector(new InetSocketAddress("localhost", 11111),"example", "", "");// 死循环监听链接while (true){canalConnector.connect(); // 获取链接canalConnector.subscribe("canaltest.*"); // 设置订阅的数据,这里是订阅了canaltest数据库下的所有表Message message = canalConnector.get(100); // get指定每次获取的数量 如果没有到达目标数量也不会阻塞List<CanalEntry.Entry> entries = message.getEntries(); // entry 里面包含sql信息if(!entries.isEmpty()){for(CanalEntry.Entry entry: entries){String tableName = entry.getHeader().getTableName(); // 获取表名CanalEntry.EntryType entryType = entry.getEntryType(); // 获取类型ByteString storeValue = entry.getStoreValue(); // storeValue就是真正数据的存放地方if(CanalEntry.EntryType.ROWDATA.equals(entryType)){// 解析一行数据CanalEntry.RowChange rowChange = CanalEntry.RowChange.parseFrom(storeValue);CanalEntry.EventType eventType = rowChange.getEventType(); // 事件的类型// 一条sql的到来能获得 修改前的数据 和 修改后的数据// 删除只有修改前没有修改后 插入只有修改后没有修改前List<CanalEntry.RowData> rowDatasList = rowChange.getRowDatasList();for(CanalEntry.RowData data: rowDatasList){JSONObject before = new JSONObject();for(CanalEntry.Column befData: data.getBeforeColumnsList()){before.put(befData.getName(), befData.getValue());}JSONObject after = new JSONObject();for(CanalEntry.Column AftData: data.getAfterColumnsList()){after.put(AftData.getName(), AftData.getValue());}}}}}}}
}
message的数据结构如下图:
kafka模式:
首先需要开启zookeeper 和 kafka。修改canal的模式 改成kafka。
canal.serverMode = kafka
并修改MQ相关配置指定kafka地址
##################################################
######### MQ #############
##################################################
canal.mq.servers = 127.0.0.1:9092 # kafka地址 多个逗号间隔
canal.mq.retries = 0 # 重试次数
canal.mq.batchSize = 16384 # 批size
canal.mq.maxRequestSize = 1048576 # 最大请求size
修改监听对象配置文件的 kafka topic 并能对多个进行修改。
# mq config
canal.mq.topic=canal_example # 监听哪个实例对象
# dynamic topic route by schema or table regex
#canal.mq.dynamicTopic=mytest1.user,mytest2\\..*,.*\\..*
canal.mq.partition=0 # 具体的分区
# hash partition config
#canal.mq.partitionsNum=3
#canal.mq.partitionHash=test.table:id^name,.*\\..*
启动kafka消费者 指定topic,修改数据库的信息,kafka就能监听到了。
canal 学习笔记相关推荐
- 阿里巴巴canal学习笔记
目前主流数据同步工具: https://zhuanlan.zhihu.com/p/346176776 https://zhangzhenquan.blog.csdn.net/article/detai ...
- 《Go语言圣经》学习笔记 第十一章 测试
<Go语言圣经>学习笔记 第十一章 测试 目录 go test 测试函数 测试覆盖率 基准测试 剖析 示例函数 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语 ...
- 尚硅谷谷粒学院学习笔记(防坑点的总结部分勘误)
谷粒学院学习笔记 部分勘误 数据库设计规约 模块说明 环境搭建 创建一个Spring Boot 的父工程,版本使用:2.2.1.RELEASE 父工程pom.xml里面添加 在pom.xml中添加依赖 ...
- 学习笔记:SpringCloud 微服务技术栈_实用篇①_基础知识
若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 前言 学习视频链接 SpringCloud + RabbitMQ + Docker + Redis + 搜 ...
- 【ElasticSearch】学习笔记(三)es的高级操作
[ElasticSearch]学习笔记(三)es的高级操作 文章目录 [ElasticSearch]学习笔记(三)es的高级操作 1. 数据聚合 1.1 聚合总类 1.2 DSL实现聚合 1.2.1 ...
- 数据结构与算法 学习笔记(5):字符串
数据结构与算法 学习笔记(5)- 字符串 本次笔记记录了LeetCode中关于字符串的一些问题,并给出了相应的思路说明和代码.题目编号与LeetCode对应,方便查找. 题目1:LeetCode 13 ...
- PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call
您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...
- 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
最新文章
- MySql层级树查询
- HDUOJ-----2175取(m堆)石子游戏
- PowerDesigner导出excel
- SQLServer2008 Transact_SQL语言基础实例
- JZOJ 4061. 【JSOI2015】字符串树
- 【从零开始】Python字符串的操作方法
- 【51nod - 1875】 丢手绢(约瑟夫问题,可打表,用STL模拟)
- Matplotlib 中文用户指南 5.1 指定颜色
- 23 岁创业,28 岁成为福布斯亚洲青年领袖,这个“刷脸的男人”有点牛
- 人生的一切问题,归根结底就是这三点:无知!恐惧!延迟!
- 方型二维码换成圆形_1分钟将微信头像从方形变为圆形
- 2016matlab打开toolbox,MATLAB2016添加工具箱toolbox方法,有截图
- OpenGL--天空盒
- ffmpeg 合并下载m3u8流媒体
- 声网3D在线互动场景空间音频的实时渲染——如何把“声临其境”推向极致
- 数据库拆分:横向拆分和纵向拆分
- java第10章总结
- 到底什么是响应式布局,响应式布局如何去写
- html输入QQ自动获取QQ头像,QQ号头像名称信息自动获取插件[WordPress] | 贝贝吧
- 超声波模块STM32F1X开发