开发者社区 > 大数据与机器学习 > 检索分析服务 Elasticsearch版 > 正文

使用canal给rds和es同步,查询记录中使用distinct() ,没有报错,但是没有同步行为了

如题,由于原语句有业务数据就改为使用官方的实例进行提问了。官方对于一对多的语句样例为:

select
a.id as _id,
a.name,
a.role_id,
c.labels,
a.c_time from user a
left join (select user_id, group_concat(label order by id desc separator ';') as labels from label
group by user_id) c on c.user_id=a.id

这里存在一个缺点是子表虽然有id字段的索引,但是由于作为join字段的同时也作为group条件,实际上是数据表全遍历的,通过explain就可以看到。实际业务表现很慢,无法满足真正的业务。我将查询优化。

select
a.id as _id,
a.name,
a.role_id,
group_labels(c.user_id),
a.c_time from user a
left join label c on c.user_id=a.id

这样是提高了速度,但是返回的多条子记录会加大了wirteout的压力,于是再次优化为:
select
disntinct(a.id) as _id,
a.name,
a.role_id,
group_labels(c.user_id),
a.c_time from user a
left join label c on c.user_id=a.id

结果同步没有报错,没有任何信息输出,及时打开到trace级别也是没有信息输出。看了源代码也没有看到什么问题,请问是什么原因吗?

canal deploy: 1.1.5

展开
收起
thechinalion 2024-01-10 17:04:57 218 0
3 条回答
写回答
取消 提交回答
  • 是Canal在同步数据时没有正确处理distinct()函数。虽然您使用了distinct(a.id),但实际上Canal可能仍然会将整个记录作为一条消息发送到ES中。为了解决这个问题,您可以尝试以下方法:

    1. 在Canal的配置文件中,确保esSyncMode设置为true,以便Canal可以正确地将数据同步到Elasticsearch中。

    2. 检查Canal的日志文件,看看是否有任何错误或警告信息。这可能会帮助您找到问题的根源。

    3. 如果可能的话,尝试使用Canal的旧版本(例如1.0.x),看看问题是否仍然存在。如果问题解决了,那么可能是新版本中的一个bug。

    4. 如果以上方法都无法解决问题,您可以考虑在Canal的GitHub仓库中提交一个issue,详细描述您遇到的问题和配置。这样,Canal的开发者可能会帮助您找到解决方案。

    2024-01-12 09:55:42
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    根据您提供的信息,我猜测问题可能出在Canal部署版本上。您提到使用的是Canal 1.1.5版本,而这个版本可能存在一些已知的问题。建议您尝试升级到较新的Canal版本,例如2.0或更高版本,看看是否能解决问题。

    另外,您可以尝试以下方法来优化查询性能:

    1. user表的id字段添加索引,以加速连接操作。
    2. label表的user_id字段添加索引,以加速连接操作。
    3. 考虑使用分区表,将数据按照某个字段(如user_id)进行分区,以提高查询性能。
    4. 如果可能的话,尝试调整数据库的配置参数,例如增加缓冲区大小、调整连接数等,以提高查询性能。
    2024-01-11 13:48:21
    赞同 展开评论 打赏
  • 十分耕耘,一定会有一分收获!

    楼主你好,在使用canal同步阿里云RDS和ES时,如果查询记录中使用了distinct(),而同步行为停止,可能是由以下原因引起:

    1. canal无法正确解析distinct()函数:canal在解析SQL语句时可能无法正确处理distinct()函数,导致同步停止。

    2. distinct()函数导致同步数据量过大:使用distinct()函数可以确保查询结果中没有重复的记录,但是可能会导致同步的数据量变得非常大,从而增加了写入ES的压力。

    3. canal配置不正确:检查一下canal的配置是否正确,特别是源数据库和目标ES的配置参数是否正确设置。

    2024-01-10 20:27:41
    赞同 展开评论 打赏

阿里云检索分析服务Elasticsearch版兼容开源ELK功能,免运维全托管,提升企业数据检索与运维分析能力。

热门讨论

热门文章

相关电子书

更多
TcpRT:阿里云RDS智能诊断系统云上大规模部署自动化服务的客户实践经验 立即下载
TcpRT:面向大规模海量云数据库的服务质量实时采集与诊断系 立即下载
袋鼠云基于阿里云RDS的数据库架构实践 立即下载

相关镜像