一、canal是什么

canal,译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。canal的工作原理就是把自己伪装成MySQL slave,模拟MySQL slave的交互协议向MySQL Mater发送 dump协议,MySQL mater收到canal发送过来的dump请求,开始推送binary log给canal,然后canal解析binary log,再发送到存储目的地。

二、binLog日志

它记录了所有的DDL DML等语句,以事件的方式记录 ,也可以用来做数据恢复,包含两类文件:

  1. 类是索引文件 .index 结尾用于记录所有的二进制文件。
  2. 进制文件(以.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 学习笔记相关推荐

  1. 阿里巴巴canal学习笔记

    目前主流数据同步工具: https://zhuanlan.zhihu.com/p/346176776 https://zhangzhenquan.blog.csdn.net/article/detai ...

  2. 《Go语言圣经》学习笔记 第十一章 测试

    <Go语言圣经>学习笔记 第十一章 测试 目录 go test 测试函数 测试覆盖率 基准测试 剖析 示例函数 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语 ...

  3. 尚硅谷谷粒学院学习笔记(防坑点的总结部分勘误)

    谷粒学院学习笔记 部分勘误 数据库设计规约 模块说明 环境搭建 创建一个Spring Boot 的父工程,版本使用:2.2.1.RELEASE 父工程pom.xml里面添加 在pom.xml中添加依赖 ...

  4. 学习笔记:SpringCloud 微服务技术栈_实用篇①_基础知识

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 前言 学习视频链接 SpringCloud + RabbitMQ + Docker + Redis + 搜 ...

  5. 【ElasticSearch】学习笔记(三)es的高级操作

    [ElasticSearch]学习笔记(三)es的高级操作 文章目录 [ElasticSearch]学习笔记(三)es的高级操作 1. 数据聚合 1.1 聚合总类 1.2 DSL实现聚合 1.2.1 ...

  6. 数据结构与算法 学习笔记(5):字符串

    数据结构与算法 学习笔记(5)- 字符串 本次笔记记录了LeetCode中关于字符串的一些问题,并给出了相应的思路说明和代码.题目编号与LeetCode对应,方便查找. 题目1:LeetCode 13 ...

  7. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  8. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  9. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

最新文章

  1. MySql层级树查询
  2. HDUOJ-----2175取(m堆)石子游戏
  3. PowerDesigner导出excel
  4. SQLServer2008 Transact_SQL语言基础实例
  5. JZOJ 4061. 【JSOI2015】字符串树
  6. 【从零开始】Python字符串的操作方法
  7. 【51nod - 1875】 丢手绢(约瑟夫问题,可打表,用STL模拟)
  8. Matplotlib 中文用户指南 5.1 指定颜色
  9. 23 岁创业,28 岁成为福布斯亚洲青年领袖,这个“刷脸的男人”有点牛
  10. 人生的一切问题,归根结底就是这三点:无知!恐惧!延迟!
  11. 方型二维码换成圆形_1分钟将微信头像从方形变为圆形
  12. 2016matlab打开toolbox,MATLAB2016添加工具箱toolbox方法,有截图
  13. OpenGL--天空盒
  14. ffmpeg 合并下载m3u8流媒体
  15. 声网3D在线互动场景空间音频的实时渲染——如何把“声临其境”推向极致
  16. 数据库拆分:横向拆分和纵向拆分
  17. java第10章总结
  18. 到底什么是响应式布局,响应式布局如何去写
  19. html输入QQ自动获取QQ头像,QQ号头像名称信息自动获取插件[WordPress] | 贝贝吧
  20. 超声波模块STM32F1X开发

热门文章

  1. Mac---Vue淘宝镜像安装
  2. Javascript通过元素id和name直接获取元素
  3. Cnic.LinkHelper
  4. 毕业3年,我辞职考研(2)
  5. 小姜的功能安全学习笔记_失效率计算部分
  6. xxxxxx has conflicting provisioning settings.
  7. 推荐序——《逆袭大学》连载
  8. 好用到爆的上班摸鱼神器,小说阅读器
  9. 全景视频播放器代码分析
  10. 运行office弹出stdole32