`

elasticsearch使用踩坑

阅读更多

es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?

 

性能优化的杀手锏——filesystem cache

我们往 es 里写的数据,实际上都写到磁盘文件例如了,查询的时候,操作系统会将磁盘文件里的数据自动缓存到 filesystem cache 里面去。

 

es 的搜索引擎严重依赖于底层的 filesystem cache,你如果给 filesystem cache 更多的内存,尽量让内存可以容纳所有的 idx segment file 索引数据文件,那么你搜索的时候就基本都是走内存的,性能会非常高。

 

性能差距究竟可以有多大?我们之前很多的测试和压测,如果走磁盘一般肯定上秒,搜索性能绝对是秒级别的,1秒、5秒、10秒。但如果是走 filesystem cache,是走纯内存的,那么一般来说性能比走磁盘要高一个数量级,基本上就是毫秒级的,从几毫秒到几百毫秒不等

 

要让 es 性能要好,最佳的情况下,就是你的机器的内存,至少可以容纳你的总数据量的一半。

 

建议用 es + hbase 这么一个架构。

hbase 的特点是适用于海量数据的在线存储,就是对 hbase 可以写入海量数据,但是不要做复杂的搜索,做很简单的一些根据 id 或者范围进行查询的这么一个操作就可以了。从 es 中根据 name 和 age 去搜索,拿到的结果可能就 20 个 doc id,然后根据 doc id 到 hbase 里去查询每个 doc id 对应的完整的数据,给查出来,再返回给前端。

写入 es 的数据最好小于等于,或者是略微大于 es 的 filesystem cache 的内存容量。然后你从 es 检索可能就花费 20ms,然后再根据 es 返回的 id 去 hbase 里查询,查 20 条数据,可能也就耗费个 30ms,可能你原来那么玩儿,1T 数据都放 es,会每次查询都是 5~10s,现在可能性能就会很高,每次查询就是 50ms。

 

 

数据预热

假如说,哪怕是你就按照上述的方案去做了,es 集群中每个机器写入的数据量还是超过了 filesystem cache 一倍,比如说你写入一台机器 60G 数据,结果 filesystem cache 就 30G,还是有 30G 数据留在了磁盘上。

其实可以做数据预热。

 

冷热分离

将大量的访问很少、频率很低的数据,单独写一个索引,然后将访问很频繁的热数据单独写一个索引。最好是将冷数据写入一个索引中,然后热数据写入另外一个索引中,这样可以确保热数据在被预热之后,尽量都让他们留在 filesystem os cache 里,别让冷数据给冲刷掉。

 

 

分页性能优化

es 的分页是较坑的,为啥呢?举个例子吧,假如你每页是 10 条数据,你现在要查询第 100 页,实际上是会把每个 shard 上存储的前 1000 条数据都查到一个协调节点上,如果你有个 5 个 shard,那么就有 5000 条数据,接着协调节点对这 5000 条数据进行一些合并、处理,再获取到最终第 100 页的 10 条数据。

分布式的,你要查第 100 页的 10 条数据,不可能说从 5 个 shard,每个 shard 就查 2 条数据,最后到协调节点合并成 10 条数据吧?你必须得从每个 shard 都查 1000 条数据过来,然后根据你的需求进行排序、筛选等等操作,最后再次分页,拿到里面第 100 页的数据。你翻页的时候,翻的越深,每个 shard 返回的数据就越多,而且协调节点处理的时间越长,非常坑爹。所以用 es 做分页的时候,你会发现越翻到后面,就越是慢。

 

有什么解决方案吗?

不允许深度分页(默认深度分页性能很差)

 

类似于微博中,下拉刷微博,刷出来一页一页的,你可以用 scroll api

scroll 会一次性给你生成所有数据的一个快照,然后每次滑动向后翻页就是通过游标 scroll_id移动,获取下一页下一页这样子,性能会比上面说的那种分页性能要高很多很多,基本上都是毫秒级的。但是,唯一的一点就是,这个适合于那种类似微博下拉翻页的,不能随意跳到任何一页的场景。

 

分享到:
评论

相关推荐

    SDL2和OpenGL使用踩坑笔记经验分享

    SDL2和OpenGL使用踩坑笔记经验分享 本文分享了作者在使用SDL2和OpenGL开发LFTK嵌入式GUI时踩过的一些坑,包括显示模糊的问题、nanovg裁剪算法无效和Windows下的OpenGL函数找不到等问题。作者通过研究SDL2和OpenGL的...

    CDH中添加Elasticsearch服务

    此前Elasticsearch我一直是单独搭建的,后来偶然发现可以在Cloudera Manager中添加ES服务,在搭建过程中这篇博客给了我很多帮助 https://www.cnblogs.com/zhangrui153169/p/11447423.html 但存在一些问题,在这里记录...

    04 - Elasticsearch+Neo4j在档案领域的探索与实践 - 兰小伟 重庆 2024.4.27

    在这一背景下,使用Elasticsearch结合Neo4j成为一种新的解决方案,它们能够极大地增强档案领域的文档检索能力和处理具有复杂关系的数据的能力。 #### 二、Elasticsearch 在档案领域的应用 **1. Elasticsearch简介*...

    word源码java-es:用于高级搜索的elasticsearch

    elasticsearch for advanced search 配置 elasticsearch、从 MySQL 同步数据、使用 spring-data-elasticsearch 进行高级检索。 系统分析大作业,详细写个 readme 记录下我肝了整整五天踩坑跳坑的结果。 1. elastic...

    spark写DSL读取elasticsearch数据(内附踩坑点)

    在一些场景下我们可能会遇到需要从es导出一部分特定的数据然后进行处理这样...elasticsearch:7.0.0 scala:2.11.8 maven配置如下: org.scala-lang scala-library 2.11.8 org.apache.spark spark-core_2.11

    ESP32-S3+ST889,CST816屏幕踩坑日志-硬件篇 ES32-S3R8V硬件设计指南

    - 提供了如何使用USB接口进行固件烧录的方法。 #### 5. 相关文档和资源 - 乐鑫提供了丰富的文档和技术支持,包括设计指南、开发手册等。 通过以上总结可以看出,《ESP32-S3 系列硬件设计指南》不仅涵盖了ESP32-S3...

    node编译程序踩坑及解决方案:ES6转ES5

    在本文中,我们将探讨在使用Node.js时遇到的ES6语法不兼容问题以及如何通过Babel这个编译工具将ES6代码转换为ES5以解决这个问题。 在描述中提到的示例代码是一个简单的Redux应用,使用了ES6的导入语法 (`import`) ...

    去哪儿网ELK安全监控中心踩坑和实践.pdf

    去哪儿网的安全工程师周军分享了他在构建和优化ELK(Elasticsearch、Logstash、Kibana)安全监控中心的过程中遇到的问题及解决方案,深入探讨了如何在企业级环境中实现有效的网络信息安全监控。 1. **安全监控的...

    详解webpack import()动态加载模块踩坑

    其中,`import()` 是 Webpack 提供的一种动态加载模块的功能,它基于 ES2015 的模块加载规范,实现了按需加载代码的能力,极大地优化了应用的加载性能。本文将深入探讨 `import()` 的使用及其可能遇到的问题。 `...

    es6技术分享

    js踩坑的知识点,包括Promise以及Iterator等es热门的知识点

    tuksearch:一个简单的全文索引服务

    做这个的初衷只是为了让我的小项目可以有全文检索这样高大上的功能, 而我又不打算去搭一套Elasticsearch 之类. ===== 写这个玩具的大半时间花在踩坑以及造轮子上. 比如代码中包含了 bleve 的一部分实现, 是因为: ...

    银行上分布式数据库的最佳实践.docx

    \n- **搜索引擎**:Elasticsearch、Solr用于以搜索为主的业务。\n- **缓存**:Redis Cluster用于高性能的数据缓存需求。\n\n**避免的坑与最佳实践**\n\n1. **稳定性优先**:选择成熟、经过市场验证的分布式数据库...

    react小白学习PDF

    React是JavaScript库,主要用于构建用户界面,特别...同时,遇到问题不要害怕,每个开发者都会经历学习过程中的“踩坑”,解决问题的过程本身就是进步的阶梯。希望这些信息对你在React的学习之路上有所帮助,祝你顺利!

    携程技术2020年度合辑.pdf

    3. **携程Elasticsearch数据同步实践** - **知识点**: - Elasticsearch集群管理与优化。 - 数据同步机制的实现。 - 索引优化与查询性能提升。 - 大数据场景下的部署策略。 #### 四、质量保障 1. **基于BDD...

Global site tag (gtag.js) - Google Analytics