Elasticsearch 底层技术原理以及性能优化实践

这篇具有很好参考价值的文章主要介绍了Elasticsearch 底层技术原理以及性能优化实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、简介

1. 概述

Elasticsearch是一个基于Lucene库的开源搜索引擎,支持分布式、多租户和全文搜索功能。它使用了RESTful API接口可以简化对Elasticsearch的集成和扩展。

2. 应用场景

Elasticsearch广泛应用于全文搜索、日志存储和分析、安全事件检测、业务指标分析等领域。

二、架构

1. 节点和集群

Elasticsearch是一个分布式系统由多个节点组成。节点可以分为两种类型:主节点和数据节点

主节点负责协调整个集群中的操作,例如创建或删除索引、添加或删除节点等等。每个集群只能有一个主节点,当主节点故障时,其他节点将会选举出新的主节点。

数据节点存储数据,并参与搜索操作。在集群中可以同时存在多个数据节点,每个数据节点都包含了所有数据的一部分副本。

节点之间通过使用基于TCP的传输层通信,使用JSON格式进行交互。

2. 索引和分片

Elasticsearch使用索引来组织和存储数据。一个索引可以看作是一个关系型数据库中的一个表,而每个文档则相当于一行数据。

为了支撑大规模数据存储,Elasticsearch将索引分成多个分片(shard),每个分片都是一个独立的Lucene索引。当一个索引被创建时,可以指定分片的数量,在索引中的每个文档将会被分配到一个确定的分片中。分片的数量一旦确定,就不能再更改。

分片带来了好处,使得每个分片只需要存储索引的一小部分数据,从而使它们更容易被存储在单个节点之上。此外,分片还使得Elasticsearch可以水平扩展,可以将不同的分片分配给不同的节点。

下面是Java代码展示如何创建一个索引,设置分片数量为5,副本数量为1:

public void createIndex(RestHighLevelClient client, String indexName) throws IOException {
    CreateIndexRequest request = new CreateIndexRequest(indexName);

    // 设置分片数量为5,副本数量为1
    request.settings(Settings.builder()
            .put("index.number_of_shards", 5)
            .put("index.number_of_replicas", 1)
    );

    client.indices().create(request, RequestOptions.DEFAULT);
}

三、查询操作原理

1. 查询DSL语法分类

在Elasticsearch中使用Query DSL(查询领域特定语言)进行查询操作。查询DSL分为两大类:查询查询和聚合查询。

1.1. 查询查询

查询查询用于从索引中获取单个或多个文档。以下是常用的查询类型:

  • match 查询:查找包含指定项的文档。如下所示:
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
SearchResponse searchResponse = null;

MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("title", "Elasticsearch");
searchSourceBuilder.query(matchQueryBuilder);

SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("index-name");
searchRequest.source(searchSourceBuilder);

searchResponse = client.search(searchRequest, CommonOptions.DEFAULT);
  • term 查询:查找与指定术语完全匹配的文档。如下所示:
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
SearchResponse searchResponse = null;

TermQueryBuilder termQueryBuilder = new TermQueryBuilder("title.keyword", "Elasticsearch");
searchSourceBuilder.query(termQueryBuilder);

SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("index-name");
searchRequest.source(searchSourceBuilder);

searchResponse = client.search(searchRequest, CommonOptions.DEFAULT);
  • bool 查询:将多个查询组合在一起,并通过逻辑运算符来确定与查询的真值。如下所示:
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
SearchResponse searchResponse = null;

MatchQueryBuilder matchQueryBuilder1 = new MatchQueryBuilder("title", "Elasticsearch");
MatchQueryBuilder matchQueryBuilder2 = new MatchQueryBuilder("content", "Java");

BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
boolQueryBuilder.must(matchQueryBuilder1);
boolQueryBuilder.must(matchQueryBuilder2);

searchSourceBuilder.query(boolQueryBuilder);

SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("index-name");
searchRequest.source(searchSourceBuilder);

