`

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使用踩坑笔记经验分享,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    CDH中添加Elasticsearch服务

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

    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

    Hadoop+Spark+Hive+HBase+Oozie+Kafka+Flume+Flink+ES+Redash等详细安装部署

    1、内容概要:Hadoop+Spark+Hive+HBase+Oozie+Kafka+Flume+Flink+Elasticsearch+Redash等大数据集群及组件搭建指南(详细搭建步骤+实践过程问题总结)。 2、适合人群:大数据运维、大数据相关技术及组件初学者。 3、...

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

    今天笔者正在学习Redux,编写了一个程序准备运行体会一下,代码如下: import {createStore} from 'redux' function counter(state = 0, action) { switch (action.type) { case 'INCREMENT': ...

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

    webpack根据ES2015 loader 规范实现了用于动态加载的import()方法。 这个功能可以实现按需加载我们的代码,并且使用了promise式的回调,获取加载的包。 在代码中所有被import()的模块,都将打成一个单独的包,放在...

    Android开发在路上:少去踩坑,多走捷径

    屏幕密度数据OpenGLES版本也可以参考一下国内一个第三方数据:http://www.umindex.com/#android_device目前三星和小米市场占有率是遥遥领先的,三星Note2、Note3、S3、S4、S5、小米123、红米必须测试,魅族也

    es6技术分享

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

    一步步教你用python的scrapy编写一个爬虫

    介绍 本文将介绍我是如何在python爬虫里面...我这边是打算先将所有从网站上爬下来的数据放到ElasticSearch里面, 选择ElasticSearch的原因是速度快,里面分词插件,倒排索引,需要数据的时候查询效率会非常好(毕竟爬的

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

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

Global site tag (gtag.js) - Google Analytics