一文了解ElasticSearch架构

一文了解ElasticSearch架构#头条创作挑战赛#学海本无涯,唯勤是岸青云岂有路,以码为梯ElasticSearch是基于Lucene的查询与分析引擎。它扩展了Lucene的查

大家好,欢迎来到IT知识分享网。

#头条创作挑战赛#

学海本无涯,唯勤是岸
青云岂有路,以为梯

ElasticSearch是基于Lucene的查询与分析引擎。它扩展了Lucene的查询功能,并基于Lucene提供了一个分布式的,水平扩展的以及高可用的查询分析平台。ES常用的使用场景有日志分析,全文检索,应用性能监测以及SIEM等等。

ElasticSearch架构

Lucene

Lucene是使用Java语言开发的开源的,高性能的查询库。Apache Solr,Apache Nutch,OpenSearch和Elasticsearch都是在Lucene的基础上创建的。Lucene已经有超过20年的历史,是Apache基金会管理的成熟项目。

Lucene的核心是倒排索引(inverted search index),这是Lucene有快速查询能力的核心。倒排索引提供了关键词与包含关键词的文档的对应关系。在查询的过程中,从排序的列表中快速找到关键词并且找到关键词对应的文档列表。Lucene支持的信息类型包含数字、字符串以及文本类型。Lucene包含丰富的搜索接口,支持自然语言搜索,通配符搜索,模糊搜索和邻近搜索。

ES功能(Elasticsearch Functionality)

Lucene是查询库,但是不是一个搜索引擎。ES使用Lucene作为核心并在它的基础之上添加了很多能力,使它成为一个功能齐全的搜索和分析引擎。以下是关于ES的能力的总结。

一文了解ElasticSearch架构

ES的能力

ES集群(Elasticsearch Cluster)

一个Elasticsearch集群是一个分布式的节点集合,每个节点执行一个或多个集群操作。

集群可以进行水平扩展,通过向集群添加额外的节点,可以线性增加集群的容量,同时保持类似的性能。

集群中的节点可以根据它们执行的特定类型的操作进行区分。尽管一个节点可以执行任何或所有的集群操作,但这样的配置可能会对集群的稳定性产生负面影响。标准做法是为不同的集群功能指定不同的节点集合。

一文了解ElasticSearch架构

主节点(Master Node)

每个集群在任何时候都有一个单独的主节点,其职责包括维护集群的健康状态。它们通常是轻量级的,因为它们不处理任何数据。主节点充当协调员,用于在集群中的适当节点上创建、删除、管理索引,以及将索引和底层分片分配给适当的节点。

主节点候选节点(Master-Eligible Nodes)

主节点候选节点是可能成为主节点的节点。建议以超过一个主节点候选节点构建集群,并且主节点候选节点的数量应为奇数,以处理集群分区。

数据节点(Data Nodes)

数据节点保存实际的索引数据,并处理数据的摄取、搜索和聚合。数据节点操作对CPU和内存要求较高,需要足够的资源来处理数据负载。任何Elasticsearch节点的最大建议堆大小为30GB。建议采用横向扩展而非纵向扩展,以增加集群的容量。

客户端节点(Client Nodes)

客户端节点充当集群的网关,帮助平衡传入的摄取和搜索请求。这在搜索用例中尤其有用。每个搜索都有提取和缩减阶段。在缩减阶段,需要将来自各个分片的结果放在一起。如果数据节点承受压力并且同时充当客户端节点,那么不仅会影响驻留在该节点上的分片的查询结果,还会影响通过该节点协调的查询。

摄取节点(Ingest Nodes)

可以配置摄取节点在数据摄取之前对数据进行预处理。由于某些处理器(如grok处理器)可能消耗较多资源,因此专门为摄取管道分配独立的节点有利于搜索操作不受摄取处理的影响。

数据组织

在Elasticsearch中,数据被组织成包含一个或多个文档的索引。文档反过来又包含一个或多个字段。

一文了解ElasticSearch架构

索引(Index)

索引是文档的逻辑集合。索引是终端用户管理其数据的基本单位,类似于数据库表。索引中的文档可以是任何内容,例如书中的段落、日志行、推文或城市的天气数据,但通常相似的文档会被分组到同一个索引中。虽然Lucene也按索引组织数据,但Elasticsearch索引不直接映射到Lucene索引。相反,每个索引被分解为多个子索引,称为分片。分片直接映射到Lucene索引。

文档(Document)

