canal如何将mysql关联表的数据如何同步到elasticsearch

近期我的需求里需要将一部分数据库里的数据同步到 elasticSearch,然后从 es 进行搜索。
需要同步的表结构如下:

我需要将resourceId, resourceName, authorNamecategoryName这四个字段的数据同步到 es 中。sql 查询语句如下:

select r.resouceId, rf.resourceName, a.authorName, cr.categoryId, c.categoryName 

from resource as r

left join resourcefu as rf on r.resourceId = rf.resourceId

left join author as a on r.authorId = a.authorId

left join category_rel as cr on r.resourceId = cr.resourceId

left join category as c on cr.caetgoryId = c.categoryId

首先想到的就是监听 binlog,进而查到了 canal.
于是开始使用 canal-deployer 监听 binlog, canal adapter 将监听的表的数据同步给 Es. 那么就需要在 adpter/config/es7文件里将上述 sql 写入进去。
一切配置好后,

  1. 执行 etl 同步全量数据,没有问题。
  2. 修改 author 表的数据,改动同步至 es。
  3. 修改资源表的数据,改动同步至 es。
  4. 修改分类-资源关系表的数据,log 里打印出了 update 的日志,但改动并未同步到 es。
  5. 分类表新增一条数据,并修改分类-资源关系表的映射关系指向这条新数据,大bug出现了,映射关系里关联的资源在 es 中只剩下 2 个字段,就是 categoryIdresourceId, designerNamecategoryName 为空。

查了发现不止我一个人有这个问题

于是我就想将两张表合为一张再进行查询,sql 如下

select r.resouceId, rf.resourceName, a.authorName, d.categoryId, d.categoryName 

from resource as r

left join resourcefu as rf on r.resourceId = rf.resourceId

left join author as a on r.authorId = a.authorId

left join (select cr.categoryId, c.categoryName from category_rel as cr left join category as c) d

还是不行,这下直接在启动 adpater 阶段就报了sqlParseExcpetion 错误
经查发现 canal adapter 虽然能支持关联表,但是对关联表由诸多限制,比如:

这下就感觉使用 canal_adapter 的路被完全堵死了。
只剩下其他方法,比如:

  1. 使用canal-deploy监听binlog后,在代码里解析进行深度定制后再写入ES。
  2. 使用其他同步工具如Flink-CDC, logstash。但是也不知道它们对多表关联的支持情况如何。

各位牛爷爷们,我觉得我这个同步场景应该不复杂,为什么 canal 这么不友好呢,还是我没学会如何写 sql?求各位大佬指教

以上是 canal如何将mysql关联表的数据如何同步到elasticsearch 的全部内容, 来源链接: utcz.com/p/944230.html

回到顶部