searchResponse = client.search(searchRequest, CommonOptions.DEFAULT);

1.2. 聚合查询

聚合查询用于从索引中获取汇总信息。以下是常见的聚合类型:

  • avg 聚合:计算指定字段的平均值。如下所示:
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
SearchResponse searchResponse = null;

AvgAggregationBuilder aggregationBuilder = AggregationBuilders.avg("average_price").field("price");

searchSourceBuilder.aggregation(aggregationBuilder);
searchSourceBuilder.size(0); // return only aggregations and no hits

SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("index-name");
searchRequest.source(searchSourceBuilder);

searchResponse = client.search(searchRequest, CommonOptions.DEFAULT);
  • max 聚合:计算指定字段的最大值。如下所示:
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
SearchResponse searchResponse = null;

MaxAggregationBuilder aggregationBuilder = AggregationBuilders.max("max_price").field("price");

searchSourceBuilder.aggregation(aggregationBuilder);
searchSourceBuilder.size(0); // return only aggregations and no hits

SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("index-name");
searchRequest.source(searchSourceBuilder);

searchResponse = client.search(searchRequest, CommonOptions.DEFAULT);

2. Lucene 原理基础

Elasticsearch是基于Lucene库开发的。因此了解Lucene的一些基础原理可以更好地理解Elasticsearch的查询操作。Lucene是一个文档检索库,用于快速地搜索大量文档。以下是Lucene的一些关键概念:

  • Document:文档是Lucene中的最小检索单位。每个文档都由多个字段组成。

  • Field:字段表示文档的内容。每个字段都有一个名字和值。

  • Analyzer:分析器用于将文本转换为词条,这些词条将存储在倒排索引中。

  • Inverted Index:倒排索引是一个包含单个词汇条目的文档列表的数据结构。它使得快速查找文档成为可能。

  • TF-IDF:TF-IDF(词频 - 逆文档频率)是一种常见的检索评估方法,用于计算文档中单词的重要性。

四、性能优化实践

1. 集群设置与调优

1.1 分片

  • 合理设置分片数量
    • 分片数过多会降低索引和搜索的性能
    • 建议每个节点最少设置两个分片
  • 分片平衡
    • Elasticsearch自动将副本分配到其他节点上
    • 考虑使用Shard Allocation Awareness优化跨机架部署,避免机架单点故障带来的影响

1.2 副本

  • 合理设置副本数量
    • 副本数过多会增加集群负载,导致查询变慢
    • 建议副本数不超过节点数-1
  • 副本位置
    • 数据中心可用性高:副本置于其他服务器(或数据中心)
    • 数据中心可用性低:副本置于相同服务器(或数据中心)

1.3 内存

  • 设置Xmx和Xms参数,限制JVM使用的最大和最小内存
  • 注意JVM内存与操作系统缓存的折衷,确保JVM能充分利用一定量的操作系统缓存

2. 索引和查询性能优化

2.1 索引

  • 尽量减少分词器的使用
  • 禁用不必要的字段
  • 确定合适的网络延迟参数,选择正确的同步级别
  • 通过Bulk API批量插入数据

2.2 查询

  • 查询时避免全文搜索和模糊匹配
  • 排序时应使用docvalue进行优化
  • 尽量使用过滤器而不是查询器实现准确匹配

3. 内存及磁盘使用技巧

3.1 JVM内存分配

  • 应使用cgroup限制Elasticsearch进程的内存使用
  • 使用SSD硬盘加速索引和查询操作
  • 选择合适的JVM垃圾回收策略以减轻内存压力

4. 正确使用搜索建议和聚合功能

4.1 搜索建议

  • 使用completion suggester代替phrase suggester
  • 建议根据具体场景合理设置suggest条目数量

4.2 聚合

  • 对聚合结果进行分析,确定最优聚合方式
  • 避免数据分散,在数据时间窗口内按照时间排序

五、扩展与集成

1. 插件开发以及集成

