How To

Elasticsearch默认是提供了一个非常简单的即开即用体验。用户无需修改什么配置就可以直接使用全文检索、结果高亮、聚合、索引功能。

但是想在项目中使用高性能的Elasticsearch,有几方面优化方法最好掌握。

本文就是为了引导如何优化。

常规建议

不要一次返回太大量的搜索结果集

Elasticsearch设计作为一个搜索引擎,非常擅长返回匹配的查询结果。但是,它并不合适像数据库一样,把整个document作为查询结果返回。如果非要这样做,最好还是使用Scroll这个接口来。

避免索引稀疏

Elasticsearch是基于Lucene进行索引和存储数据的,最佳的工作方式是密集的数据,即是所有的document拥有相同的字段。特别是启用了norms(通常是text字段是默认开启)或者启用了doc_values(通常是numerics, date, ip 或 keyword 是默认开启)的字段。

原因是Lucene内部是通过由0到索引 document 总数的 doc_id 来识别 document 。doc_id 用于Lucene api内部之间的通讯:例如使用关键词 match 查询得到的doc_id,然后这些doc_id用于检索 norms 的值去计算 score(匹配得分)。这个 norms 查找方式实现目前是通过为每个 document 保留一个字节。doc_id 可以直接读取该 document 的 norms 值。这种方式好处是可以帮助Lucene快速访问每个 document ,缺点是每个 document 还需要额外占多一个字节的存储。

实际上,这就意味着如果一个index里面有M个document,每个字段的norms就需要M个字节的存储,就算某些字段只是包含在小部份 document 。虽然复杂的类型字段存储使用doc_values,但是一样还会占用存储的。众所周知,fielddata 类型在 pre-2.0之后被替换成 doc_values ,除非 fielddata已经写在硬盘上了,在内存里面的话,也是有这个问题。

需要注意的是,稀疏存储会对索引和搜索速度有明显的影响,额外的存储字节虽然不是字段,也是需要花费时间去索引和搜索的。

当然,index是允许存在少数稀疏情况的,但是如果稀疏数量教大,则会影响整个index的效率。

本章节主要集中在 norms 和 doc_values 这两个影响较大的特性。稀疏情况会影响倒排索引(用于索引 text/keyword 字段)和坐标点类型字段(用于索引 geo_point 和 numeric),影响的程度不一样。

下面有几点推荐能避免稀疏:

避免把无关联的数据放在同一个index

不要把完全不同的数据结构 document 放在同一个 index 里面。最好是将这些 document 放到不同的index里面,可以考虑创建一些较小的index, 用较少的shard去存储。

注意,这个建议不适用于有使用 parent/child 这种带关系的 document 放在同一个 index 的情况。

标准化 document 结构

如果必需把不同类型的 document 放在同一个 index里面,也是有机会减少稀疏情况的。例如,在 index 内所有的 document 都添加一个时间戳字段,通常叫"timestamp"或者"creation_date",它将会有助于把所有的 document 重命成相同的字段。

避免不同的 type 放在同一个index

多个 type 放在单个 index 看起来是个简单的方法。但是Elasticsearch并不是基于 type来存储的,不同的 type 在单个 index 也会影响效率。如果 type 没有非常相似的 mapping,建议考虑放到一个单独的 index 上面。

对于不同的字段禁用 norms 和 doc_values

如果以上建议适用,还需要检查字段是否启用了 norms 和 doc_values。通常只用于过滤而不需要进行打分(匹配度打分)的字段,可以直接禁用 norms 。不用于排序或者聚合的字段可以禁用 doc_values 。注意,如果在已有的 index 做这些变更,是需要对 index 做 reindex的动作。

调优索引速度

使用 bulk 请求