文档是包含一组字段及其值的JSON结构。每个文档直接映射到底层的Lucene文档。Elasticsearch还为文档添加了一些附加的元数据字段,如_id、_source、_version等,以提供增强功能。尽管索引中的文档可能具有完全不同的内容,出于效率考虑,通常会将相似的文档存储在同一个索引中。

例如,以下客户索引包含有关商店客户的文档。尽管这些文档都具有相似的内容,但某些字段可能只出现在特定的文档中。

一文了解ElasticSearch架构

字段(Fields)

字段是构成文档的键值对。字段可以是多种不同类型,如数字、文本、关键字、地理点等。字段的类型决定了它在Elasticsearch中的处理和存储方式,以及如何进行搜索和访问。我们将在后面的章节中详细介绍一些最常见的数据类型。

内部数据结构

分片(Shards)

为了将索引的数据分布在多个节点上,以实现可伸缩性和可靠性,Elasticsearch可以将一个索引分成多个较小的单元,称为分片。每个分片映射到一个底层的Lucene单元,也称为索引。换句话说,每个索引被映射到一个或多个Lucene索引,也就是分片。这些分片可以分布在集群中,以提高处理速度并防止节点故障。

一文了解ElasticSearch架构

主分片和副本分片

每个索引的分片数量是可配置的参数,它对集群的性能有重要影响。Elasticsearch中的搜索操作是在分片级别执行的,拥有多个分片有助于提高搜索速度,因为操作可以在多个节点之间分布。

我们可以将每个索引分成与数据节点数量相同的分片,但是拥有太多的分片也会带来问题。增加分片数量会增加集群状态信息,这意味着需要更多的资源来管理跨集群节点的分片状态。通常的做法是保持分片大小在30GB到50GB之间,这将决定我们为索引配置多少分片。

为了防止数据丢失,Elasticsearch允许为数据配置副本。这是一个索引级别的设置,可以随时更改。由于索引存储在分片中,配置副本会导致创建和存储副本分片。Elasticsearch会尝试将副本分片分配到与主分片所在节点不同的节点上(如果配置了区域感知,它会尝试将副本放置在替代区域)。

通过副本分片,节点故障不会导致数据丢失或数据不可用的情况。副本分片不是免费的,它们也有代价。存储副本需要额外的存储空间,并且会减慢索引操作,因为数据需要同时索引到主分片和副本分片。因此,在进行大规模索引操作期间通常会关闭副本。

段(Segments)

一个Lucene索引/Elasticsearch分片被细分为称为Lucene段的更小单元。段是文件系统结构,在数据被摄入索引时创建。搜索操作是在段级别执行的。

段合并

一旦创建了一个段,其内容就无法修改。删除文档只是将文档标记为已删除。类似地,更新文档需要删除旧文档并创建更新后的文档。

为了释放已删除文档的空间,Elasticsearch通过合并段来创建新段,从而清除已删除文档。合并还有助于将较小的段合并为较大的段,因为较小的段具有较差的搜索性能。

事务日志(Translog)

当数据写入Lucene索引时,它被保存在内存中,并在达到一定阈值时写入磁盘。这避免了频繁向磁盘写入,从而提高了写入性能,并避免创建许多小的分片。不足之处在于,任何未提交的Lucene写入在发生故障时将丢失。为了克服潜在的数据丢失,Elasticsearch会将所有未提交的更改写入称为事务日志的事务日志中。在发生故障时,可以从事务日志中回放数据。事务日志的大小、同步间隔和耐久性可以在索引级别进行设置。

事务日志中的数据在进行刷新操作之前无法立即进行搜索。默认情况下,Elasticsearch每秒执行一次索引刷新。刷新会将事务日志中的数据转换为内存中的段,然后变得可搜索。刷新不会提交数据以使其持久化。

一文了解ElasticSearch架构

一文了解ElasticSearch架构

一文了解ElasticSearch架构

文档索引(Document Indexing)

ES中的数据在被存储之前会被分析和分词,Lucene 库只存储被分析的称为术语的token。ES也会将接收到的原始文档存储在_source字段中。尽管这需要耗费额外的存储空间,_source字段对于文档的更新功能至关重要,并且对于重新索引(reindex)操作也是需要的。

数据分析(Data Analysis)

分析是一个将输入字段转化可以存储为Lucene倒排索引的term或者一系列terms的过程。这些可以通过analyzersnormalizers来实现。预构建的分析器(analyzers)和规范器(normalizers)可用于常见用例。

