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

ES在数据量很⼤的情况下(数⼗亿级别)如何提⾼查询效率E S 性能优化没有什么银弹,不要期待调⼀个参数,可以应对所有的性能慢的场景。
ES性能优化的杀⼿锏——filesystem cache
向 es ⾥写的数据,写到磁盘⽂件⾥去了,查询的时候,操作系统会将磁盘⽂件⾥的数据⾃动缓存到 filesystem cache ⾥⾯。
ES的搜索引擎依赖于底层的 filesystem cache ,如果给 filesystem cache 更多的内存,尽量让内存可以容纳所有的 idx segment
file 索引数据⽂件,那么搜索的时候是⾛内存的,性能会⾮常⾼。filesystem cache 性能⽐⾛磁盘要⾼⼀个数量级,基本上是毫秒级的,从⼏毫秒到⼏百毫秒不等。要让 es 性能要好,最佳的情况下,机器的内存⾄少可以容纳总数据量的⼀半。
最佳的情况下在 es 中就存少量的数据,要⽤来搜索的那些索引,如果内存留给 filesystem cache 的是 100G,那么将索引数据控制净烟器
nfs5
在 100G 以内,数据⼏乎全部⾛内存来搜索,性能⾮常⾼。仅仅写⼊ es 中要⽤来检索的少数⼏个字段就可以了,⽐如写⼊
es id,name,age 三个字段,然后可以把其他的字段数据存在 mysql/hbase ⾥,建议⽤ es + hbase 。
氮封装置hbase 的特点是适⽤于海量数据的在线存储,对 hbase 可以写⼊海量数据,不要做复杂的搜索,做很简单的⼀些如根据 id 或者范围进⾏查询。从 ES 中根据 name 和 age 去搜索,拿到 doc id ,然后根据 doc id 到 hbase ⾥去查询每个 doc id 对应的完整的数据,返回给前端。
写⼊ ES 的数据最好⼩于等于,或者是略⼤于 ES 的 filesystem cache 的内存容量。
数据预热
槐木可以做防腐木吗ES 集中每个机器写⼊的数据量还是超过了 filesystem cache ⼀倍,可以做数据预热。
对于经常会有⼈访问的数据,最好做⼀个专门的缓存预热⼦系统,对热数据每隔⼀段时间,提前访问⼀下,让数据进⼊ filesystem
cache ⾥⾯,下次访问的时候,性能⼀定会好很多。
液晶屏保护膜冷热分离
ES 可以做类似于 MySQL 的⽔平拆分,就是说将⼤量的访问很少、频率很低的数据,单独写⼀个索引,
然后将访问很频繁的热数据单独写⼀个索引。最好是将冷数据写⼊⼀个索引中,然后热数据写⼊另外⼀个索引中,这样可以确保热数据在被预热之后,尽量都让他们留
在 filesystem os cache ⾥,别让冷数据给冲刷掉。
Document 模型设计
对于 MySQL经常有⼀些复杂的关联查询。在 ES ⾥该怎么玩⼉,ES ⾥⾯的复杂的关联查询尽量别⽤,性能⼀般不太好。侧翻手机
最好先在 Java 系统⾥就完成关联,将关联好的数据直接写⼊ ES 中。搜索的时候,就不需要利⽤ ES 的搜索语法来完成 join 之类的关联搜索了。
document 模型设计是⾮常重要的,不要考虑⽤ es 做⼀些复杂的操作。如果有那种操作,尽量在 document 模型设计的时候,写⼊的时候就完成。另外对于⼀些太复杂的操作,⽐如 join/nested/parent-child 搜索尽量避免。
分页性能优化
ES 的分页是较坑的,假如每页是 10 条数据,现在要查询第 100 页,会把每个 shard 上存储的前 100
0 条数据都查到⼀个协调节点上,如果有 5 个 shard,那么就有 5000 条数据,接着协调节点对这 5000 条数据进⾏合并、处理,再获取到最终第 100 页的 10 条数据。
分布式的系统,查第 100 页的 10 条数据,不可能从 5 个 shard,每个 shard 查 2 条数据,最后到协调节点合并成 10 条数据。必须从每个 shard 都查 1000 条数据过来,然后根据需求进⾏排序、筛选等等操作,最后再次分页,拿到⾥⾯第 100 页的数据。翻页的时候,翻的越深,每个 shard 返回的数据就越多,⽽且协调节点处理的时间越长,⾮常坑。所以⽤ es 做分页的时候,会发现越翻到后⾯,就越慢。
有什么解决⽅案吗?
不允许深度分页(默认深度分页性能很差)
跟产品经理说系统不允许翻页,默认翻的越深,性能就越差。
类似于 app ⾥的推荐商品不断下拉出来⼀页⼀页的
类似于微博中,下拉刷微博,刷出来⼀页⼀页的,可以⽤ scroll api 。
scroll 会⼀次性⽣成所有数据的快照,然后每次滑动向后翻页就是通过游标 scroll_id 移动,获取下⼀页,性能会⽐上⾯说的分页性能要⾼很多,基本上都是毫秒级的。
这个适合于那种类似微博下拉翻页的,不能随意跳到任何⼀页的场景。
初始化时必须指定 scroll 参数,告诉 ES 要保存此次搜索的上下⽂多长时间。需要确保⽤户不会持续不断翻页翻⼏个⼩时,否则可能因为超时⽽失败。
除了⽤ scroll api ,也可以⽤ search_after 来做, search_after 的思想是使⽤前⼀页的结果来帮助检索下⼀页的数据,这种⽅式也不允许随意翻页。初始化时需要使⽤⼀个唯⼀值的字段作为 sort 字段。

本文发布于:2024-09-23 05:27:55,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/133946.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   性能   时候   翻页
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议