在Elasticsearch中插件可以扩展和定制Elasticsearch的功能,包括增加新的API端点、集成外部组件或是创建自己的查询方式等等。要开发和集成插件,可以按照以下步骤进行:

步骤1:编写插件代码

开发插件可以使用Java编写,并打包成jar文件,也可以使用Elasticsearch提供的Gradle插件进行构建。在插件代码中,需要实现Plugin接口,并覆盖getSettings()方法以提供插件设置,默认情况下,插件不需要任何设置。此外还需要实现onModule()方法来注册各种组件,包括自定义的QueryBuilder、Aggregator等。例如以下代码展示如何注册一个自定义查询:

public class MyQueryPlugin extends Plugin {

    @Override
    public Settings getSettings() {
        return Settings.builder()
                .put("my_setting", "default_value")
                .build();
    }

    @Override
    public List<QuerySpec<?>> getQueries(QuerySpecRegistry querySpecRegistry) {
        return Collections.singletonList(
                new QuerySpec.Builder("myQuery", MyQueryBuilder::new, MyQueryBuilder::fromXContent)
                        .build()
        );
    }
    
    // 其他组件的注册
}

步骤2:打包插件

完成插件代码编写后需要将插件打包为.zip格式,并放入Elasticsearch的plugins目录下。要注意的是在打包插件时,需要在根目录下创建es-plugin.properties文件,并设置插件的名字和版本号,例如:

name=my-plugin
version=1.0.0

步骤3:安装插件

将插件打包好并放入plugins目录后,需要重启Elasticsearch节点以完成插件安装。如果一切正常,可以在Elasticsearch的日志中看到类似于以下的输出信息:

[2019-04-06T15:55:21,926][INFO ][o.e.p.PluginsService     ] [node-1] loaded module [my-module]
[2019-04-06T15:55:21,927][INFO ][o.e.p.PluginsService     ] [node-1] loaded plugin [my-plugin]

2. 生态系统

Elasticsearch生态系统提供了大量的基于Elasticsearch的工具和库,包括:

  • Kibana:数据可视化和分析平台
  • Logstash:日志流处理工具
  • Beats:轻量的数据采集代理
  • Elasticsearch-Hadoop:连接Hadoop生态系统和Elasticsearch
  • elasticsearch-mapper-attachments插件:支持在Elasticsearch中索引和搜索各种文档格式

这些工具和库可以一起使用,构建出更加强大、灵活和高效的数据分析和搜索方案。

六、大数据技术集成

1. Hadoop集成

1.1 Hadoop技术介绍

Hadoop是一个开源的分布式数据处理框架,最初是为了处理大规模的结构化和半结构化数据而设计。它包括了HDFS(Hadoop Distributed File System)和MapReduce两个核心组件,可以实现大规模数据存储、处理和分析。

Elasticsearch是一个开源的搜索引擎,基于Lucene构建,支持全文搜索、分面搜索、结构化搜索等功能。它被广泛应用在企业级搜索、日志分析、安全分析等领域。

1.2 Hadoop集成方案

Hadoop与Elasticsearch集成主要有以下两种方式:

  1. 使用Elasticsearch的Hadoop插件,将Elasticsearch作为Hadoop的输出格式,可以方便地把Hadoop的计算结果写入到Elasticsearch中。

  2. 使用Hadoop的Elasticsearch插件,将Elasticsearch作为Hadoop的输入格式,可以直接从Elasticsearch中读取数据进行计算。

1.3 Hadoop集成的优点

Hadoop与Elasticsearch集成可以带来以下几个优点:

  1. 处理大规模数据:Hadoop可以有效地处理大规模的数据,而Elasticsearch则可以对这些数据进行高效的检索和分析,结合起来可以实现大规模数据的存储、处理和分析。

  2. 快速检索:由于Elasticsearch的搜索引擎支持全文搜索、分面搜索等功能,可以快速地检索出需要的数据。

  3. 灵活性:Hadoop可以根据数据的不同进行多种计算操作,而Elasticsearch也可以根据不同的需求进行数据的不同处理,这两个框架的灵活性相互补充,可以满足不同场景的需求。

