ElasticSearch 深度分页详解

2022-11-24 0 961

Bokaro:OSCHINA 街道社区

译者:天猫云开发人员-何守优

书名:my.oschina.net/u/4090830/blog/5593128

1 序言

ElasticSearch 是两个动态的分布式系统搜寻与预测发动机,常见于大批非形式化统计数据的储存和加速索引情景,具备极强的可扩展性。纵然其有众多缺点,在搜寻应用领域远超亲密关系型统计资料库,但仍然存有与亲密关系型统计资料库反之亦然的广度巨集难题,责任编辑迳自难题做两个理论性预测深入探讨

2 from + size 巨集形式

此条 DSL 句子表示从搜寻结论中第 10 条统计数据边线开始,取后的 20 条统计数据做为结论回到。这种巨集形式在 ES 软件产业外部是怎样继续执行的呢?

在 ES 中,搜寻通常主要包括 2 个期,Query 期

2.1 Query 期

示意图右图,Query 期大体分成 3 步:

第二步:Client 推送查阅允诺到 Server 端,Node1 转交到允诺接着建立两个大小不一为 from + size 的错误率堆栈用以放置结论,这时 Node1 被称作 coordinating node(协同结点);

第三步:Node1 将允诺该台到牵涉的 shard 上,每一 shard 外部继续执行搜寻允诺,接着将继续执行结论存到自己外部的大小不一反之亦然为 from+size 的错误率堆栈里;

第三步:每一 shard 将存贮的另一方面错误率堆栈里的结论梅泽堡 Node1,Node1 领到大部份 shard 回到的结论后,对结论进行一场分拆,造成两个自上而下的错误率堆栈,存有 Node1 的错误率堆栈中。(示意图中,Node1 会领到 (from + size) * 6 条统计数据,那些统计数据只包涵 doc 的惟一标记_id 和用作次序的_score,接着 Node1 会对那些统计数据合并次序,选择前 from + size 条统计数据存到错误率堆栈);

2.2 Fetch 期

ElasticSearch 深度分页详解

示意图右图,当 Query 期结束后立马进入 Fetch 期,Fetch 期也分成 3 步:

第二步:Node1 根据刚才分拆后保存有错误率堆栈中的 from+size 条统计数据的 id 集合,推送允诺到对应的 shard 上查阅 doc 统计数据详情;

第三步:各 shard 转交到查阅允诺后,查阅到对应的统计数据详情并回到为 Node1;(Node1 中的错误率堆栈中保存了 from + size 条统计数据的_id,但是在 Fetch 期并不需要取回大部份统计数据,只需要取回从 from 到 from + size 之间的 size 条统计数据详情即可,这 size 条统计数据可能在同两个 shard 也可能在不同的 shard,因此 Node1 使用 multi-get 来提高性能)

统计数据后,回到给 Client;

2.3 ES 示例

依据上述我们对 from + size 巨集形式两期的预测会发现,假如起始边线 from 或者页条数 size 特别大时,对于统计数据查阅和 coordinating node 结论分拆都是巨大的性能损耗。

例如:索引 wms_order_sku 有 1 亿统计数据,分 10 个 shard 储存,当两个允诺的 from = 1000000, size = 10。在 Query 期,每一 shard 就需要回到 1000010 条统计数据的_id 和_score 信息,而 coordinating node 就需要转交 10 * 1000010 条统计数据,拿

预测:这个例子的继续执行过程中,在 Query 期会在每一 shard 上均有巨大的查阅量,回到给 coordinating node 时需要继续执行大批统计数据的次序操作,并且保存到错误率堆栈的统计数据量也很大,占用大批结点机器内存资源。

2.4 实现示例

2.5 小结

其实 ES 对结论窗口的回到统计数据有默认 10000 条的限制(参数:index.max_result_window = 10000),当 from + size 的条数大于 10000 条时 ES 提示可以通过 scroll 形式进行巨集,非常不建议调大结论窗口参数值。

ElasticSearch 深度分页详解

3 Scroll 巨集形式

scroll 巨集形式类似亲密关系型统计资料库中的 cursor(游标),首次查阅时会生成并缓存快照,回到给客户端快照读取的边线参数(scroll_id),后续每次允诺都会通过 scroll_id 访问快照实现加速查阅需要的统计数据,有效降低查阅和储存的性能损耗。

3.1 继续执行过程

3.2 ES 示例

