canal如何将mysql关联表的数据如何同步到elasticsearch
近期我的需求里需要将一部分数据库里的数据同步到 elasticSearch,然后从 es 进行搜索。
需要同步的表结构如下:
我需要将resourceId
, resourceName
, authorName
和 categoryName
这四个字段的数据同步到 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 写入进去。
一切配置好后,
- 执行 etl 同步全量数据,没有问题。
- 修改 author 表的数据,改动同步至 es。
- 修改资源表的数据,改动同步至 es。
- 修改分类-资源关系表的数据,log 里打印出了 update 的日志,但改动并未同步到 es。
- 分类表新增一条数据,并修改分类-资源关系表的映射关系指向这条新数据,大bug出现了,映射关系里关联的资源在 es 中只剩下 2 个字段,就是
categoryId
和resourceId
,designerName
和categoryName
为空。
查了发现不止我一个人有这个问题
于是我就想将两张表合为一张再进行查询,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
的路被完全堵死了。
只剩下其他方法,比如:
- 使用canal-deploy监听binlog后,在代码里解析进行深度定制后再写入ES。
- 使用其他同步工具如Flink-CDC, logstash。但是也不知道它们对多表关联的支持情况如何。
各位牛爷爷们,我觉得我这个同步场景应该不复杂,为什么 canal 这么不友好呢,还是我没学会如何写 sql?求各位大佬指教
以上是 canal如何将mysql关联表的数据如何同步到elasticsearch 的全部内容, 来源链接: utcz.com/p/944230.html