分库代价高的情况下,如何优化ES解决亿级数据量检索

  • 时间:
  • 浏览:1

数据能跨月查询,否则 支持1年以上的历史数据查询与导出;

关于DocValues

在许多人许多人许多人 的案例中,查询字段完整性都是固定的,不提供全文检索功能,这也是几十亿数据能秒级返回的另另一一三个小 大前提:

检索帕累托图含晒 查询解析器等。

Node:集群服务单元;

Lucene随机三次磁盘读取比较耗时。其中.fdt文件保存数据值损耗空间大,.tim和.doc则还要SSD存储提高随机读写性能。

四、性能测试

对于ES的性能研究花了不少时间,最多的关注点否则 Lucene的优化,能深入了解Lucene原理对优化有很大的帮助。

三、优化案例

1、ES和Lucene基础行态

Solr docs对此的解释如下:

倒排索引处置从词快速检索到相应文档ID, 但意味着着着还要对结果进行排序、分组、聚合等操作的很久,则还要根据文档ID快速找到对应的值。

4)内存分配方面,什么都文章意味着着着提到,给系统1000%的内存给Lucene做文件缓存,它任务很繁重,什么都ES节点的内存还要比较多(比如每个节点能配置64G以上最好)。

5)磁盘方面配置SSD,机械盘做阵列RAID5 RAID10真是看上去更快,否则 随机IO还是SSD好。

Cluster:含晒 多个Node的集群;

http://lucene.apache.org/core/7_4_0/core/org/apache/lucene/index/PointValues.html

在lucene 4.0版本前通过FieldCache,原理是通过按列逆转倒排表将(field value ->doc)映射变成(doc -> field value)映射,问题图片为逐步构建时间长否则 消耗少量内存,容易造成OOM。

索引帕累托图含晒 分词器、过滤器、字符映射器等;

index.max_result_window : 100000

search_after:

按条件的数据查询秒级返回。

For other features that we now commonly associate with search, such as sorting, faceting, and highlighting, this approach is not very efficient. The faceting engine, for example, must look up each term that appears in each document that will make up the result set and pull the document IDs in order to build the facet list. In Solr, this is maintained in memory, and can be slow to load (depending on the number of documents, terms, etc.)

原文发布时间为:2019-1-4

本文作者: mikevictor

本文来自云栖社区商务战略合作伙伴“ DBAplus社群”,了解相关信息能必须关注“dbaplus”微信公众号

使用前另另一一三个小 分页记录的最后十根来检索下另另一一三个小 分页记录,在许多人许多人许多人 的案例中,首先使用from+size,检索出结果后再使用search_after,在页面上许多人许多人许多人 限制了用户必须跳5页,必须跳到最后一页。

在一业务系统中,帕累托图表每天的数据量过亿,已按天分表,但业务上受限于按天查询,否则 DB中必须保留5个月的数据(硬件高配),分库代价较高。

6)关于排序:许多人许多人许多人 增加另另一一三个小 long字段,它用于存储时间和ID的组合(通过移位即可),正排与倒排性能相差不明显。

2、优化检索性能

许多基本概念:

DocValues是并与非 列存储行态,能快速通过文档ID找到相关还要排序的字段。在ES中,默认开启所有(除了标记需analyzed的字符串字段)字段的doc values,意味着着着不还要对此字段做任何排序等工作,则可关闭以减少资源消耗。

https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.html

3)增加segments的刷新时间,通过上方的原理可知道,segment作为另另一一三个小 最小的检索单元,比如segment有1000个,目的还要查10条数据,但还要从1000个segment。

二、ElasticSearch检索原理

另外SSD与机械盘在测试中性能差距怎样。

Type:另另一一三个小 Index的不同分类,6.x后必须配置另另一一三个小 type,很久将移除;

1)关闭不还要字段的doc values。

通过倒排索引代价缺很高:需迭代索引里的每个词项,并分发文档的列上方 token。这很快否则 难以扩展,意味着着着随着词项和文档的数量增加,执行时间也会增加。

7)关于段合并,合并在后台定期执行,比较大的segment还要很长时间过多再 完成,为了减少对许多操作的影响(如检索),ElasticSearch进行阈值限制,默认是20MB/s。

4)评分消耗资源,意味着着着不还要可使用filter过滤来达到关闭评分功能,score则为0,意味着着着使用constantScoreQuery则score为1。

项目背景:

6)使用自动生成的ID,在许多人许多人许多人 的案例中使用自定义的KEY,也否则 与HBase的ROW KEY,是为了能根据rowkey删除和更新数据,性能下降完整性都是很明显。

3)关闭不还要查询字段的_source功能,不将此存储仅ES中,以节省磁盘空间。

8)关于合并被标记删除的记录,许多人许多人许多人 设置为0,表示在合并的很久一定删除被标记的记录,默认应该是大于10%才删除: "merge.policy.expunge_deletes_allowed": "0"。

单节点5千万到一亿的数据量测试,检查单点承受能力;

ES仅提供字段的检索,仅存储HBase的Rowkey不存储实际数据;

1)批量写入,看每条数据量的大小,一般完整性都是几百到几千。

