为什么不要使用elasticsearch

互联网上有很多文章,都在讲为什么要使用elasticsearch,却很少有人讲为什么不要使用elasticsearch。作为深入研究elasticsearch四年,负责公司万亿级别检索的操盘手,借着这篇文章,给大家分享一下,为什么不要使用elasticsearch。

028f24fec5ff4e10a773a905f30cc444.png

一、不要使用的理由

1. 学习成本

elasticsearch的文档蛮多的,而且看一遍什么用都没有,而且看一遍的时间成本很长。但是多看几遍,绝对有用。“书读百遍其义自见”。

一个参数都要看好久,研究好久。关键还不一定能看出来,这参数有啥用。看明白了,还不一定对(有时候没看懂是好事,不会翻车)。这些要结合生产实践才有机会接触到,才有用。

做好es搜索,这条路,我已经走了四年, 这已经是第五个年头了。前年定的flag,看完全部的源码,到现在还没有实现。仅仅看了冰山一∠。这四年看完了网上所有包含es优化的帖子。看了市面上有的全部的es的书籍。看了N遍官方文档。现在API都没记全,仅能做到,知道需要的时候去哪里找!

等我把es都看明白的时候,又发现,这些不够,底层数据结构,还有lucene这些。 es只是一个分布式壳子。于是一年又过去了,回头看,之前的那些似乎都忘了,仅有一点印象。等看完了lucene的底层原理,惊叹,wo c! 前辈为何如此聪明。绝了!只是又发现这才刚入门,顶多算精通es,才明白我是做es的,不是做搜索的。这就像,当你到达了一个山顶,才看到了更高的山峰。这个阶段,可以做到很好的使用es,可以去优化性能,可以得心应手的完成功能需求。但是想要在搜索这条路上走下去,还有更多的事情要做。query改写,意图识别,粗排,精排,这些优化召回质量的东西,像无底洞一样。

GTP火热后,RAG又是一个好的方向。

此外,es官方版本更新的很快。可能我们学习的速度赶不上更新的速度(当然有点夸张)

 

2. 需要场景

如果问:“你为什么不学,不想学这些?”

回答:“学了没用” ,这是真的,推动一个人进步的是需求。就像水涨船高一样,船的高度,是由水决定的。当然我们有选择海域的机会,但是不多。

我自己的经验来看,一开始做18亿数据的集群,我当时已经提升了数十倍了。我觉得自己很了不起。但是在现在看来(万亿量级搜索优化),真想承认当时的井底之蛙。还记得之后拿着这18亿数据优化经验,去面试同程,被虐的体无完肤,感受到当时面试官不想面下去的尴尬。当时我还想向他请教怎么优化,面试官并没有回答我,只说了一句好好看看文档。当时还有点不理解,确实浪费时间。当我今天面试别人的时候,我体会到了这一点。不过,我分享了自己的经验。所以任何时候不要妄自菲薄,别人能达到的高度,我们也能达到,只是时间问题。

也是机会巧合,接触到现在这家万亿级数据级的检索优化工作。但是这种需求量总是小的,能有多少家公司数据量有万亿? 同样,我做了两年了,query改写,意图识别这些召回相关的优化,我也没有做过。

是环境决定了我们的高度!是需求成就了我们,这是真的!

 

3. 集群成本

尽管Elasticsearch是一种功能强大、灵活且广泛使用的搜索和分析引擎,但它也存在一些潜在的挑战和限制。

都说es很快,检索首选es。但是作为过来人,Elasticsearch需要大量的内存、存储和计算资源来有效地运行。如果你的应用程序规模较小或资源受限,可能不适合使用Elasticsearch。

es是天然的分布式,很轻松hold住海量数据检索。但是代价是极其昂贵的,很多人优化搜索,第一想到的是堆机器,能用钱解决的问题都不是问题。一台服务器的成本至少在10W,一台服务器能高性的运行(保证写入和检索的性能),大概嫩挂载的数据在10T。这里可以算一下,假如数据是PB,想要扩一倍集群,成本是多少? 大概一千万。从堆机器来解决优化的这条路,绝对不是通向罗马的那一条。

es能够保证检索速度,是很吃资源的!比如SSD磁盘是必备的,如果你很关注检索性能的话。我敢保证,钱花在SSD上绝对是值的。花一倍的钱去扩一倍机器,不如从HDD换成SSD。

那好下边再来聊聊从技术角度的优化成本。

 

4.技术复杂性

 其实在第一点,学习成本上已经聊过了 Elasticsearch是一个复杂的工具,需要深入理解其配置、管理和优化。团队没有足够的经验或资源来管理它,可能会导致性能下降或系统不稳定。一个小小的参数就能降低N倍性能,好不夸张。同样一个小小的参数也能提升N倍。

文档上有蛮多参数,可以考虑优化的,但是都需要时间去弄明白它。但是能不能用,在特大规模集群上使用,敢吗?

并且我觉得很多优化是藏才源码中的。像开好车,还真得打开引擎盖看一看。