Bulk 批量请求比单次 document 索引请求性能更好。为了验证最优批量请求的大小,可以做一个基准测试,用一个单节点跑一个单 shard 。先尝试索引100个document,然后 200, 然后400,等等。每次运行基准测试就相应加倍 document 的数量。取得索引速度最高的数值,就是最佳的bulk批量请求数。当然,批量请求也不是越多 document 越好。如果并发同时请求,太大的 bulk 请求会使集群内存压力变大,所以建议避免每次请次超过几十M,这样会获得较好的性能。

使用多进程/多线程去发送数据到Elasticsearch

一个单线程发送 bulk 请求似乎不能够发挥一个集群的索引能力。为了更好地利用集群的资源,应该使用多线程或多进程来发送数据,同时这将有助于减少每次 fsync 的成本。

一定要留意系统是否返回 TOO_MANY_REQUESTS (429) 代码。(通常Java client返回是EsRejectedExecutionException),这是表示Elasticsearch无法跟上当前的索引速度。发生这种情况时可以暂停一下索引一会再试。尝试更换 bulk 一个随机值或理想值。

对于相同大小的 bulk 请求,通过测试可以得到最优的线程数量。可以逐步增加线程数量直至到集群中的机器IO或CPU饱和。

增加 refresh_interval 刷新的间隔时间

index.refresh_interval的默认值是 1s,这迫使Elasticsearch集群每秒创建一个新的 segment (可以理解为Lucene 的索引文件)。增加这个值,例如30s,可以允许更大的segment写入,减后以后的segment合并压力。

在初始化索引时,可以禁用 refresh 和 replicas 数量

如果需要一次加载较大的数据量进 index 里面时,可以先禁用 refresh ,把 index.refresh_interval 设置成为 -1 ,把 index.number_of_replicas 设置成 0。暂时把多个shard副本关闭(即如果当前index发生损坏便用丢失数据),但是这样做可以大大加快索引速度。当初始化索引完成,可以将 index.refresh_interval 和 index.number_of_replicas 设置回原来的值。

禁用 swapping

把操作系统的虚拟内存交换区关闭。sysctl 里面添加 vm.swappiness = 1

确保有空闲的内存给文件系统缓存

文件系统缓存是为了缓冲磁盘的IO操作。至少确保有一半机器的内存保留给操作系统,而不是JAVA VM占用了全部内存。

使用更快的硬件

当然这个不用说了上SSD是最好的了。如果有多个SSD硬盘,可以配置成 RAID 0阵列取得更佳的IO性能。但是任何一个SSD损坏都有可能弄坏 index。通常正确的权衡是优化单的shard存储性能,然后添加 replicas 放在不同的节点。同时使用 snapshot 快照和 restore 功能去备份 index。

索引 buffer 大小

如果节点在做非常大的索引动作,需要确保 indices.memory.index_buffer_size足够大,最多可以设置为512M的buffer。除此之外增加这个值,性能通常不会得到改善。

Elasticsearch的活跃shard需要使用java的heap内存的百份比或者绝对值去作为一个共享缓冲区。非常活跃的shard自然会使用较频繁。

这个默认值是通常是10%,例如,如果JVM设置为10GB内存为heap,那么就会有1GB的索引缓冲区提供给大量的索引shard。

