正在学习canal的使用,求大神梳理下canal中几个概念的关系:
目前我的理解是:一个message包含多个entry(其共同构成entries),一个entry对应一个eventtype(可以是insert/delete等),一个entry可以解析得到一个rowchange,一个rowchange可以解析得到多个rowdata,一个rowdata可以解析得到before的columns(方法getBeforeColumnsList)和after的columns。
问题1: 请问它们内部的关联是怎样的?
问题2: transactionID和batchID的区别?
问题3: entry.getHeader().getSchemaName())可以获取到mysql的schema,但是怎么获取mysql 的instance?
原提问者GitHub用户alexlgj
一个message就是get到的batch packet,batchId是其标识,是canal概念;transactionId是mysql事务相关的。mysql binlog 会将同表的同类型操作(insert, update等)的变更行merge为一个event以节省meta开销,entry是canal proto类型,对应mysql event。rowdata对应每一行数据。before和after对应变更前后,所以update兼具两者,insert只有after,delete只有before。在特殊情况下,比如开启ndb的一些参数,update会变成insert类型。
原回答者GitHub用户lcybo
问题1:它们内部的关联是怎样的?
在 Canal 中,消息(Message)是 Canal 从数据库中读取到的变更数据的最小传输单位。一个 Message 可以包含多个 Entry,每个 Entry 是 Message 的一个子项目,代表一条具体的数据库变更操作。而每个 Entry 包含了一个 header 和一个 body,其中 header 描述了该 Entry 的基本信息(比如 schema、table 等),body 则包含具体的变更数据。
各个概念之间的关系可以描述为:
一个 Message 包含多个 Entry。 一个 Entry 包含一个 Header 和一个 Body。 一个 Body 包含一个 EventType 和一个 RowChange。 一个 RowChange 包含多个 RowData。 一个 RowData 包含 before 和 after 两种列集合。 问题2:transactionID和batchID的区别?
在 Canal 中,transaction ID 和 batch ID 都是用于标识一系列数据库变更操作的标识符。
transaction ID 表示一组数据库变更操作在 MySQL 数据库中属于同一个事务的 ID,也就是说,在一个数据库事务中执行的多个更新语句会共用一个 transaction ID。
batch ID 则表示一个 Message 中包含的多个 Entry 属于同一个 batch 的 ID。在一次批量传输中,多个 Entry 会被分为若干个 batch 进行传输,每个 batch 携带一个唯一的 batch ID。
问题3:entry.getHeader().getSchemaName()可以获取到mysql的schema,但是怎么获取mysql的instance?
Canal 中的 instance 表示一个 MySQL 实例。在 Canal 中,通过对多个 instance 的配置来监听多个 MySQL 数据库的变更。在 Canal 的配置文件中,会为不同的 instance 声明不同的 ID(通常是一个字符串),可以通过这个 ID 来区分和访问不同的 instance。
获取当前 instance 的方法为通过 Canal 配置文件获取当前 instance 的 ID,然后遍历 Canal 所有已启动的 instance,匹配指定 ID 的 instance,并返回其中的一个。具体实现可以参考 Canal 的源代码:通过 CanalStarterWrapper 类中的 getGlobalInstanceManager() 方法获取全局 instance 管理器,再通过 instance 管理器的 findInstance 方法查找符合条件的 instance。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。