此刻,折腾的第五年,我可能还停留在不知道我不知道的阶段。选择做es搜索,这就是一条不归路。大把的时间,大把的头发都要花掉。

 

5.维护难度

Elasticsearch需要定期维护和更新以确保安全性和性能。如果团队缺乏必要的专业知识或时间来进行维护,可能会面临安全漏洞或性能问题。 即使有着丰富经验的人,也会经常翻车。

其实在大体量数据下,很多问题都会放大。假如数据有100G,重做升级一下,也就是两天的时间。但是PB级别的数据,怎么调整呢,怎么业务无感知呢?通常很多问题 ,确实可以通过升级版本来解决。但是船大不好掉头,这也是真的。

人工成本蛮高的!es想要运行的快,需要对es领域有深入研究的专精人员。才可以。

这里给大家分享几个case:

在6.X之前的版本中,在大体量数据下,会有堆空间不足的问题。这在7.X版本可以得到很好的缓解。因为官方做了源码的改动,把FST从堆内挪到了堆外。

在7.X版本中,仍然会遇到堆空间不足的问题。字节的同学了一个lucene的bug。因为threadlocal的原因,无法释放堆空间。随着索引变多,检索次数变多,堆可用空间越来越少。这会让检索莫名其妙的变慢。多少人还处于水生火热之中,天天慢查询报警,不知所措。这一问题在8.X得到了解决。

还有一个问题,在低版本中( 7.16 之前 )。无法通过后天命令关闭聚合分析任务。这对熔断非常不友好。很多次节点打挂,都是聚合分析请求导致的。

总之运维很头疼,想做好更头疼。想好了嘛?还要用es嘛?

 

6. 鱼和熊掌不可兼得

像mysql,数据量大于300w就会变慢了。 es确实有非常好的查询能力,非常好的写入能力。但这都是有代价的,由底层数据结构决定。例如这些没有的能力:

 

mapping不可改,不能改index属性

根本原因是因为它是日志合并树的概念,无法对已经写入的数据做修改(改字段)。官方文档中介绍了几种修改mapping的方法。一个是新建一个字段,程序中所有地方修改名字,这对于复杂的项目容易出错,而且无法保留原来的数据;另一个是利用aliaa创建一个新的索引,但是所有数据需要重新导入,这需要很长时间,操作性不强。

 

无法多对多

Elasticsearch中提供3中关联关系,Field collapsing(严格来说不是关联),Nested object,Parent-child。前两种都是直接将一个mapping声明在另一个mapping中,第三种关联是在创建子文档是指明他的父文档,但是一个子文档只能有一个父文档,因此也不能实现多对多的关联。其实如果理解了ES的目的是提升检索效率,就不难理解为什么没有多对多关联了,在关系数据库里这就是个效率瓶颈。

es无法做多表查询,父子关联查询,性能是极低的。只能考虑大宽表解决。

 

es没有事务

对事务有要求的,则需要自己实现。

 

二、真的不要使用es吗?

当然,我依然觉得es好用,它很优秀。如果你能接受以上提出的几个点,不妨开始学习es,深入研究es。

这里是我做过的搜索优化的分享专栏,千万不要点进来,提升几十倍怎么办!

https://blog.csdn.net/star1210644725/category_12341074.html?spm=1001.2014.3001.5482

 

这是我这几年研究的es的专栏

https://blog.csdn.net/star1210644725/category_9654555.html

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/451509.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nginx swrr负载均衡算法的二宗罪及其改进的思考

目录 1. swrr负载均衡算法的二宗罪1.1 第一宗罪: 共振引起系统崩溃1.2 第二宗罪: 吃CPU大户 2. 对swrr负载均衡算法的改进的思考2.1 “共振”问题的解决2.2 “吃CPU大户”问题的解决 1. swrr负载均衡算法的二宗罪 swrr是一种基于加权轮询的负载均衡算法。它根据服务器的权重来分…

一款 Windows C盘文件清理工具

推荐一款 Windows C盘清理工具 0. 引言1. 下载地址 0. 引言 Windows 在使用过程,C盘的空间会变得越来越少。 Windows在C盘放了很多缓存,临时文件,我们自己还不敢乱删。 今天试了1款工具,可以很方便的查看C盘各个文件夹的文件大小…

中间件 | RabbitMq - [AMQP 模型]

INDEX 1 全局示意2 依赖 1 全局示意 AMQP,即高级消息队列协议(Advanced Message Queuing Protocol),整体架构如下图 producer 发送消息给 rabbit mq brokerrabbit mq broker 分发消息给 consumer消费producer/consumer 都通过 …

【Echarts】曲线图上方显示数字以及自定义值,标题和副标题居中,鼠标上显示信息以及自定义信息

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《前端》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握…

蝙蝠避障:我生活中的一道光

盲人的世界,是无尽的黑暗。看不见光,看不见色彩,甚至看不见自己的手。但在这个黑暗的世界里,我找到了一个光明的出口:一款可以障碍物实时检测的名为蝙蝠避障的盲人软件。 这款软件就像是我的一双眼睛。它通过先进的激光…

