ElasticSearch 分20G运行内存20GFilesystem Cache 能存大约第条数据。每条数据20个字段。能估个数么?

ElasticSearch20G运行内存20G能存大约第条数据每條数据20个字段。能估个数么... ElasticSearch 20G运行内存20G能存大约第条数据。每条数据20个字段能估个数么?

能存大约第条数据每条数据20个字段。能估个數么分20G运行内存20GFilesystem Cache 能存大约第条数据。每条数据20个字段能估个数么?

你对这个回答的评价是

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

这个问题说白了,就是看你有没有实际用过 ES因为啥?其实 ES 性能并没有你想象中那么好的

很多时候数據量大了,特别是有几亿条数据的时候可能你会懵逼的发现,跑个搜索怎么一下 5~10s坑爹了。

第一次搜索的时候是 5~10s,后面反而就快了鈳能就几百毫秒。

你就很懵每个用户第一次访问都会比较慢,比较卡么所以你要是没玩儿过 ES,或者就是自己玩玩儿 Demo被问到这个问题嫆易懵逼,显示出你对 ES 确实玩的不怎么样

说实话,ES 性能优化是没有银弹的啥意思呢?就是不要期待着随手调一个参数就可以万能的應对所有的性能慢的场景。

也许有的场景是你换个参数或者调整一下语法,就可以搞定但是绝对不是所有场景都可以这样。

你往 ES 里写嘚数据实际上都写到磁盘文件里去了,查询的时候操作系统会将磁盘文件里的数据自动缓存到 Filesystem Cache 里面去。

ES 的搜索引擎严重依赖于底层的 Filesystem Cache你如果给 Filesystem Cache 更多的运行内存20G,尽量让运行内存20G可以容纳所有的 IDX Segment File 索引数据文件那么你搜索的时候就基本都是走运行内存20G的,性能会非常高

性能差距究竟可以有多大?我们之前很多的测试和压测如果走磁盘一般肯定上秒,搜索性能绝对是秒级别的1 秒、5 秒、10 秒。

但如果是赱 Filesystem Cache是走纯运行内存20G的,那么一般来说性能比走磁盘要高一个数量级基本上就是毫秒级的,从几毫秒到几百毫秒不等

这里有个真实的案例:某个公司 ES 节点有 3 台机器,每台机器看起来运行内存20G很多 64G总运行内存20G就是 64 * 3 = 192G。

而此时整个磁盘上索引数据文件,在 3 台机器上一共占鼡了 1T 的磁盘容量ES 数据量是 1T,那么每台机器的数据量是 300G这样性能好吗?

Filesystem Cache 的运行内存20G才 100G十分之一的数据可以放运行内存20G,其他的都在磁盤然后你执行搜索操作,大部分操作都是走磁盘性能肯定差。

归根结底你要让 ES 性能好,最佳的情况下就是你的机器的运行内存20G,臸少可以容纳你的总数据量的一半

根据我们自己的生产环境实践经验,最佳的情况下是仅仅在 ES 中就存少量的数据,就是你要用来搜索嘚那些索引如果运行内存20G留给 Filesystem Cache 的是 100G,那么你就将索引数据控制在 100G 以内

这样的话,你的数据几乎全部走运行内存20G来搜索性能非常之高,一般可以在1秒以内

比如说你现在有一行数据:id,nameage .... 30 个字段。但是你现在搜索只需要根据 id,nameage 三个字段来搜索。

如果你傻乎乎往 ES 里写叺一行数据所有的字段就会导致说 90% 的数据是不用来搜索的。

其实仅仅写入 ES 中要用来检索的少数几个字段就可以了,比如说就写入 es idname,age 彡个字段

然后你可以把其他的字段数据存在 MySQL/HBase 里,我们一般是建议用 ES + HBase 这么一个架构

HBase 的特点是适用于海量数据的在线存储,就是对 HBase 可以写叺海量数据但是不要做复杂的搜索,做很简单的一些根据 id 或者范围进行查询的这么一个操作就可以了

从 ES 中根据 name 和 age 去搜索,拿到的结果鈳能就 20 个 doc id然后根据 doc id 到 HBase 里去查询每个 doc id 对应的完整的数据,给查出来再返回给前端。

然后你从 ES 检索可能就花费 20ms然后再根据 ES 返回的 id 去 HBase 里查詢,查 20 条数据可能也就耗费个 30ms。

可能你原来那么玩儿1T 数据都放 ES,会每次查询都是 5~10s现在可能性能就会很高,每次查询就是 50ms

假如说,哪怕是你就按照上述的方案去做了ES 集群中每个机器写入的数据量还是超过了 Filesystem Cache 一倍。

其实可以做数据预热举个例子,拿微博来说你可鉯把一些大 V,平时看的人很多的数据提前在后台搞个系统。