例如,标准分析器(standard analyzer)将文本分解为基于语法的分词(token),而空格分析器将文本分解为基于空格的terms。分析器是字符过滤器(character filters)、分词器(tokenizers)和分词过滤器(token filters)的组合。可以使用适当的过滤器和分词器构建自定义分析器。

一文了解ElasticSearch架构

字符过滤器(Character Filters)

在文本进入分词器之前,字符过滤器对输入的文本进行预处理。字符过滤器可以对文本进行添加、删除、修改字符操作。例如,内置的 HTML 去除字符过滤器去除 HTML 元素并解码 HTML 实体。可以指定多个字符过滤器,它们将按顺序应用。

分词器(Tokenizers)

分词器将输入的字符流按照特定的标准转换为分词。例如,标准分词器根据单词边界将文本分解为分词,并且会删除标点符号,空格分词器根据空格将文本分解为分词。

分词过滤器(Token Filters)

分词过滤器对从分词器出来的分词进行后处理。分词可以被添加、删除或者修改。例如,ASCII folding过滤器会将 Unicode 字符转换为最接近的 ASCII 等效字符.词干(stemming)分词过滤器应用词干规则将单词转换为其根形式

规范器(Normalizer)

规范器类似于分析器,但不能指定分词器,因为它们只产生一个分词。它们与基于字符的字符过滤器和分词过滤器一起使用。

字段类型(Field Data Types)

一文了解ElasticSearch架构

字段的数据类型定义了该字段将被如何索引和存储。尽管ES不需要为索引定义一个schema,但是最佳实践是通过索引匹配(index mappings)来定义索引schema。index mapping定义了索引中所期望的字段以及各个字段的类型。如果字段类型没有被明确指定,ES将尝试根据内容来猜测类型。一些通用的类型如下

文本类型(Text Type)

文本类型主要用于索引任何人为产生的文本(推文、博客、书本内容,产品描述等等)。文本类型使得输入数据被特定的分析器分析。如果没有指定分析器,将会使用标准的分析器。文本字段通常用于模糊查询。

关键词类型(Keyword Type)

关键词类型通常用于索引结构化数据(例如姓名、id、目录等等)。关键词字段特别用于排序、聚集以及运行脚本。为了启用此功能,默认情况下它们以列格式存储。只能为关键字指定规范化器,因为它应该生成单个分词。

数字类型(Numeric Type)

数字类型为整数、无符号整数、浮点数等等。当选择数字类型时,为了节省存储空间应该选取符合输入范围最小类型。BKD 树用于存储数字字段。

地理点(Geo Point Type)

地理点长用于表示经度和纬度。通过地理点可以执行依赖位置、距离的查询。BKD 字段用于存储地理点。

倒排索引(Inverted Index)

Lucene以及后来的ES都因为它们提供了快速查询的能力而出名。这样的速度是通过使用倒排索引作为文档映射的基础来实现的。倒排索引包含术语(term)到索引中关联文档(document)的映射。

文档分析器/规范器在提取过程中生成术语(term),然后在倒排索引中更新这些术语。添加或修改文档会导致倒排索引更新,这会产生one-time成本。

一文了解ElasticSearch架构

术语字典(Term Dictionary)

术语(term)字典是按字母顺序排列的索引中的术语列表,并指向发布列表(posting list).术语字典存储在磁盘中,并在文档添加以及修改时被更新。术语(term)是分析器处理输入流时的分词输出。

术语字典的简化版本具有以下字段

  • Term: 分析器和规范器产生的Term
  • Document Count:包含term的文档数量。计分的时候需要。
  • Frequencies:term在文档中出现的次数。用于支持短语和相似度查询。
  • Offsets:原始文本的字符偏移量。为了提供更快的搜索高亮显示。

Term Index

Term词典包含索引中术语(Term)的排序列表,对于高基数字段,这可能会变得非常大。比如,存储人名的字段。因为不同名字的数量很大,将所有这些术语保存在内存中可能会非常昂贵。为了避免这样的场景,ES使用了一个术语Term索引,它是一个前缀树。树的叶子指向存储在磁盘中的术语字典的适当块。在搜索期间,将首先在术语索引中查找术语的前缀,以找到包含与前缀匹配的术语部分的实际术语字典块。然后将该块加载到内存中以查找该块中的实际术语。

文档搜索(Document Searching)

ES通过分布式查询算法去执行查询。

查询阶段(Query Phase)

在查询阶段,ES将查询发送到索引关联的所有分片(shard)。查询请求可以发送到一个主或者副本分片。如果查询请求 n 个结果,那么每个分片将执行本地查询并返回n个结果。结果将仅包含文档 ID、分数和其他相关元数据,但不包含实际文档。

