Program_new_bird 2022-02-18 10:15 采纳率: 50%
浏览 66

canal如何将关联关系表的数据同步到es

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

img

我需要将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 为空。

查了发现不止我一个人有这个问题,也就是说canal本身对这种关联关系表的支持并不太友好

再然后我就想将两张表合为一张再进行查询,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, cr.resourceId from category_rel as cr left join category as c) d on r.resourceId = rc.resourceId

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

  1. 被关联的表里如果包含子查询,则不能包含多张表。

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

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

各位牛爷爷们,我觉得我这个同步场景应该不复杂,为什么 canal 这么不友好呢,还是我没学会如何写 sql?求指教。
我的需求是:如果canal能够完美解决我的场景那是最好的
如果不能,在我这种场景下用什么同步方法比较合适?

  • 写回答

1条回答 默认 最新

  • 三千烦恼丝xzh 2022-02-18 11:04
    关注

    你这样是不是source和target关联不起来了,es里面只有四个字段,source字段更新同步时怎么确保和target的关系?没有直接关联关系吧,感觉你应该存上关联的键,这样就算自己解析也很方便处理

    评论

报告相同问题?

问题事件

  • 创建了问题 2月18日

悬赏问题

  • ¥15 winform的chart曲线生成时有凸起
  • ¥15 msix packaging tool打包问题
  • ¥15 finalshell节点的搭建代码和那个端口代码教程
  • ¥15 用hfss做微带贴片阵列天线的时候分析设置有问题
  • ¥50 我撰写的python爬虫爬不了 要爬的网址有反爬机制
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥120 计算机网络的新校区组网设计
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录