2. Spark集成

2.1 Spark技术介绍

Spark是一个开源的大数据处理框架,可以进行内存计算、离线批处理、流式处理、机器学习等多种计算。它具有高速的内存计算能力、良好的易用性和丰富的生态系统。

Spark与Elasticsearch集成可以带来以下几个优点:

  1. 高速的内存计算:Spark拥有高速的内存计算能力,可以快速地处理大规模数据。而Elasticsearch又可以快速地检索所需的数据,两者协同可以更快地完成数据处理任务。

  2. 良好的易用性:Spark的API具有良好的易用性,操作简单直观。通过Spark对Elasticsearch中的数据进行处理,可以方便地进行数据分析和挖掘。

2.2 Spark集成方案

Spark可以通过Elasticsearch Hadoop插件实现与Elasticsearch的集成,这个插件可以将Spark作为Hadoop的一个计算引擎,可以读取和写入Elasticsearch中的数据。具体步骤如下:

  1. 下载并安装Elasticsearch Hadoop插件。

  2. 在Spark应用程序中添加相关依赖。

  3. 在Spark应用程序中使用Spark SQL或DataFrame API连接Elasticsearch并进行数据处理。

2.3 Spark集成的优点

Spark与Elasticsearch集成可以带来以下几个优点:

  1. 快速处理大数据:Spark可以快速地处理大规模数据,而Elasticsearch可以快速地检索所需的数据,两者协同可以更快地完成数据处理任务。

  2. 容错性:Spark具有良好的容错机制,可以确保数据处理任务的稳定运行。而Elasticsearch也有自己的容错机制,可以防止数据丢失和数据损坏。

3. Logstash集成

3.1 Logstash技术介绍

Logstash是一个开源的数据收集、处理和转发工具,可以将各种数据源(如Web服务器、数据库、消息队列等)中的数据采集并送到不同的目的地。

Logstash可以通过Elasticsearch输出插件将数据写入Elasticsearch中,这样就可以快速地实现数据的检索和分析。

3.2 Logstash集成方案

Logstash可以通过Elasticsearch输出插件实现与Elasticsearch的集成,具体步骤如下:

  1. 下载并安装Logstash和Elasticsearch。

  2. 在Logstash配置文件中添加Elasticsearch输出插件,并指定Elasticsearch的连接信息和数据的索引名称等信息。

  3. 启动Logstash并开始数据采集和处理任务。

3.3 Logstash集成的优点

Logstash与Elasticsearch集成可以带来以下几个优点:

  1. 高效的数据处理:Logstash可以快速地从各种数据源中采集数据并进行处理,而Elasticsearch可以对这些数据进行高效的检索和分析。

  2. 灵活性:通过Logstash的数据处理管道,可以对不同类型的数据进行灵活的处理和转换,而Elasticsearch可以根据不同的需求进行数据的不同处理,这两个框架的灵活性相互补充,可以满足不同场景的需求。文章来源地址https://www.toymoban.com/news/detail-474089.html