获取阶段(Fetch Phase)

协调(coordinating)搜索的节点将对所有分片的查询结果进行排序,并将 n 个结果的最终列表放在一起。然后它将执行一次提取,在此期间将检索并返回实际文档。

文档评分(Document Scoring)

文档评分是通过相似度模块实现的。默认相似度模块是 BM25 相似度。它是对自然语言处理中广泛使用的 TF-IDF 算法的改进。特别是,BM25考虑了字段长度并应用了词频饱和度。

一文了解ElasticSearch架构

  • TF:给定术语在字段中出现的频率。词条在文档中出现的次数越多,文档就越有可能是相关的。
  • IDF:该术语在索引中的所有文档中出现的频率。如果它出现得更普遍,则该术语的相关性较低。诸如“the”之类的常用词可能会在索引中出现多次,与它们的匹配不太重要。
  • Norm:Length normalization。对于相同的词频,较短的字段比较长的字段更相关。同一个词在长度为 100 的字段中出现两次比在长度为 1000 的字段中出现两次更重要。

聚合(Aggregations)

ES不仅仅是一个搜索引擎,它也有内置的高级的分析能力。Aggregations让你可以过滤并分类你的文档,计算指标并通过组合多个聚集构建聚集通道。

一文了解ElasticSearch架构

指标聚合(Metrics Aggregations)

指标聚合允许在文档中生成的值上计算指标。值可以是文档中指定字段或者通过脚本动态生成。可以作为bucket aggregations的子聚集并且将为每个聚合存储桶生成指标

数字指标聚集(Numeric Metric Aggregations)

数字指标聚集产生数字类型的指标,例如最大值、最小值、求和以及平均值。也可以分类为单值(single-value)或多值(multi-value)指标。

单值聚集产生一个单独的指标。例如求和聚集将从选择的文档中的指定字段产生一个单独的值。

示例: 书店的所有订单总额

GET book_store_orders/_search { "size":0, "aggs":{ "total_orders":{ "sum":{ "field":"order_price" } } } }

多值聚合根据聚集文档中的指定字段产生多个值。例如,extended_stats聚集输出总和、最大值、最小值、方差以及标准差指标

非数值指标聚合(Non-Numeric Metric Aggregation)

一些聚集输出非数值类型的指标。一个很好的列子是top hits聚集。作为子聚集,它会为每个桶(bucket)生成最匹配的文档。最佳匹配由排序顺序定义,默认为搜索分数。

示例:每个类别中订单金额最高的订单

GET book_store_orders/_search { "size":0, "aggs":{ "category":{ "terms":{ "field":"category.keyword", "size":5 }, "aggs":{ "top_orders_by_price":{ "top_hits":{ "size":10, "sort":[ { "order_price":{ "order":"desc" } } ] } } } } } }

桶聚合(Bucket Aggregations)

桶聚合根据分桶标准将匹配的文档集分类到桶中,

分桶标准可以基于字段的唯一值(术语聚合)、日期范围(日期直方图)聚合等。

存储桶聚合可用于对所有存储桶进行分页(复合聚合),提供分面,或可用作其他指标聚合的输入。

示例: 按类别统计订单价格

GET book_store_orders/_search { "size":0, "aggs":{ "sale_by_category":{ "terms":{ "field":"category.keyword", "size":10 }, "aggs":{ "sales_stats":{ "stats":{ "field":"order_price" } } } } } }

通道聚合(Pipeline Aggregations)

通道聚集可以用于计算指标,因为它可以在其他聚集的基础上进行聚集,所以可能构建一个聚集链路。通道聚集可以进一步分为父(parent)聚集和兄弟(sibling)聚集。

父管道聚合根据父聚合的输出计算新聚合。

同级管道聚合基于一个或多个同级聚合的输出计算新聚合。

管道聚合使用桶路径语法来识别具有必要输入参数的父聚合或兄弟聚合。

示例:最大订单价格按类别和总体排序

GET book_store_orders/_search { "size":0, "aggs":{ "sale_by_category":{ "terms":{ "field":"category.keyword" }, "aggs":{ "max_order_price":{ "max":{ "field":"order_price" } } } }, "max_order_price_across_categories":{ "max_bucket":{ "buckets_path":"sale_by_category>max_order_price" } } } }

希望这篇文档对大家了解ElasticSearch有帮助,感谢点赞、评论、转发

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/47995.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信