第一场查阅时不需要传入_scroll_id,只要带上 scroll 的过期时间参数(scroll=1m)、每页大小不一(size)以及需要查阅统计数据的自定义条件即可,查阅后不仅会回到结论统计数据,还会回到_scroll_id。

ElasticSearch 深度分页详解

第二次查阅时不需要指定索引,在 JSON 请求体中带上前两个查阅回到的 scroll_id,同时传入 scroll 参数,指定刷新搜寻结论的缓存时间(上一场查阅缓存 1 分钟,本次查阅会再次重置缓存时间为 1 分钟)

ElasticSearch 深度分页详解

3.3 实现示例

ElasticSearch 深度分页详解

3.4 小结

scroll 巨集形式的缺点就是减少了查阅和次序的次数,避免性能损耗。缺点就是只能实现上一页、下一页的翻页功能,不兼容通过页码查阅统计数据的跳页,同时由于其在搜寻初始化期会生成快照,后续统计数据的变化无法及时体现在查阅结论,因此更加适合一场性批量查阅或非动态统计数据的巨集查阅。

启用游标查阅时,需要注意设定期望的过期时间(scroll = 1m),以降低维持游标查阅窗口所需消耗的资源。注意这个过期时间每次查阅都会重置刷新为 1 分钟,表示游标的闲置失效时间(第二次以后的查阅必须带 scroll = 1m 参数才能实现)

4 Search After 巨集形式

Search After 巨集形式是 ES 5 新增的一种巨集查阅形式,其实现的思路同 Scroll 巨集形式基本一致,通过记录上一场巨集的边线标记,来进行下一场巨集统计数据的查阅。相比于 Scroll 巨集形式,它的缺点是可以动态体现统计数据的变化,解决了查阅快照导致的查阅结论延迟难题。

4.1 继续执行过程

Search After 形式也不支持跳页功能,每次查阅一页统计数据。第一场每一 shard 回到一页统计数据(size 条),coordinating nodll 巨集形式,Search After 形式会找到第一页统计数据被拉取的最大值,做为第二页统计数据拉取的查阅条件。

这样每一 shard 还是回到一页统计数据(size 条),coordinating node

后续巨集查阅以此类推…

4.2 ES 示例

第一场查阅只传入次序字段和每页大小不一 size

ElasticSearch 深度分页详解

接下来每次查阅时都带上本次查阅的最后一条统计数据的 _id 和 shipmentOrderCreateTime 字段,循环往复就能够实现不断下一页的功能

ElasticSearch 深度分页详解

4.3 实现示例

ElasticSearch 深度分页详解

4.4 小结

Search After 巨集方式采用记录做为游标,因此 Search After 要求 doc 中至少有一条自上而下惟一变量(示例中使用_id 和时间戳,实际上_id 已经是自上而下惟一)。Search After 形式是无状态的巨集查阅

5 总结思考

5.1 ES 三种巨集形式对比总结

ElasticSearch 深度分页详解

如果统计数据量小(from+size 在 10000 条内),或者只关注结论集的 TopN 统计数据,可以使用 from/size 巨集,简单粗暴

统计数据量大,广度翻页,后台批处理任务(统计数据迁移)之类的任务,使用 scroll 形式

统计数据量大,广度翻页,用户动态、高并发查阅需求,使用 search after 形式

5.2 个人思考

在通常业务查阅页面中,大多情况都是 10-20 条统计数据为一页,10000 条统计数据也就是 500-1000 页。正常情况下,对于用户来说,有极少需求翻到比较靠后的页码来查看统计数据,更多的是通过查阅条件框定一部分统计数据查看其详情。因此在业务需求敲定初期,可以同业务人员商定 1w 条统计数据的限定,超过 1w 条的情况可以借助导出统计数据到 Excel 表,在 Excel 表中做具体的操作。

如果给导出中心回到大批统计数据的情景可以使用 Scroll 或 Search After 巨集形式,相比之下最好使用 Search After 形式,既可以保证统计数据的动态性,也具备很高的搜寻性能。

总之,在使用 ES 时一定要避免广度巨集难题,要在跳页功能实现和 ES 性能、资源之间做两个取舍。必要时也可以调大 max_result_window 参数,原则上不建议这么做,因为 1w 条以内 ES 基本能保持很不错的性能,超过这个范围广度巨集相当耗时、耗资源,因此谨慎选择此形式。

– EOF –

ElasticSearch 深度分页详解

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务