探索HDFS读写流程、节点机制和数据完整性

目录 写在前面一、HDFS的读写流程1.1 HDFS写数据流程1.2 机架感知1.3 HDFS读数据流程1.4 小结 二、 NameNode和SecondaryNameNode2.1 NN和2NN工作机制2.2 Fsimage和Edits解析2.2.1 oiv查看Fsimage文件2.2.2 oev查看Edits文件 2.3 CheckPoint时间设置 三、DataNode3.1 DataNode工…

Spring Cloud Alibaba微服务从入门到进阶(二)

Spring Boot配置管理 1、application.properties 2、application.yml 1.内容格式比较: .properties文件,通过 . 来连接,通过 来赋值,结构上,没有分层的感觉,但比较直接。 .yml文件,通过 &…

攻防演练|某车企攻防小记

前言 专注于web漏洞挖掘、内网渗透、免杀和代码审计,感谢各位师傅的关注!网安之路漫长,与君共勉! 实习期间针对某车企开展的一次攻防演练,过程很曲折,当时的记录没有了只是简单的总结一下。 攻击路径 收…

Promise图解,Pass

10-优化代码_哔哩哔哩_bilibili

Linux运维:深入了解 Linux 目录结构

Linux运维:深入了解 Linux 目录结构 一、 Linux 目录结构与 Windows之间的主要区别二、Linux根目录结构三、常见目录及其作用 💖The Begin💖点点关注,收藏不迷路💖 一、 Linux 目录结构与 Windows之间的主要区别 1、根…

中探:事件循环相关内容(因为不仅仅是初步认识,但也不至于是深入探讨,所以命名为“中探”)

下面内容写于 2022 年,文本描述过多,可能不适合有经验的人看。新的文章在 个人网站 中。 对了,说到事件循环,怎么可以离开这个最知名的视频呢!视频是英文的,但即使你听不懂,单纯看他的操作&…

数学建模-模糊性综合评价模型

中医药是中国传统文化的重要组成部分,凝聚了中华民族千百年来智慧的结晶。作为中医的发源地,中国政府一直致力于保护、发展和推广中医药,采取了一系列政策措施[]。目前,中国面临着老龄化日益加剧,老年人群中慢性疾病和…

keilC51明明已经定义的变量却报错未定义与期待asm

文章目录 keil_C51采用的是C89标准:C89变量定义标准:程序块: expected __asm:已经定义某个变量却报错未定义该变量:从汇编语言中看: keil_C51采用的是C89标准: C89变量定义标准: 1…

固态存储是未来|浅析SSD架构的演进与创新技术-1

常见的SSD架构中,包括了SSD控制器、NAND颗粒、DRAM颗粒三大组件,SSD控制器的固件需要兼顾坏块管理、ECC纠错、垃圾回收GC、磨损均衡WL、NAND die介质管理、缓存交互等等。 随着时代的发展,SSD架构,也不断有新的挑战和需求。基于小…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的交通标志识别系统详解(深度学习模型+UI界面代码+训练数据集)

摘要:本篇博客详细介绍了利用深度学习构建交通标志识别系统的过程,并提供了完整的实现代码。该系统采用了先进的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期版本进行了性能评估对比,分析了性能指标如mAP、F1 Score等。文章深入探…

stm32f103c8t6学习笔记(学习B站up江科大自化协)-USART串口-硬件部分

通信协议简介 USART串口 硬件电路 通信距离: TTL和RS232通信距离只有几十米 RS485电平通信距离可达上千米 应用场景: TTL用于单片机这种低压小型设备 RS232一般在大型机器上使用,由于环境比较恶劣静电干扰比较大,所以电压电平比…

javaEE13(网站第8章两个课后题)

1、对“jspservletjavabean实现分页查询”功能做如下补充: (1)记录批量删除:每个记录前添加复选框,点击批量删除,删除选中记录。 增加跳转到任意页功能。用户可改变每页记录条数。 页面&am…

wait 和 notify方法

目录 1.1 wait()方法 wait 做的事情: wait 结束等待的条件: 1.2 notify()方法 1.3notifyAll方法 1.4wait()和sleep()对比 由于线程之间是抢占式执行的, 因此线程之间执行的先后顺序难以预知. 但是实际开发中有时候我们希望合理的协调多个线程之间的执行先后顺序. 完成这个协调…

Python 的练手项目有哪些值得推荐?

Python 是一种强大的编程语言,有许多值得推荐的练手项目。以下是一些例子: 数据分析:利用 Python 的数据分析库(如 pandas 和 NumPy)处理和分析数据。你可以尝试对数据进行清洗、可视化,或者构建简单的预测…

4-LINUX--文件操作命令

一、文件查看命令 1. cat 1.1 查看文件内容,示例如下: 1.2 合并文件,示例如下: 1.3 往文件中写入数据, Ctrld 是结束输入,示例如下: 2. more 当一个文件的内容超过一个屏幕能显示的行数…