`

ElasticSearch性能优化策略

 
阅读更多

ElasticSearch性能优化主要分为4个方面的优化。
一、服务器部署
1、增加1-2台服务器,用于负载均衡节点
elasticSearch的配置文件中有2个参数:node.master和node.data。这两个参 数搭配使用时,能够帮助提供服务器性能。
1.1> node.master: false    node.data: true
        该node服务器只作为一个数据节点,只用于存储索引数据。使该node服务器功能 单一,只用于数据存储和数据查询,降低其资源消耗率。
    1.2> node.master: true    node.data: false
        该node服务器只作为一个主节点,但不存储任何索引数据。该node服务器将使用 自身空闲的资源,来协调各种创建索引请求或者查询请求,讲这些请求合理分发到相关 的node服务器上。
    1.3> node.master: false    node.data: false
该node服务器即不会被选作主节点,也不会存储任何索引数据。该服务器主要用 于查询负载均衡。在查询的时候,通常会涉及到从多个node服务器上查询数据,并请 求分发到多个指定的node服务器,并对各个node服务器返回的结果进行一个汇总处理, 最终返回给客户端。
2、关闭data节点服务器中的http功能
针对ElasticSearch集群中的所有数据节点,不用开启http服务。将其中的配置 参数这样设置:http.enabled: false,同时也不要安装head, bigdesk, marvel等监控 插件,这样保证data节点服务器只需处理创建/更新/删除/查询索引数据等操作。
http功能可以在非数据节点服务器上开启,上述相关的监控插件也安装到这些服 务器上,用于监控ElasticSearch集群状态等数据信息。
这样做一来出于数据安全考虑,二来出于服务性能考虑。
3、一台服务器上最好只部署一个Node
一台物理服务器上可以启动多个Node服务器节点(通过设置不同的启动port), 但一台服务器上的CPU,内存,硬盘等资源毕竟有限,从服务器性能考虑,不建议一台 服务器上启动多个node节点。

二、服务器配置
1、配置索引线程池的大小
ElastiSearch服务器有多个线程池大小配置。主要有:index,search,suggest, get,bulk,percolate,snapshot,snapshot_data,warmer,refresh。
在此主要针对index和search进行一个配置调整。index操作包含:创 建/更新/删除索引数据。search操作主要针对用户的各种搜索操作。
具体配置如下:
threadpool:
    index:
        type: fixed
        size: 100
    search:
        type: fixed
        size: 1000
2、创建/查找索引设置相同的分词解析器
索引服务器用到了ik中文分词插件,对于添加到该搜索服务器中的数据都使用该 中文分词(例如orgglobal对象中的orgName就使用了ik中文分词)。当执行搜索请求 时,搜索关键词也需要用到相关的中文分词器,如果不指定设置的话,则会使用服务器 默认的中文分词standard,而使用standard作为中文分词器进行查询时,性能不好。 通过将ik中分词设置为默认的分词器时,则查询效率是standard的2-3倍。
该配置具体如下:
index:
     analysis:
         analyzer:
        ik:
         alias: [news_analyzer_ik,ik_analyzer]
          type: org.elasticsearch.index.analysis.IkAnalyzerProvider
index.analysis.analyzer.default.type: ik
    3、确定分片(shard)的数量和副本(replica)的数量
ElasticSearch在创建索引数据时,最好指定相关的shards数量和replicas,
    否则会使用服务器中的默认配置参数shards=5,replicas=1。
因为这两个属性的设置直接影响集群中索引和搜索操作的执行。假设你有足够的  
    机器来持有碎片和副本,那么可以按如下规则设置这两个值:
     1) 拥有更多的碎片可以提升索引执行能力,并允许通过机器分发一个大型的索引;
     2) 拥有更多的副本能够提升搜索执行能力以及集群能力。
  对于一个索引来说,number_of_shards只能设置一次,而number_of_replicas可以使用索引更新设置API在任何时候被增加或者减少。
这两个配置参数在配置文件的配置如下:
index.number_of_shards: 5
index.number_of_shards: 1
    4、查询速度慢的日志配置
在进行实际应用中,会记录下查询速度慢或者添加索引速度慢的操作记录,为后
    续性能优化提供依据。其具体配置如下:
index.search.slowlog.threshold.query.warn: 10s
index.search.slowlog.threshold.query.info: 5s
index.search.slowlog.threshold.query.debug: 2s
index.search.slowlog.threshold.query.trace: 500ms

index.search.slowlog.threshold.fetch.warn: 1s
index.search.slowlog.threshold.fetch.info: 800ms
index.search.slowlog.threshold.fetch.debug: 500ms
index.search.slowlog.threshold.fetch.trace: 200ms

index.indexing.slowlog.threshold.index.warn: 10s
index.indexing.slowlog.threshold.index.info: 5s
index.indexing.slowlog.threshold.index.debug: 2s
index.indexing.slowlog.threshold.index.trace: 500ms
三、数据结构优化
1、尽量减少不需要的字段
ElasticSearch中存储的数据是用于搜索服务,因此其他一些不需要用于搜索的字段最好不存到ES中,这样即节省空间,同时在相同的数据量下,也能提高搜索性能。
2、routing值的设置
通常情况下,往ElasticSearch服务器添加索引数据时,是无需指定routing值。ElasticSearch会根据索引Id,将该条数据存储到ElasticSearch集群中的一个shard中。而当指定了routing值为accountId(用户Id),则ElasticSearch会将相同accountId的多个数据都存放到同一个shard中,后续查询的时候,在指定routing值后,ElasticSearch只需要查询一个shard就能得到所有需要的数据,而不用再去查询所有的shard,从而大大提供了搜索性能。
四、运行期优化
1、optimize
随着时间的推移,ElasicSearch中每个shard的数据也会越来越多,索引越来越大,而生成的segment(在每个shard中,每个索引文件实际是由多个sgment文件组成)也会越来越多。而segment越多的话,则查询的性能越差,所以通过调用optimize命令,将多个segment合并成更少数量的segment(最少为一个),从而来提高查询性能。
在调用该命令时,可以设置几个参数,这些参数的具体含义如下:
1.1> max_num_segments
段数优化。要全面优化索引,将其设置为1。默认设置只需检查是否需要执行一个合并,如果需要,则执行它。【经过测试,该值越小,查询速度越快】
1.2> only_expunge_deletes
该优化操作是否只清空打有删除标签的索引记录。在Lucence中,在执行删除操作时,不会直接删除segment中的记录,而是对该记录打上delete标签。当多个segment进行合并操作时,就会生成一个新的segment,而该新的segment中不再包含删除的记录。这个参数允许只对哪些包含删除记录的segment进行优化操作。
1.3>flush
在执行完优化操作之后,再执行刷新操作。默认值为true
1.4>wait_for_merge
当该参数设置为true时,表示其他请求操作要等到合并segment操作结束之后,再进行响应。值得注意的是,由于这个优化操作是一个非常耗时,耗资源的事情,用户提交的请求操作是不能容忍等待这么久,所以这个参数最好设置为false.
具体调用命令如下:
http://localhost:9200/indexName/_optimize?only_expunge_deletes=true&wait_for_merge=false
2、warmers
当ElasticSearch服务器启动之后,业务系统中要使用的索引数据暂时没有导入到内存中,因此当用户进行第一次数据搜索时,会因为数据导入耗时很久,而严重影响用户的使用体验。为了解决该问题,可以使用warmer工具。通过ElastiSearch提供的工具,可以register/delete/get特定名称的warmer。通常情况下,warmer包含的请求需要载入大量的索引数据(例如在数据搜索中需要针对特定字段的排序操作,或者用到一些聚合sum,min,max函数的查询等),这样才能达到预热的效果。
具体调用示例如下(下面的warmer是针对索引名为test的warmer,warmer定义的名字为warmer_1):
curl -XPUT localhost:9200/test/_warmer/warmer_1 -d '{
    "query" : {
        "match_all" : {}
    },
    "aggs" : {
        "aggs_1" : {
            "terms" : {
                "field" : "field"
            }
        }
    }
}'
分享到:
评论

相关推荐

    ElasticSearch5.2全网最全技术视频

    (1)最全面的Elasticsearch运维、管理、调优、故障处理的知识体系:企业级监控体系的搭建,企业级集群部署,集群日常管理策略,集群版本升级方案,集群基准压测方案,集群数据的备份和恢复,系统核心配置参数,性能...

    ES集群性能优化及维护B

    ES集群性能优化及维护B 注:集群 elasticsearch 版本为 v7.2.1。 1.ES系统日志删除策略: 方式一:修改日志配置文件(config/log4j2.properties) appender.rolling.strategy.action.condition.nested_condition.type...

    OpenGL ES应用开发实践 指南 iOS卷.pdf

    第9章介绍能够提高ios设备上opengl es 2.0渲染性能的优化策略;第10章讲解了地形和拾取;第11章回顾了3d渲染所需的常见数学运算;第12章涵盖了一个结合地形渲染、天空盒、粒子系统、动画、变化视点、灯光、模型和...

    自动驾驶电动汽车在操纵极限下的实时自适应速度优化

    该规划器可以处理空间和时间变化的摩擦系数,并将比赛能量策略(ES)转移到道路上。它还可以在车辆的电子控制单元(ECU)上实时处理性能和紧急轨迹的速度剖面生成任务。 指数项实时数值优化、最优控制、速度规划、...

    libcmaes:libcmaes是一个多线程C ++ 11库,带有Python绑定,可使用CMA-ES算法进行协方差矩阵适应发展策略,从而实现高性能的黑盒随机优化。

    libcmaes是CMA-ES系列算法的多线程C ++ 11实现(带有Python绑定),用于优化非线性非凸“黑盒”函数。 所实现的算法在各个学科中具有广泛的应用,范围从纯函数最小化,工业和科学应用中的优化到解决增强和机器学习...

    Marine Predators Algorithm (MPA):Marine Predators Algorithm 是一种新颖的优化算法-matlab开发

    3)CMA-ES,SHADE和LSHADE-cnEpSin高性能优化器和IEEE CEC竞赛的获胜者。 在所有方法中,与LSHADE-cnEpSin相比,MPA获得了第二名,并表现出极具竞争力的结果,LSHADE-cnEpSin是表现最好的方法,并且是CEC 2017竞赛...

    一种新的群搜索优化实现算法 (2012年)

    采用5个300维和7个30 维的测试函数对NRGSO算法进行数值实验,并将其与GSO算法、微粒群优化(PSO)算法、遗传算法(GA)、进化规划(EP)、进化策略(ES)进行比较.结果表明,NRGSO算法的性能优于GSO算法;而在解决高维和多模态...

    geatpy:适用于Python的高性能进化算法工具箱和框架

    快速解决单目标,多目标,多目标和组合优化问题的能力。 大量具有进化算法(选择,重组,变异,迁移...)高性能的算子。 支持人口染色体的众多编码。 许多进化算法模板,包括用于单/多目标进化的GA,DE,ES。 ...

    基于OpenGL的Android+3D游戏开发技术详解与典型案例(源码)

    主要介绍了运用分层绘制和拼接绘制的策略进行场景的优化绘制,并且对场景部件进行了分类控制  本书面向的读者  本书的内容详细,且几乎涵盖了Android 3D游戏开发所有相关的技术,并向读者介绍了真实项目的开发流程...

    java手机游戏(堡垒)的设计与开发.rar

    游戏采用Java语言进行开发,针对手机平台进行优化,保证游戏的流畅性和性能。 图形渲染采用手机图形库,如Android平台的Canvas或OpenGL ES,保证游戏画面的精美度和流畅度。 游戏服务器采用Java后端技术进行开发,...

    radar实时风控引擎-其他

    radar是一款基于java语言,使用Springboot + Mongodb + Groovy + Es等框架搭建的轻量级实时风控引擎,适用于反欺诈应用场景,极简的配置,真正做到了开箱即用。 项目特点: 实时风控,特殊场景可以做到100ms内响应 ...

    sqltoy-orm框架系统-其他

    elasticsearch 只支持查询,版本支持5.7+版本,建议使用7.3以上版本 clickhouse mongodb (只支持查询) sqltoy-orm特性: 1、根本上杜绝了sql注入问题,sql支持写注释、sql文件动态更新检测,开发时sql变更会自动重载...

    pads9.0电子设计软件

    2. 在仿真分析方面,ES Suite可实现以下性能:  HyperLynx - Analog:模拟/混合电路仿真环境。可对DxDesigner 原理图设计进行仿真验证,支持Spice 模型,提供静态工作点计算、直流扫描分析、时域/频域分析、傅立叶...

    JetLinks开源物联网平台-其他

    ElasticSearch 全文检索,日志,时序数据存储 PostgreSQL 业务功能数据管理 hsweb framework 4 业务功能基础框架     JetLinks开源物联网平台 更新日志: v1.9 1、增加设备独立物模型支持,可给单独的设备配置物...

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    14.1 用GNU Profiler度量性能 329 14.1.1 安装Android NDK Profiler 329 14.1.2 启用Android NDK Profiler 330 14.1.3 使用GNU Profiler分析gmon.out文件 331 14.2 使用ARM NEON Intrinsics进行优化 332 14.2.1...

    rfc中文翻译

    现这些性能的优化,本规范包括了一个可逆向发送的明显错误指示。 在单工链路中,可以使用周期性刷新来取代。解压器一旦侦测到错误存在于某个特定的 流中,它可以简单地放弃该流中所有的包直到接收到一个未压缩的头...

    网络互连_网桥.路由器.交换机和互连协议

    11.2.1 ES-IS:CLNP的解决方案 190 11.2.2 IP的解决方案 192 11.2.3 IPX的解决方案 197 11.2.4 DECnet的解决方案 198 11.2.5 AppleTalk的解决方案 198 11.2.6 IPv6的解决方案 200 11.2.7 回顾和比较 200 11.2.8 比较...

    UNIX 高级教程系统技术内幕

    1.2.3 性能 1.2.4 硬件变化 1.2.5 改进质量 1.2.6 模式变化 1.2.7 其他应用领域 1.2.8 简洁就是美 1.2.9 灵活性 1.3 回顾与展望 1.3.1 UNIX 好在哪里 1.3.2 UNIX 的误区在哪儿 1.4 本书的范围 1.5 参考文献 第2 章 ...

    网通交换培训教材

    2.6 主要性能指标 40 2.6.1 基本呼叫处理功能 40 2.6.2 程控交换机的容量指标 42 2.6.3 程控交换机提供的接口和信令方式 43 2.6.4 交换系统的可靠性 44 2.6.5 交换系统的可维护性 44 2.6.6 服务质量标准 45 2.7 基本...

Global site tag (gtag.js) - Google Analytics