各位老哥,请问你们的 ElasticSearch 在项目中是怎么应用的

2020-10-14 09:37:49 +08:00
 Saurichthys

1.项目中如何处理 es 和 mysql 之间的数据同步问题? 2.把数据都丢在 es 上的方案可不可行,不存入 db 中 3.数据涉及的多表 join 查询的关系,在 es 中要怎么体现

情况是单表,一天新增的数量大概是 30w 左右,放在 db 查询都变得挺卡的,或者有没有什么其他方案!!!

6188 次点击
所在节点    Elasticsearch
21 条回复
Hyseen
2020-10-14 09:48:59 +08:00
使用中间件自动从 MySQL 同步到 ES 中
ben1024
2020-10-14 09:49:07 +08:00
1.同步和异步
利用接口和 canal
2.可行
3.设计结构时直接一个片关联

30w 放 mongodb 也可以,做热切也行
yishengyongyi
2020-10-14 09:51:05 +08:00
中间件接收到数据操作记录后,同时操作 mysql 和 es,查询用 es,MySQL 、
做备份。数据设计多表 join 不适合 es
ArJun
2020-10-14 09:58:55 +08:00
mysql 数据放到 es 主要还是为了性能吧
coderxy
2020-10-14 10:02:08 +08:00
1. 我们是写入两次,db 一次,es 一次,es 缓存一批数据批量写入
2.不可以,千万不要拿 es 做业务,很多问题。
3.es 最好不要做复杂的业务查询那种,尽量只用来做搜索引擎该做的事。
Ministor
2020-10-14 10:14:56 +08:00
2l 正解,利用 canal 去发到消息,异步写入到 es/hbase 中

es 和 hbase 作为异构数据结构,本身就是准实时场景,做到强一致性不太可能

es 建议做一些业务展示,不做业务逻辑处理,做该做的搜索的事情
Morriaty
2020-10-14 10:18:33 +08:00
1. 队列多写
2. 不合适,es 不支持事务
3. 索引时就 join 好写入 es,不要把这种事放在搜索时,es 要的就是快快快!
dong568789
2020-10-14 10:23:50 +08:00
1 、alibaba/canal 解析 mysql-bin
2 、数据可以存在 db 中,可做分表
3 、数据同步到 es,尽量冗余(涉及 join 的)
laminux29
2020-10-14 10:44:50 +08:00
ES 的核心是 [分词] 与 [提前计算 + 流式计算] 建议先把这两个核心的基本概念与原理弄清楚,不然,很多朋友盲目上了 ES 后,发现搜不到东西,或者发现某些处理步骤的性能极差,那就尴尬了。

了解完这两个核心概念后,

1.ES 与 Mysql 如何同步

首先,你去谷歌里百度一下同步的具体实现方法。也就是能够搭建这套环境,并能实现通过配置、通过代码,完成它们之间的简单数据同步。

其次,选择同步策略,比如即时同步、大批量的缓冲式同步、不影响白天生产的晚上偷偷同步策略等等,这些策略的选择与组合,要根据你们的实际情况进行。

接着,看看性能能不能达标,不能的话,分析一下瓶颈在哪。有钱烧钱,没钱换人。

最后,安全与备份做一下。


2.数据能不能全丢在 ES 上,你首先得根据前文,了解 ES 那两个核心特性,再根据你们的业务,自己来做判断。举 3 个例子:

假设你们的业务,是让药店根据固定配方词汇,在药库进行药品查询,那么这种业务可以尝试把数据全丢在 ES 上。

但如果你们的业务,是要多维度、不同关键字、高实时性、完全匹配地对日志进行查询,那么根据 ES 的特性,你们就不能把数据全丢在 ES 上了。不然,mysql 这边数据更改后,发现 es 那边半天查不出新数据;或者就算数据同步到 es 后,根据新增关键词查不出新增数据,这种情况也不是大概不会没有可能会不发生的。


3.30w 数据就卡了,建议你们先对 db 、系统、硬件设备,做一个性能瓶颈分析。
xuanbg
2020-10-14 11:06:53 +08:00
双写,ES 用队列写。
haosamax
2020-10-14 11:09:03 +08:00
借楼,请教个问题,有没有 oracle 同步 ES 的方案
haosamax
2020-10-14 11:10:57 +08:00
@haosamax 高峰期,oracle 单日几千万数据增量,需要查询,目前想法是同步 ES
sadfQED2
2020-10-14 12:45:57 +08:00
1.代码层面双写,mysql binlog 同步
2.可行,但是很坑,es 查询有刷片时间
3.es 里面存成一份数据

目前我们 es 2 亿+数据,存的是全世界的 poi 数据,用 es 主要是为了全文索引,通过关键词搜索
goodboy95
2020-10-14 16:41:52 +08:00
1. 我用的 logstash 设置的定期同步,即时同步还没搞,查近期数据还是走 db 。
2. 应该可行吧,反正我 db 里的旧数据做了个备份之后就全删了。不过我这个是小规模,大规模的话不太确定。
3. 存到 es 的时候就按照连接之后的大表去存。
wangyzj
2020-10-14 18:27:51 +08:00
核心还得看你查询的逻辑是什么
复杂关系 join 放 es 也够呛
Jackeriss
2020-10-14 18:46:39 +08:00
实时性不高的话 es 也可以定时批量写,只要记录下上次写到哪了就行,队列也可以,还可以考虑用 set,这样可以去除重复操作。
Jackeriss
2020-10-14 18:50:10 +08:00
不能只用 es,es 和 MySQL 是互补的关系,就像 redis 和 MySQL 一样
biubiubiuao
2020-10-14 18:56:37 +08:00
kafka
yuudachiPoi
2020-10-14 19:34:31 +08:00
通过 canal 做 mysql 和 es 之间的增量同步。
数据放在 es 上不可行,这不是 es 该干的事情。
尽量使用宽表同步 es,es 上不要做类似 join 的工作。
huayumo
2020-10-14 21:43:09 +08:00
我自己的业务网站是 es 只拿来做搜索,因为都是文章这类的,比较好处理,首次上线,全量同步原有的数据,
之后的更新也是 mysql+es 同时更新.因为只做搜索功能,需求比较简单,搜索业务也不是很重要,
你说的涉及多表的话,业务数据不敏感的话,建议提取相关的字段直接存 es,要么提取多表关系,再进 mysql 查一遍,组合一下,只要 mysql 有索引,感觉问题不大.
其实我水平比较水,仅供参考,不用回复,谢谢

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

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

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

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

© 2021 V2EX