canal能同步指定表数据吗(数据的异构实战)
canal能同步指定表数据吗(数据的异构实战)关于binlog日志查看常用的几条命令如下首先,我们需要正确地打开canal服务器去订阅binlog日志。例如MySQL数据转储到Redis,MySQL数据转储到es等等,也是因为这种数据异构的场景开始出现,陆陆续续有了很多中间件在市场中冒出,例如说rocketMq,kafka,canal这种组件。下边有一张通俗易懂的数据异构过程图:canal进行数据同步
什么是数据的异构处理。简单说就是为了满足我们业务的扩展性,将数据从某种特定的格式转换到新的数据格式中来。
为什么会有这种需求出现呢?
传统的企业中,主要都是将数据存储在了关系型数据库中,例如说MySQL这种数据库,但是为了满足需求的扩展,查询的维度会不断地增加,那么这个时候我们就需要做数据的异构处理了。
常见的数据异构有哪些?
例如MySQL数据转储到Redis,MySQL数据转储到es等等,也是因为这种数据异构的场景开始出现,陆陆续续有了很多中间件在市场中冒出,例如说rocketMq,kafka,canal这种组件。
下边有一张通俗易懂的数据异构过程图:
canal进行数据同步
首先,我们需要正确地打开canal服务器去订阅binlog日志。
关于binlog日志查看常用的几条命令如下
注意binlog日志格式要求为row格式:
ROW格式日志的特点
记录sql语句和每个字段变动的前后情况,能够清楚每行数据的变化历史,占用较多的空间,不会记录对数据没有影响的sql,例如说select语句就不会记录。可以使mysqlbinlog工具去查看内部信息。
statement模式的日志内容
STATEMENT格式的日志就和它本身的命名有点类似,只是单独地记录了sql的内容,但是没有记录上下文信息,在数据会UI福的时候可能会导致数据丢失。
MIX模式模式的日志内容
这种模式的日志内容比较灵活,当遇到了表结构变更的时候,就会记录为statement模式,如果遇到了数据修改的话就会变为row模式。
如何配置canal的相关信息?
比较简单,首先通过下载好canal的安装包,然后我们需要在canal的配置文件上边做一些手脚:
启动我们的canal程序,然后查看日志,如果显示下边这些内容就表示启动成功了:
ps:关于canal入门安装的教程网上有很多,这里我就不做过多的阐述了。
canal服务器搭建起来之后,我们便进入了java端的程序编码部分:
接着再来查看我们的客户端代码,客户端中我们需要通过java程序获取canal服务器的连接,然后进入监听binlog日志的状态。
可以参考下边的程序代码:
本地监听到了canal的example文件夹中配置的监听的日志信息之后,就会自动将该日志里面记录的数据进行打印读取。
那么这个时候我们还需要做多一步处理,那就是将坚听到的数据转换为可识别的对象,然后进行对象转移处理。
其实光是链接获取到canal的binlog日志并不困难,接着我们还需要将binlog日志进行统一的封装处理,需要编写一个特定的处理器将日志的内容转换为我们常用的DTO类:
下边这个工具类可以借鉴一下:
接着是canal的核心处理器 主要的目的是将binlog转换为我们所希望的实体类对象,该类目前主要考虑兼容的数据类型为目前8种,比较有限,如果读者后续在实际开发中还遇到某些特殊的数据类型可以手动添加到map中。
ps: t_type表是一张我们用于做测试时候使用的表,这里我们可以根据自己实际的业务需要定制不同的实体类对象
现在我们已经可以通过binlog转换为实体类了,那么接下来就是如何将实体类做额外的传输和处理了。数据的传输我们通常会借助mq这类型的中间件来进行操作,关于这部分的内容我会在后续的文章中做详细的输出。
最后,我自己是一名从事了多年开发的JAVA老程序员,今年年初我花了一个月整理了一份最适合2019年学习的java学习干货,可以送给每一位喜欢java的小伙伴,想要获取的可以关注我的头条号并在后台私信我:java,即可免费获取。
作者:Java知音
来源:微信公众号