Elasticsearch 调优 (官方文档How To)的更多相关文章

  1. Elasticsearch官方文档离线访问实操指南

    文章转载自:https://mp.weixin.qq.com/s/Cn9ddkj-cne5pKtfOgNPbg 延申一下,不仅能下载Elasticsearch官方文档,还能下载其他软件的官方文档,详看 ...

  2. Elasticsearch 7.4.0官方文档操作

    官方文档地址 https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html 1.0.0 设置Elasticsea ...

  3. Spark SQL 官方文档-中文翻译

    Spark SQL 官方文档-中文翻译 Spark版本:Spark 1.5.2 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 Data ...

  4. 从官方文档去学习之FreeMarker

    一.前言 上一篇 <从现在开始,试着学会用官方文档去学习一个技术框架>提倡大家多去从官方文档学习技术,没有讲到具体的实践,本篇就拿一个案例具体的说一说,就是FreeMarker,选择这个框 ...

  5. cassandra 3.x官方文档(7)---内部原理之如何读写数据

    写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...

  6. Es官方文档整理-2.分片内部原理

    Es官方文档整理-2.分片内部原理 1.集群      一个运行的Elasticsearch实例被称为一个节点,而集群是有一个或多个拥有相同claster.name配置的节点组成,他们共同承担数据和负 ...

  7. hbase官方文档(转)

    FROM:http://www.just4e.com/hbase.html Apache HBase™ 参考指南  HBase 官方文档中文版 Copyright © 2012 Apache Soft ...

  8. HBase 官方文档

    HBase 官方文档 Copyright © 2010 Apache Software Foundation, 盛大游戏-数据仓库团队-颜开(译) Revision History Revision ...

  9. HBase官方文档

    HBase官方文档 目录 序 1. 入门 1.1. 介绍 1.2. 快速开始 2. Apache HBase (TM)配置 2.1. 基础条件 2.2. HBase 运行模式: 独立和分布式 2.3. ...

  10. HBase 官方文档0.90.4

    HBase 官方文档0.90.4 Copyright © 2010 Apache Software Foundation, 盛大游戏-数据仓库团队-颜开(译) Revision History Rev ...

随机推荐

  1. Web 存储

    Web Storage 介绍 Web storage 是在web上存储数据的功能,这里的存储是针对客户端来说的. 具体说分为两种: seesionStorage 数据存储在 session 对象中.s ...

  2. 从零开始编写自己的C#框架(23)——上传组件使用说明

    文章导航 1.前言 2.上传组件功能说明 3.数据库结构 4.上传配置管理 5.上传组件所使用到的类 6.上传组件调用方法 7.效果演示 8.小结 1.前言 本系列所使用的是上传组件是大神July开发 ...

  3. 数据库日常维护-CheckList_01历史Agent Job执行情况检查

    检查Agent Job中日常维护作业或业务作业是否成功,如每天的备份.碎片整理.索引维护.历史备份文件清除等,可利用SSMS工具,通过CDC下面设置好的DB Server List,运行下面脚本一次, ...

  4. -Android -线程池 批量上传图片 -附php接收代码

    (出处:http://www.cnblogs.com/linguanh/) 目录: 1,前序 2,类特点 3,用法 4,java代码 5,php代码 1,前序 还是源于重构,看着之前为赶时间写着的碎片 ...

  5. 【NLP】揭秘马尔可夫模型神秘面纱系列文章(五)

    向前向后算法解决隐马尔可夫模型机器学习问题 作者:白宁超 2016年7月12日14:28:10 摘要:最早接触马尔可夫模型的定义源于吴军先生<数学之美>一书,起初觉得深奥难懂且无什么用场. ...

  6. php后台增删改跳转

    php登录页面: <h1>登录界面</h1> <form action="dengluchuli.php" method="post&quo ...

  7. 7.JAVA之GUI编程鼠标事件

    鼠标事件: 功能: 1.基本窗体功能实现 2.鼠标移动监听,当鼠标移动到按钮上时,触发打印事件. 3.按钮活动监听,当按钮活动时,触发打印事件. 4.按钮被单击时触发打印事件. 源码如下: impor ...

  8. 基于NodeJS的秘室聊天室

    借着放假期间将NodeJS重新回顾了一下并玩了一下sketch来进行设计界面,很不错.(注:代码整理后会放到github上,请关注.) 本次聊天室我给它定义了一个名称叫“秘密聊天室”. 需求: 技术选 ...

  9. 基于STM32Cube的IIC主从通信

    1.建立STM32Cube工程,我使用的芯片是STM32F429,为了更简单的建立单独的IIC通信任务,我使用了FREERTOS,另外选择了RCC(系统时钟初始化),I2C1,I2C2(为了验证代码的 ...

  10. IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API

    IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...