1、优化索引性能

谈到优化还要要了解组件的基本原理,才容易找到瓶颈所在,以免走多种弯路,先从ES的基础行态说起(如下图):

随机不同组合条件的检索,在各个数据量状态下表现怎样;

数据具体被存储到哪个分片上:

Replicas:分片备份,用于保障数据安全与分担检索压力。

数据平台已迭代另另一一三个小 版本,从一始于遇到什么都常见的问题图片,到现在终于有片段时间分发许多已完善的文档,在此分享以供所需许多人许多人许多人 的实现参考,但愿能帮助许多人许多人许多人 少走些弯路,在此篇幅中偏重于ElasticSearch的优化。

5)关于分页:

3、关于ES索引与检索分片

scroll:

默认状态下routing参数是文档ID(murmurhash3),可通过URL中的_routing参数指定数据分布在同另另一一三个小 分片中,index和search的很久都还要一致过多再 找到数据,意味着着着能明确根据_routing进行数据分区,则可减少分片的检索工作,以提高性能。

一、需求说明

7)关于CPU消耗,检索时意味着着着还要做排序则还要字段对比,消耗CPU比较大,意味着着着有意味着着着尽量分配16cores以上的CPU,具体看业务压力。

另外另另一一三个小 比较消耗性能的是打分流程,不还要则可屏蔽。

许多细节优化项,官方与许多的许多文章完整性都是描述,在此文中仅提出许多本案例的重点优化项。

用于大结果集查询,存在问题是还要维护scroll_id。

from + size:

ES中另另一一三个小 索引由另另一一三个小 或多个Lucene索引构成,另另一一三个小 Lucene索引由另另一一三个小 或多个segment构成,其中segment是最小的检索域。

Lucene索引文件行态主要的分为词典、倒排表、正向文件、DocValues等,如下图:

五、生产效果

合并系统程序数默认是:Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2)),意味着着着是机械磁盘,能必须考虑设置为1:index.merge.scheduler.max_thread_count: 1,在许多人许多人许多人 的案例中使用SSD,配置了6个合并系统程序。

Index:另另一一三个小 ES索引含晒 另另一一三个小 或多个物理分片,它否则 那先 分片的逻辑命名空间;

通过Luke工具查看ES的Lucene文件如下,主要增加了_id和_source字段:

另另一一三个小 Lucene索引含晒 多个segments,另另一一三个小 segment含晒 多个文档,每个文档含晒 多个字段,每个字段经过分词后形成另另一一三个小 或多个term。

分别查询10条,共10000条记录,再进行排序意味着着着分数比较后,截取最前面的10条,丢弃490条。在许多人许多人许多人 的案例中将此 "refresh_interval": "-1" ,系统程序批量写入完成后进行手工刷新(调用相应的API即可)。

改进版本目标:

每分片检索结果数最大为 from + size,假设from =20, size =20,则每个分片还要获取20 20 =1000条数据,多个分片的结果在协调节点合并(假设请求的分配数为5,则结果数最大为10005=10000条) 再在内存中排序后否则 20条给用户。你这个机制意味着着着越往后分页获取的代价越高,达到1000000条将面临沉重的代价,默认from + size默认如下:

2、Lucene索引实现

性能的测试组合有什么都,通常也很花时间,不过作为评测标准时间上的投入有必要,否则 生产出現性能问题图片没人 定位或不好改善。

提高索引与检索的性能建议,可参考官方文档

参考:

分发来源于Lucene官方:

http://lucene.apache.org/core/7_2_1/core/org/apache/lucene/codecs/lucene70/package-summary.html#package.description

集群测试1亿-1000亿的数量,磁盘IO/内存/CPU/网络IO消耗怎样;

在Lucene中,分为索引(录入)与检索(查询)两帕累托图:

优化效果评估基于基准测试,意味着着着必须基准测试就无法了解与非 有性能提升,在这所有的变动前做一次测试会比较好。在许多人许多人许多人 的案例中:

2)尽量使用keyword替代许多long意味着着着int之类的,term查询总比range查询好 。

可配置的参数:"indices.store.throttle.max_bytes_per_sec" : "1000mb" (根据磁盘性能调整);

实际数据存储在HBase中,通过Rowkey查询,如下图:

ES依赖另另一一三个小 重要的组件Lucene,关于数据行态的优化通常来说是对Lucene的优化,它是集群的另另一一三个小 存储于检索工作单元,行态如下图:

目前平台稳定运行,几十亿的数据查询1000条完整性都是3秒内返回,前后翻页更快,意味着着着后续有性能瓶颈,可通过扩展节点分担数据压力。

2)多系统程序写入,写入系统程序数一般和机器数相当,能必须配多种状态,在测试环境通过Kibana观察性能曲线。

Document:最基础的可被索引的数据单元,如另另一一三个小 JSON串;

Shards:另另一一三个小 分片是另另一一三个小 底层的工作单元,它仅保存完整性数据中的一帕累托图,它是另另一一三个小 Lucene实例 (另另一一三个小 Lucene索引最大含晒 2,147,483,519 (= Integer.MAX_VALUE - 128)个文档数量);