mysql 数据同步 elasticsearch 方案

2023-03-08 09:24:18 +08:00
 jiobanma

目前项目想把 mysql 中的数据同步到 elasticsearch 中,接触了几种方案,想咨询一下大家工作中都使用什么方案。

  1. mysql 中的全量数据使用 logstash 导入 es ,然后增量的数据通过 canal 监听 binlog 转发到消息队列,然后数据服务监听详细队列,维护 es 中的数据。 [优点] :代码侵入小,轻量级使用。 [缺点] :a. logstash 导入大量数据效率低,每次任务最多只能同步 100000 条,并且最少要 1 分钟执行一次。b. logstash 先全量,canal 再接着增量,两个时间点可能会出现数据一致性问题。c. 貌似 canal 的坑不少,并且 github 好像也不怎么维护了。

  2. flink cdc 同步 mysql 到 elasticsearch 。看了一下 demo 的演示,感觉挺强大的,完全不用写代码,基本上通过 flink sql 就可以搞定。但是尝试按照官方的教程在本地模拟一下,不知道是不是目前还不支持 es8 ,导致我的数据刚开始可以同步到 es ,但是之后的 CUD 操作都无法同步到 es ,flink 的 webui 也有错误信息。在官方的 github 上咨询了此事,目前还没有回复 https://github.com/ververica/flink-cdc-connectors/discussions/1968 。 [缺点] :网上的资料较少。

大家工作中都使用什么方案呢

6848 次点击
所在节点    程序员
68 条回复
voidmnwzp
2023-03-08 09:29:41 +08:00
不要求实时性就根据 updatetime 每天跑个定时任务刷一次,要求强一致性就用 flink cdc
GunsRose
2023-03-08 09:31:34 +08:00
肯定是 flink-cdc 好用,不过这玩意搞起来也有很多的坑
jiobanma
2023-03-08 09:34:58 +08:00
@GunsRose 能举个例子吗大佬
jiobanma
2023-03-08 09:35:19 +08:00
@voidmnwzp 还是要求强一致性的
pubby
2023-03-08 09:36:19 +08:00
现在用的方案是
记录 binlog 位置后先全量导入
然后从那个位置开始 canal 同步数据
NoString
2023-03-08 09:39:40 +08:00
阿里云全家桶之 DTS...
577322753
2023-03-08 09:39:54 +08:00
如果是云服务上的 db 的话,es 索引与表是一对一的话可以直接用 DTS 数据同步来做,表与 es 索引不是一对一的话,可以用 DTS 数据订阅,将 binlog 投递到 kafka 中,自己订阅 kafka 消息解析 binlog ,写到 es 中。
我们目前是用 DTS 数据订阅作为生产端 + 基于 canal Client 改造的客户端实现的 es 同步
577322753
2023-03-08 09:41:36 +08:00
有些 DTS 工具也是支持多表写入到一个索引里的,京东云上的数据同步就是这样的,跟他们沟通过,底层也是用的 flink 那一套
j1132888093
2023-03-08 09:42:51 +08:00
我们公司操作数据库的时候同步操作 es........
likeme
2023-03-08 09:44:25 +08:00
@j1132888093 我也是这么做的,难道不行?(自我怀疑...)
binge921
2023-03-08 09:47:18 +08:00
别用 canal 了 我上次用 不小心把生产的 cpu 占用干满了 哭死
jiobanma
2023-03-08 09:49:53 +08:00
@j1132888093
@likeme 这样是可以的,但是涉及到一个历史数据的导入,还是比较麻烦的,当然可以写一个洗数据的接口,但是效率肯定很低。然后要在业务代码里在同步操作 es 还得梳理旧的代码和接口,太费人了。
gitxuzan
2023-03-08 09:51:27 +08:00
cancal 提供了第三方中间件语言,对接到自己语言里面,监听解析 binlog ,然后实时批量同步
hhjswf
2023-03-08 09:54:37 +08:00
@likeme 入侵性太强了
godleon
2023-03-08 09:59:54 +08:00
bboss
matrix1010
2023-03-08 10:14:28 +08:00
可以参考 elastic 官方的这篇文章,简单来说就是通过时间戳增量批量刷新: https://www.elastic.co/cn/blog/how-to-keep-elasticsearch-synchronized-with-a-relational-database-using-logstash 。 但其实可以完全不用 Logstash, 自己写个 cron 脚本按相同的逻辑更新
vagusss
2023-03-08 10:14:33 +08:00
maxwell 好像坑比 canal 少一点
Morriaty
2023-03-08 10:17:54 +08:00
你是 online service 还只是内部搜索需求?如果是 online service ,同步工具倒是其次,这玩意最恶心的是,你要设计好一个机制,就是每次由于字段变更、分词词库更新等问题需要重新全量索引( full index )时,你的实时索引( realtime index )不能停,因为线上还在服务,用户要一直能看到最新的。可以看看 https://engineering.carsguide.com.au/elasticsearch-zero-downtime-reindexing-e3a53000f0ac
SoulSleep
2023-03-08 10:20:32 +08:00
我们用的 canal ,你说的这俩方案我们曾经都试过....
logstash...慢,不灵活
flink cdc 还不错,不需要写代码...但是...有上手难度(对我们团队来说

canal ,我们现在线上运行了几十个实例,有 1-1 ,N-1 ,多种场景,性能,没太多资源,大概做到了 5w/s 的速度,完全满足我们的需要
我们的链路:
1-1:mysql--canal--adapter--es

n-1: mysql--canal--处理程序--es
terranboy
2023-03-08 10:20:38 +08:00
现在的 ORM 的 EVENT 都很完善的 在业务里面同步了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/922102

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX