ElasticSearch优化系列三:索引过程

大家可能会遇到索引数据比较慢的过程。其实明白索引的原理就可以有针对性的进行优化。ES索引的过程到相对Lucene的索引过程多了分布式数据的扩展,而这ES主要是用tranlog进行各节点之间的数据平衡。所以从上我可以通过索引的settings进行第一优化:

"index.translog.flush_threshold_ops":"10000" "refresh_interval" : "1s"

这两个参数第一是到translog数据达到多少条进行平衡,默认为5000,而这个过程相对而言是比较浪费时间和资源的。所以我们可以将这个值调大一些还是设为-1关闭,进而手动进行translog平衡。第二参数是刷新频率,默认为1s是指索引在生命周期内定时刷新,一但有数据进来能refresh像lucene里面commit,我们知道当数据addDoucment后,还不能检索到要commit之后才能行数据的检索,所以可以将其关闭,在最初索引完后手动refresh之,然后将索引setting里面的index.refresh_interval参数按需求进行修改,从而可以提高索引过程效率。

另外的知道ES索引过程中如果有副本存在,数据也会马上同步到副本中去。我个人建议在索引过程中将副本数设为0,待索引完成后将副本数按需量改回来,这样也可以提高索引效率。

“number_of_replicas”: 0

其实检索速度快度与索引质量有很大的关系。而索引质量的好坏主要与以下几方面有关:

分片数

分片数是与检索速度非常相关的的指标,如果分片数过少或过多都会导致检索比较慢。分片数过多会导致检索时打开比较多的文件别外也会导致多台服务器之间通讯。而分片数过少会导致单个分片索引过大,所以检索速度慢。基于索引分片数=数据总量/单分片数的计算公式,在确定分片数之前需要进行单服务单索引单分片的测试,目前我们测试的结果单个分片的内容为10G。

分片(Shard):一个索引会分成多个分片存储,分片数量在索引建立后不可更改,推荐【分片数*副本数=集群数量】

确定分片的数量和副本的数量

ElasticSearch在创建索引数据时,最好指定相关的shards数量和replicas, 否则会使用服务器中的默认配置参数shards=5,replicas=1。

因为这两个属性的设置直接影响集群中索引和搜索操作的执行。假设你有足够的机器来持有碎片和副本,那么可以按如下规则设置这两个值:

1) 拥有更多的碎片可以提升索引执行能力,并允许通过机器分发一个大型的索引;

2) 拥有更多的副本能够提升搜索执行能力以及集群能力。

对于一个索引来说,number_of_shards只能设置一次,而number_of_replicas可以使用索引更新设置API在任何时候被增加或者减少。

这两个配置参数在配置文件的配置如下:

index.number_of_shards: 5 number_of_replicas: 1

Elastic官方文档建议:一个Node中一个索引最好不要多于三个shards.配置total_shards_per_node参数,限制每个index每个节点最多分配多少个发片.

http://www.open-open.com/doc/view/f240d61f8f7745098b4459c2483feb40

http://wenku.baidu.com/linkurl=bwD9mpebmQ28mqPj6Z0P1_A9bgFKnhIss8UrRA_Nsv7oTFuUEa9JgUdr9ynKc8OjWvd0pVLsp3tYZTFaNcxVt30EyFBCvkNflFGjMWcqsRq

副本数

副本数与索引的稳定性有比较大的关系,如果Node在非正常挂了,经常会导致分片丢失,为了保证这些数据的完整性,可以通过副本来解决这个问题。建议在建完索引后在执行Optimize后,马上将副本数调整过来。

分词

分词对于索引的影响可大可小,看自己把握。大家或许认为词库越多,分词效果越好,索引质量越好,其实不然。分词有很多算法,大部分基于词表进行分词。也就是说词表的大小决定索引大小。所以分词与索引膨涨率有直接关系。词表不应很多,而对文档相关特征性较强的即可。比如论文的数据进行建索引,分词的词表与论文的特征越相似,词表数量越小,在保证查全查准的情况下,索引的大小可以减少很多。索引大小减少了,那么检索速度也就提高了。

索引段

索引段即lucene中的segments概念,我们知道ES索引过程中会refresh和tranlog也就是说我们在索引过程中segments number不只一个。而segments number与检索是有直接联系的,segments number越多检索越慢,而将segments numbers 有可能的情况下保证为1,这将可以提高将近一半的检索速度。

https://www.elastic.co/guide/en/elasticsearch/guide/current/hardware.html

原文发布于微信公众号 - 人工智能LeadAI(atleadai)

原文发表时间:2017-11-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

SQLite vs MySQL vs PostgreSQL:关系型数据库比较

自1970年埃德加·科德提出关系模型之后,关系型数据库便开始出现,经过了40多年的演化,如今的关系型数据库种类繁多,功能强大,使用广泛。面对如此之多的关系型数据...

2285
来自专栏数据和云

2015 OOW:Oracle的Sharding技术

在2015年OOW大会,国内很多小伙伴们一直非常关心Oracle Database 12.2中的Sharding技术实现,可是要知道在Larry Ellison...

2864
来自专栏杨建荣的学习笔记

shell脚本自动化采集性能sql(r2笔记39天)

通过v$sql_monitor能够实时采集可能存在的sql性能问题,但是每次问题发生的时候采取采取措施就有点“晚”了,我们需要防患于未然,把一些潜在问题提前发现...

2514
来自专栏杨建荣的学习笔记

物化视图自动刷新的碰壁(r7笔记第61天)

今天和开发的同事讨论一个问题,他们说source 1的环境中存在一个表,现在希望目标环境target 1和target 2中都需要用到这部分的数据。 ? 对...

3574

所有您需要了解的关于Elasticsearch 5.0:索引管理

我们看到两种主要的Elasticsearch索引使用模式 - 全局索引和滚动索引。多年来,Elasticsearch增加了一些功能,可以极大地改善这些模式的工作...

3813
来自专栏CDA数据分析师

【干货】大数据量下,58同城mysql实践!

WOT(World Of Tech)2015,互联网运维与开发者大会将在北京举行,会上58同城将分享《大数据量下,58同城mysql实战》的主题,干货分享抢先看...

2479
来自专栏Keegan小钢

App项目实战之路(六):数据库篇

上一篇文章[服务端篇]提到本项目的数据库采用了关系型的 MySQL,那么,本文将基于 MySQL 聊聊本项目的数据库设计。

1243
来自专栏数据和云

SQL之美 - Oracle 子查询优化系列精讲

题记:SQL优化及SQL审核,是从源头解决性能问题的根本手段,无论是开发人员还是DBA,都应当持续深入的学习SQL开发技能,从而为解决性能问题打下根基。 本系列...

3313
来自专栏java架构技术

从大神的角度深入理解MySQL,值得收藏~

在此我向大家推荐一个架构学习交流群。程序员面试社区:236283328 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分...

1141
来自专栏企鹅号快讯

Django数据从sqlite迁移数据到MySQL

昨天快速搭建了一套自己的知识库 感觉一下子有了很多的事情要做,至少得让自己用得舒服些。 没想到有了这个小工具之后,我发现我之前过得真是刀耕火种的信息收集。为什么...

4126

扫码关注云+社区