到了这里,关于Elasticsearch 底层技术原理以及性能优化实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Hive性能调优:Hive优化技术以及Hive集群规划

    作者:禅与计算机程序设计艺术 Apache Hive是一个开源的分布式数据仓库软件,可以用来进行数据提取、转换、加载(ETL)、查询等功能。作为Hadoop生态系统的一员,Hive具有强大的分析能力、灵活的数据定义、数据处理、数据分析和可扩展性,是一个理想的企业级数据仓库解决

    2024年02月06日
    浏览(23)
  • Elasticsearch权威指南:深度解析搜索技术核心概念、原理及实践

    作者:禅与计算机程序设计艺术 2010年,当时仅仅30岁的Elasticsearch创始人黄文坚就率先发布了开源分布式搜索引擎Elasticsearch。从此, Elasticsearch 名扬天下,成为了当前搜索领域的翘楚。随着 Elasticsearch 的快速崛起,越来越多的人开始关注并应用 Elasticsearch 来进行搜索服务。

    2024年02月10日
    浏览(30)
  • 【Spring Cloud】基于 Feign 实现远程调用,深入探索 Feign 的自定义配置、性能优化以及最佳实践方案

    在微服务架构中,服务之间的通信是至关重要的,而远程调用则成为实现这种通信的一种常见方式。在 Java 中,使用 RestTemplate 是一种传统的远程调用方式,但它存在一些问题,如代码可读性差、编程体验不一致以及参数复杂URL难以维护等。 在本文中,我们将探讨如何通过使

    2024年02月04日
    浏览(27)
  • Flink:处理大规模复杂数据集的最佳实践深入探究Flink的数据处理和性能优化技术

    作者:禅与计算机程序设计艺术 随着互联网、移动互联网、物联网等新型网络技术的不断发展,企业对海量数据的处理日益依赖,而大数据分析、决策支持、风险控制等领域都需要海量的数据处理能力。如何高效、快速地处理海量数据、提升处理效率、降低成本,是当下处理

    2024年02月13日
    浏览(27)
  • AIGC时代:大模型ChatGPT的技术实现原理、行业实践以及商业变现途径

    大数据与人工智能实战专家—周红伟老师 法国科学院数据算法博士/曾任猪八戒大数据科学家/曾任马上消费金融风控负责人 2023年,以ChatGPT为代表的接近人类水平的对话机器人,AIGC不断刷爆网络,其强大的内容生成能力给人们带来了巨大的震撼。学术界和产业界也都形成共识

    2024年02月22日
    浏览(25)
  • ElasticSearch 底层读写原理

    ​ 写请求是写入 primary shard,然后同步给所有的 replica shard;读请求可以从 primary shard 或 replica shard 读取,采用的是随机轮询算法。 1.选择任意一个DataNode发送请求,例如:node2。此时,node2就成为一个coordinating node(协调节点) 2.计算得到文档要写入的分片 shard = hash(routing)

    2024年04月12日
    浏览(16)
  • ElasticSearch底层读写工作原理

    目录 ES底层读写工作原理分析 ES写入数据的过程 ES读取数据的过程 根据id查询数据的过程 根据查询数据的过程 写数据底层原理          写请求是写入 primary shard,然后同步给所有的 replica shard;读请求可以从 primary shard 或 replica shard 读取,采用的是随机轮询算法。

    2024年02月21日
    浏览(23)
  • Elasticsearch底层原理分析——新建、索引文档

    8.1.0 Elasticsearch Node的角色 与下文流程相关的角色介绍: Node Roles 配置 主要功能说明 master node.roles: [ master ] 有资格参与选举成为master节点,从而进行集群范围的管理工作,如创建或删除索引、跟踪哪些节点是集群的一部分以及决定将哪些分片分配给哪些节点等 data node.roles:

    2024年02月04日
    浏览(27)
  • 五、浅析[ElasticSearch]底层原理与分组聚合查询

    集群节点介绍 es配置文件夹中 客户端节点 当主节点和数据节点配置都设置为false的时候,该节点只能处理路由请求,处理搜索,分发索引操作等,从本质上来说该客户节点表现为智能负载平衡器。独立的客户端节点在一个比较大的集群中是非常有用的,他协调主节点和数据节

    2024年02月16日
    浏览(25)
  • Android复杂UI的性能优化实践 - PTQBookPageView 性能优化记录

    作者:彭泰强 要做性能优化,首先得知道性能怎么度量、怎么表示。因为性能是一个很抽象的词,我们必须把它量化、可视化。那么,因为是UI组件优化,我首先选用了 GPU呈现模式分析 这一工具。 在手机上的开发者模式里可以开启 GPU呈现(渲染)模式分析 这一工具,有的

    2024年02月14日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包