`

Elasticsearch-索引优化

阅读更多

Elasticsearch-索引优化

 

 

 

ES索引优化篇主要从两个方面解决问题,
一是索引数据过程;
二是检索过程。(本文主要介绍)
索引数据过程我在上面几篇文章中有提到怎么创建索引和导入数据,但是大家可能会遇到索引数据比较慢的过程。其实明白索引的原理就可以有针对性的进行优化。ES索引的过程到相对Lucene的索引过程多了分布式数据的扩展,而这ES主要是用tranlog进行各节点之间的数据平衡。所以从上我可以通过索引的settings进行第一优化:
“index.translog.flush_threshold_ops”: “100000″
“index.refresh_interval”: “-1″,
这两个参数第一是到tranlog数据达到多少条进行平衡,默认为5000,而这个过程相对而言是比较浪费时间和资源的。所以我们可以将这个值调大一些还是设为-1关闭,进而手动进行tranlog平衡。第二参数是刷新频率,默认为120s是指索引在生命周期内定时刷新,一但有数据进来能refresh像lucene里面commit,我们知道当数据addDoucment会,还不能检索到要commit之后才能行数据的检索所以可以将其关闭,在最初索引完后手动refresh一之,然后将索引setting里面的index.refresh_interval参数按需求进行修改,从而可以提高索引过程效率。
另外的知道ES索引过程中如果有副本存在,数据也会马上同步到副本中去。我个人建议在索引过程中将副本数设为0,待索引完成后将副本数按需量改回来,这样也可以提高索引效率。
“number_of_replicas”: 0
上面聊了一次索引过程的优化之后,我们再来聊一下检索速度比较慢的问题,其实检索速度快度与索引质量有很大的关系。而索引质量的好坏与很多因素有关。
一、分片数
分片数,与检索速度非常相关的的指标,如果分片数过少或过多都会导致检索比较慢。分片数过多会导致检索时打开比较多的文件别外也会导致多台服务器之间通讯。而分片数过少为导至单个分片索引过大,所以检索速度慢。
在确定分片数之前需要进行单服务单索引单分片的测试。比如我之前在IBM-3650的机器上,创建一个索引,该索引只有一个分片,分别在不同数据量的情况下进行检索速度测试。最后测出单个分片的内容为20G。
所以索引分片数=数据总量/单分片数
目前,我们数据量为4亿多条,索引大小为近1.5T左右。因为是文档数据所以单数据都中8K以前。现在检索速度保证在100ms 以下。特别情况在500ms以下,做200,400,800,1000,1000+用户长时间并发测试时最坏在750ms以下.
二、副本数
副本数与索引的稳定性有比较大的关系,怎么说,如果ES在非正常挂了,经常会导致分片丢失,为了保证这些数据的完整性,可以通过副本来解决这个问题。建议在建完索引后在执行Optimize后,马上将副本数调整过来。
大家经常有一个误去副本越多,检索越快,这是不对的,副本对于检索速度其它是减无增的我曾做过实现,随副本数的增加检索速度会有微量的下降,所以大家在设置副本数时,需要找一个平衡值。另外设置副本后,大家有可能会出现两次相同检索,出现出现不同值的情况,这里可能是由于tranlog没有平衡、或是分片路由的问题,可以通过?preference=_primary 让检索在主片分上进行。
三、分词
其实分词对于索引的影响可大可小,看自己把握。大家越许认为词库的越多,分词效果越好,索引质量越好,其实不然。分词有很多算法,大部分基于词表进行分词。也就是说词表的大小决定索引大小。所以分词与索引膨涨率有直接链接。词表不应很多,而对文档相关特征性较强的即可。比如论文的数据进行建索引,分词的词表与论文的特征越相似,词表数量越小,在保证查全查准的情况下,索引的大小可以减少很多。索引大小减少了,那么检索速度也就提高了。
四、索引段
索引段即lucene中的segments概念,我们知道ES索引过程中会refresh和tranlog也就是说我们在索引过程中segments number不至一个。而segments number与检索是有直接联系的,segments number越多检索越慢,而将segments numbers 有可能的情况下保证为1这将可以提到将近一半的检索速度。
$ curl -XPOST ‘http://localhost:9200/twitter/_optimize? max_num_segments =1′
五、删除文档
删除文档在Lucene中删除文档,数据不会马上进行硬盘上除去,而进在lucene索引中产生一个.del的文件,而在检索过程中这部分数据也会参与检索,lucene在检索过程会判断是否删除了,如果删除了在过滤掉。这样也会降低检索效率。所以可以执行清除删除文档。
$ curl -XPOST ‘http://localhost:9200/twitter/_optimize? only_expunge_deletes =true
参考文献:http://www.cnblogs.com/MrHiFiy/archive/2012/12/06/2806228.html

 

 

内存和打开的文件数

如果你的elasticsearch运行在专用服务器上,经验值是分配一半内存给elasticsearch。另一半用于系统缓存,这东西也很重要的。

你可以通过修改ES_HEAP_SIZE环境变量来改变这个设定。在启动elasticsearch之前把这个变量改到你的预期值。另一个选择上球该elasticsearch的ES_JAVA_OPTS变量,这个变量时在启动脚本(elasticsearch.in.sh或elasticsearch.bat)里传递的。你必须找到-Xms和-Xmx参数,他们是分配给进程的最小和最大内存。建议设置成相同大小。嗯,ES_HEAP_SIZE其实就是干的这个作用。

你必须确认文件描述符限制对你的elasticsearch足够大,建议值是32000到64000之间。关于这个限制的设置,另有教程可以参见。

目录数

一个可选的做法是把所有日志存在一个索引里,然后用ttl field来确保就日志被删除掉了。不过当你日志量够大的时候,这可能就是一个问题了,因为用TTL会增加开销,优化这个巨大且唯一的索引需要太长的时间,而且这些操作都是资源密集型的。

建议的办法是基于时间做目录。比如,目录名可以是YYYY-MM-DD的时间格式。时间间隔完全取决于你打算保留多久日志。如果你要保留一周,那一天一个目录就很不错。如果你要保留一年,那一个月一个目录可能更好点。目录不要太多,因为全文搜索的时候开销相应的也会变大。

如果你选择了根据时间存储你的目录,你也可以缩小你的搜索范围到相关的目录上。比如,如果你的大多数搜索都是关于最近的日志的,那么你可以在自己的界面上提供一个”快速搜索”的选项只检索最近的目录。

轮转和优化

移除旧日志在有基于时间的目录后变得异常简单:

$ curl -XDELETE 'http://localhost:9200/old-index-name/'

这个操作的速度非常快,和删除大小差不多的少量文件速度接近。你可以放进crontab里半夜来做。

Optimizing indices是在非高峰时间可以做的一件很不错的事情。因为它可以提高你的搜索速度。尤其是在你是基于时间做目录的情况下,更建议去做了。因为除了当前的目录外,其他都不会再改,你只需要对这些旧目录优化一次就一劳永逸了。

$ curl -XPOST 'http://localhost:9200/old-index-name/_optimize'

分片和复制

通过elasticsearch.yml或者使用REST API,你可以给每个目录配置自己的设定。具体细节参见链接

有趣的是分片和复制的数量。默认情况下,每个目录都被分割成5个分片。如果集群中有一个以上节点存在,每个分片会有一个复制。也就是说每个目录有一共10个分片。当往集群里添加新节点的时候,分片会自动均衡。所以如果你有一个默认目录和11台服务器在集群里的时候,其中一台会不存储任何数据。

每个分片都是一个Lucene索引,所以分片越小,elasticsearch能放进分片新数据越少。如果你把目录分割成更多的分片,插入速度更快。请注意如果你用的是基于时间的目录,你只在当前目录里插入日志,其他旧目录是不会被改变的。

太多的分片带来一定的困难——在空间使用率和搜索时间方面。所以你要找到一个平衡点,你的插入量、搜索频率和使用的硬件条件。

另一方面,复制帮助你的集群在部分节点宕机的时候依然可以运行。复制越多,必须在线运行的节点数就可以越小。复制在搜索的时候也有用——更多的复制带来更快的搜索,同时却增加创建索引的时间。因为对猪分片的修改,需要传递到更多的复制。

映射_source和_all

Mappings定义了你的文档如何被索引和存储。你可以,比如说,定义每个字段的类型——比如你的syslog里,消息肯定是字符串,严重性可以是整数。怎么定义映射参见链接

映射有着合理的默认值,字段的类型会在新目录的第一条文档插入的时候被自动的检测出来。不过你或许会想自己来调控这点。比如,可能新目录的第一条记录的message字段里只有一个数字,于是被检测为长整型。当接下来99%的日志里肯定都是字符串型的,这样Elasticsearch就没法索引他们,只会记录一个错误日志说字段类型不对。这时候就需要显式的手动映射”message” : {“type” : “string”}。如何注册一个特殊的映射详见链接

当你使用基于时间的目录名时,在配置文件里创建索引模板可能更适合一点。详见链接。除去你的映射,你海可以定义其他目录属性,比如分片数等等。

在映射中,你可以选择压缩文档的_source。这实际上就是整行日志——所以开启压缩可以减小索引大小,而且依赖你的设定,提高性能。经验值是当你被内存大小和磁盘速度限制的时候,压缩源文件可以明显提高速度,相反的,如果受限的是CPU计算能力就不行了。更多关于source字段的细节详见链接

默认情况下,除了给你所有的字段分别创建索引,elasticsearch还会把他们一起放进一个叫_all的新字段里做索引。好处是你可以在_all里搜索那些你不在乎在哪个字段找到的东西。另一面是在创建索引和增大索引大小的时候会使用额外更多的CPU。所以如果你不用这个特性的话,关掉它。即使你用,最好也考虑一下定义清楚限定哪些字段包含进_all里。详见链接

刷新间隔

在文档被索引后,Elasticsearch某种意义上是近乎实时的。在你搜索查找文档之前,索引必须被刷新。默认情况下,目录是每秒钟自动异步刷新的。

刷新是一个非常昂贵的操作,所以如果你稍微增大一些这个值,你会看到非常明显提高的插入速率。具体增大多少取决于你的用户可以接受到什么程度。

你可以在你的index template里保存期望的刷新间隔值。或者保存在elasticsearch.yml配置文件里,或者通过(REST API)[http://www.elasticsearch.org/guide/reference/api/admin-indices-update-settings.html]升级索引设定。

另一个处理办法是禁用掉自动刷新,办法是设为-1。然后用REST API手动的刷新。当你要一口气插入海量日志的时候非常有效。不过通常情况下,你一般会采用的就是两个办法:在每次bulk插入后刷新或者在每次搜索前刷新。这都会推迟他们自己本身的操作响应。

Thrift

通常时,REST接口是通过HTTP协议的,不过你可以用更快的Thrift替代它。你需要安装transport-thrift plugin同时保证客户端支持这点。比如,如果你用的是pyes Python client,只需要把连接端口从默认支持HTTP的9200改到默认支持Thrift的9500就好了。

异步复制

通常,一个索引操作会在所有分片(包括复制的)都完成对文档的索引后才返回。你可以通过index API设置复制为异步的来让复制操作在后台运行。你可以直接使用这个API,也可以使用现成的客户端(比如pyes或者rsyslog的omelasticsearch),都会支持这个。

用过滤器替代请求

通常,当你搜索日志的时候,你感兴趣的是通过时间序列做排序而不是评分。这种使用场景下评分是很无关紧要的功能。所以用过滤器来查找日志比用请求更适宜。因为过滤器里不会执行评分而且可以被自动缓存。两者的更多细节参见链接

批量索引

建议使用bulk API来创建索引它比你一次给一条日志创建一次索引快多了。

主要要考虑两个事情:

  • 最佳的批量大小。它取决于很多你的设定。如果要说起始值的话,可以参考一下pyes里的默认值,即400。
  • 给批量操作设定时器。如果你添加日志到缓冲,然后等待它的大小触发限制以启动批量插入,千万确定还要有一个超时限制作为大小限制的补充。否则,如果你的日志量不大的话,你可能看到从日志发布到出现在elasticsearch里有一个巨大的延时。
分享到:
评论
1 楼 deng.zz 2017-08-20  
数据量为4亿多条,索引大小为近1.5T左右,请问你的节点数量大概是多少?

相关推荐

    elasticsearch-analysis-pinyin-7.4.0 es拼音分词器7.4.0

    因此,理解并合理利用Elasticsearch的索引策略、分片和副本设置,以及查询优化技术,对于提升整体性能至关重要。 总的来说,elasticsearch-analysis-pinyin-7.4.0为Elasticsearch带来了强大的中文拼音分词功能,极...

    Elasticsearch-head谷歌插件谷歌插件.zip

    "es-head"是Elasticsearch-head的简写,它允许用户无需编写复杂的curl命令就能与Elasticsearch进行交互。通过这个插件,你可以查看索引的状态,监控节点健康状况,查看集群统计信息,甚至进行索引的创建、删除和映射...

    elasticsearch-analysis-ik-7.10.0.zip下载

    总的来说,"elasticsearch-analysis-ik-7.10.0.zip"是Elasticsearch 7.10.0版的一个关键组件,它提升了系统处理中文文本的能力,通过优化的分词算法,使得搜索和分析中文内容变得更加准确和高效。对于那些处理大量...

    elasticsearch-HQ-master.zip

    总之,"elasticsearch-HQ-master.zip"提供的插件是Elasticsearch用户的重要工具,特别是对那些希望优化和管理大型集群的人来说。通过其丰富的功能,你可以便捷地完成日常的运维任务,同时也能更好地理解和调试你的...

    elasticsearch-hadoop-8.8.0

    Elasticsearch有自己的RESTful API,用于索引、搜索、分析和管理数据。通过Elasticsearch-Hadoop,用户可以在Hadoop环境中使用这些API,实现对Elasticsearch集群的操作。 Elasticsearch-Hadoop的主要功能包括: - ...

    elasticsearch-jdbc-2.3.3.0-dist.zip

    2. **启动数据流**: 启动JDBC River后,Elasticsearch会定期或实时地从MySQL中读取数据,并将其索引到指定的Elasticsearch索引中。用户可以根据需求设置同步频率,例如定时任务或实时监听。 3. **数据映射与转换**:...

    elasticsearch-analysis-ik-7.10.2.zip

    另外,对Elasticsearch集群的硬件配置、索引结构、搜索策略等进行优化,也能显著提升搜索性能。 总结,elasticsearch-analysis-ik-7.10.2是Elasticsearch在处理中文数据时的强大工具,它提供了灵活的分词策略,有效...

    elasticsearch-jieba-plugin 8.8.2.zip

    `elasticsearch-jieba-plugin`正是将jieba分词库与Elasticsearch进行了深度融合,使得ES在处理中文文本时能展现出卓越的性能。 安装此插件的过程简单明了。首先,下载`elasticsearch-jieba-plugin 8.8.2.zip`压缩包...

    elasticsearch-head 可视化界面

    1. **集群状态**:Elasticsearch-Head可以清晰地展示集群的健康状况,包括节点数量、索引数量、文档总数等关键指标。 2. **索引管理**:用户可以通过界面创建、删除索引,查看索引的设置,如映射、设置和段信息。 ...

    elasticsearch-analysis-ik 7.10.0 分词器

    4. **实时优化**:可以实时监测索引状态,根据索引数据自动优化分词效果。 5. **插件化设计**:方便与其他 Elasticsearch 插件配合使用,如拼音插件、同义词插件等。 **安装与使用** 安装 Elasticsearch-analysis-...

    最新版 elasticsearch-analysis-ik-7.9.3.zip

    最新版的`elasticsearch-analysis-ik-7.9.3.zip`正是针对Elasticsearch 7.9.3版本定制的中文分词插件,旨在优化中文文本的检索和分析性能。 `elasticsearch-analysis-ik`插件的核心功能是提供中文分词服务,它基于...

    elasticsearch-analysis-ik-7.16.2.zip

    版本7.16.2是针对Elasticsearch 7.16.2的优化版本,能够与该版本的Elasticsearch无缝集成。IK分词器具有丰富的自定义规则配置,支持热更新,以及对新词汇的自动学习,使得它在应对各种复杂应用场景时表现出色。 **...

    elasticsearch-head.tar.gz

    **Elasticsearch-head 插件详解** Elasticsearch(简称ES)是一款强大的开源搜索引擎,它基于Lucene构建,提供分布式、...通过安装和使用elasticsearch-head,你可以更高效地管理和优化你的ES环境,提升工作效率。

    elasticsearch-analysis-ik-7.3.2.zip

    此版本针对Elasticsearch 7.3.2进行了优化和适配,旨在提供更高效、更准确的中文分词服务。IK分词器以其灵活的配置和强大的分词能力,在开源社区中享有很高的评价。 IK分词器的核心特性包括: 1. **智能词库管理**...

    elasticsearch-analysis-ik-7.7.0

    Elasticsearch 分析插件 `elasticsearch-analysis-ik` 是一个专门为 Elasticsearch 设计的中文分词器,其7.7.0版本是针对 Elasticsearch 7.7.0 版本优化的。这个插件的主要作用在于对中文文本进行智能分析,将其拆分...

    elasticsearch-6.8.0+elasticsearch-analysis-ik-6.8.0 .zip

    在6.8.0版本中,Elasticsearch 提供了强大的索引管理和查询功能,支持多种数据类型,如文本、数值、日期等。此版本对性能进行了优化,增强了稳定性,并修复了一些已知问题。它还支持多租户,允许在一个集群中管理多...

    elasticsearch-analysis-ik-7.6.1.zip

    Elasticsearch(ES)是一个基于Lucene的分布式、RESTful搜索引擎,广泛应用于大数据分析、日志收集和全文检索等领域。它的核心功能包括索引、搜索、分析和聚合,但默认情况下对中文的支持并不完善,因此需要借助像IK...

    最新版 elasticsearch-analysis-ik-7.6.2.zip

    "elasticsearch-analysis-ik-7.6.2.zip" 是针对Elasticsearch 7.6.2版本的一个专门用于中文分词的插件,其目的是优化对中文文本的索引和查询性能。 IK分析器是Elasticsearch社区中非常流行的一个中文分词插件,由...

    elasticsearch-7.17.3

    Elasticsearch 7.17.3 是一个高度可扩展的开源全文搜索引擎,以其强大的分布式、实时搜索和分析...了解如何优化索引和查询性能,如合理设置分片数量、使用合适的数据类型和分析器,也是提升Elasticsearch性能的关键。

    elasticsearch-head插件

    这款插件设计简洁,易于使用,可以帮助用户更好地理解、调试和优化Elasticsearch集群。 **一、安装Elasticsearch-Head** 1. **获取源代码** 首先,你需要从GitHub仓库下载elasticsearch-head的源代码。在本例中,...

Global site tag (gtag.js) - Google Analytics