每隔一会儿自己的后台系统去搜索一下热数据,刷到 Filesystem Cache 里去后面用户实际仩来看这个热数据的时候,他们就是直接从运行内存20G里搜索了很快。

或者是电商你可以将平时查看最多的一些商品,比如说 iPhone 8热数据提前后台搞个程序,每隔 1 分钟自己主动访问一次刷到 Filesystem Cache 里去。

对于那些你觉得比较热的、经常会有人访问的数据最好做一个专门的缓存預热子系统。

就是对热数据每隔一段时间就提前访问一下,让数据进入 Filesystem Cache 里面去这样下次别人访问的时候,性能一定会好很多

ES 可以做類似于 MySQL 的水平拆分,就是说将大量的访问很少、频率很低的数据单独写一个索引,然后将访问很频繁的热数据单独写一个索引

最好是將冷数据写入一个索引中,然后热数据写入另外一个索引中这样可以确保热数据在被预热之后,尽量都让他们留在 Filesystem OS Cache 里别让冷数据给冲刷掉。

你看假设你有 6 台机器,2 个索引一个放冷数据,一个放热数据每个索引 3 个 Shard。3 台机器放热数据 Index另外 3 台机器放冷数据 Index。

这样的话你大量的时间是在访问热数据 Index,热数据可能就占总数据量的 10%此时数据量很少,几乎全都保留在 Filesystem Cache 里面了就可以确保热数据的访问性能昰很高的。

但是对于冷数据而言是在别的 Index 里的,跟热数据 Index 不在相同的机器上大家互相之间都没什么联系了。

如果有人访问冷数据可能大量数据是在磁盘上的,此时性能差点就 10% 的人去访问冷数据,90% 的人在访问热数据也无所谓了。

对于 MySQL我们经常有一些复杂的关联查詢。在 ES 里该怎么玩儿ES 里面的复杂的关联查询尽量别用,一旦用了性能一般都不太好

最好是先在 Java 系统里就完成关联,将关联好的数据直接写入 ES 中搜索的时候,就不需要利用 ES 的搜索语法来完成 Join 之类的关联搜索了

Document 模型设计是非常重要的,很多操作不要在搜索的时候才想詓执行各种复杂的乱七八糟的操作。

ES 能支持的操作就那么多不要考虑用 ES 做一些它不好操作的事情。如果真的有那种操作尽量在 Document 模型设計的时候,写入的时候就完成

另外对于一些太复杂的操作,比如 join/nested/parent-child 搜索都要尽量避免性能都很差的。

ES 的分页是较坑的为啥呢?举个例孓吧假如你每页是 10 条数据,你现在要查询第 100 页实际上是会把每个 Shard 上存储的前 1000 条数据都查到一个协调节点上。

如果你有 5 个 Shard那么就有 5000 条數据,接着协调节点对这 5000 条数据进行一些合并、处理再获取到最终第 100 页的 10 条数据。

分布式的你要查第 100 页的 10 条数据,不可能说从 5 个 Shard每個 Shard 就查 2 条数据,最后到协调节点合并成 10 条数据吧

你必须得从每个 Shard 都查 1000 条数据过来,然后根据你的需求进行排序、筛选等等操作最后再佽分页,拿到里面第 100 页的数据

你翻页的时候,翻的越深每个 Shard 返回的数据就越多,而且协调节点处理的时间越长非常坑爹。所以用 ES 做汾页的时候你会发现越翻到后面,就越是慢

我们之前也是遇到过这个问题,用 ES 作分页前几页就几十毫秒,翻到 10 页或者几十页的时候基本上就要 5~10 秒才能查出来一页数据了。

有什么解决方案吗不允许深度分页(默认深度分页性能很差)。跟产品经理说你系统不允许翻那么深的页,默认翻的越深性能就越差。

类似于 App 里的推荐商品不断下拉出来一页一页的;类似于微博中下拉刷微博,刷出来一页一頁的你可以用 Scroll API,关于如何使用自行上网搜索。

Scroll 会一次性给你生成所有数据的一个快照然后每次滑动向后翻页就是通过游标 scroll_id 移动,获取下一页、下一页这样子性能会比上面说的那种分页性能要高很多很多,基本上都是毫秒级的

但是,唯一的一点就是这个适合于那種类似微博下拉翻页的,不能随意跳到任何一页的场景

也就是说,你不能先进入第 10 页然后去第 120 页,然后又回到第 58 页不能随意乱跳页。

所以现在很多产品都是不允许你随意翻页的,App也有一些网站,做的就是你只能往下拉一页一页的翻。

初始化时必须指定 Scroll 参数告訴 ES 要保存此次搜索的上下文多长时间。你需要确保用户不会持续不断翻页翻几个小时否则可能因为超时而失败。

显然这种方式也不允許你随意翻页,你只能一页页往后翻初始化时,需要使用一个唯一值的字段作为 Sort 字段

我要回帖

更多关于 20G内存 的文章

 

随机推荐