Elasticsearch架构原理快速了解

news2024/11/18 21:50:02

目录

一、ES的简单了解

(一)直面Elasticsearch

(二)Elasticsearch和关系型数据库的对比

二、基本概念回顾

(一)索引、文档、字段的概念

(二)映射

(三)集群和节点

(四)分片和副分片

(五)DSL

三、架构原理

(一)节点职责

(二)主分片和副分片

(三)路由计算

Routing值

路由计算公式

路由的目的

路由的自定义和灵活性

案例举例

(四)ES写文档的过程

(五)ES读文档的过程

四、基本问题的反思

(一)ES是如何提升数据的高可用性的呢?

(二)ES如何提升服务的高并发性能呢?


一、ES的简单了解

(一)直面Elasticsearch

Elasticsearch(通常简写为ES)是一个开源的分布式搜索和分析引擎,它被设计用于快速、实时地搜索和分析大规模数据。以下是对Elasticsearch的简单了解:

  1. 分布式搜索引擎:Elasticsearch是一个分布式系统,它可以在多个节点上运行,允许你存储和搜索大量的数据。这使得它非常适合处理日志、文档、地理空间数据等各种类型的信息。

  2. 文本搜索:Elasticsearch是一个强大的文本搜索引擎,它可以高效地搜索和匹配文本数据。它支持全文搜索、模糊搜索、多字段搜索等功能,使得用户可以轻松地构建搜索引擎、推荐系统和数据分析应用。

  3. 实时性:Elasticsearch支持实时搜索,这意味着当你添加、更新或删除文档时,你可以立即在搜索结果中看到变化,这对于监控、日志分析和实时报告非常有用。

  4. 多种数据类型支持:Elasticsearch不仅支持文本数据搜索,还支持地理空间数据、数值数据、日期和时间数据等多种数据类型的搜索和分析。

  5. 弹性和可扩展性:Elasticsearch是弹性的,你可以根据需要添加或删除节点,以适应不断增长的数据和负载。它还具有自动分片和复制机制,以确保数据的高可用性和可扩展性。

  6. RESTful API:Elasticsearch提供了一个易于使用的RESTful API,使得与其交互变得简单。你可以使用HTTP请求来执行各种操作,例如索引文档、执行搜索查询、管理索引和节点等。

  7. 生态系统:Elasticsearch是Elastic公司的一个产品,它是ELK(Elasticsearch、Logstash和Kibana)堆栈的一部分,用于日志收集、分析和可视化。此外,有丰富的插件和工具,可以扩展Elasticsearch的功能。

Elasticsearch在多个领域中都有广泛的应用,包括搜索引擎、日志和事件数据分析、业务智能、监控和仪表板制作等。无论是构建实时搜索引擎还是分析大规模数据,Elasticsearch都是一个非常有价值的工具。

更多基本的了解可以见ES初识学习与简单实践总结-CSDN博客。

(二)Elasticsearch和关系型数据库的对比

Elasticsearch和关系型数据库是两种不同类型的数据存储系统,它们在数据模型、用途和功能上有一些显著的区别。以下是Elasticsearch和关系型数据库的对比:

数据模型

  • Elasticsearch:Elasticsearch是一个面向文档的分布式搜索引擎。它的数据模型基于文档,每个文档是一个包含了JSON格式数据的独立单元。文档可以属于不同的索引,每个文档可以具有不同的结构。
  • 关系型数据库:关系型数据库使用表和行的结构来存储数据。表需要定义模式(Schema),所有行都必须遵循相同的结构。

查询语言

  • Elasticsearch:使用DSL(Domain-Specific Language)进行查询,这是一种结构化的查询语言,特别适用于全文搜索、实时数据分析和地理空间查询。
  • 关系型数据库:通常使用SQL(Structured Query Language)进行查询,适用于结构化数据的查询和操作。

搜索和全文检索

  • Elasticsearch:专注于全文搜索和复杂查询,支持分词、模糊搜索、短语匹配等高级搜索功能。
  • 关系型数据库:虽然关系型数据库也可以进行搜索,但不如Elasticsearch在全文搜索和复杂搜索方面高效。

实时性

  • Elasticsearch:支持实时索引,可以在文档添加、更新或删除时立即反映变化。
  • 关系型数据库:通常更适用于批处理和事务性操作,实时性可能较低。

可扩展性

  • Elasticsearch:具有良好的横向扩展性,可通过添加更多的节点来处理大规模数据和高负载。
  • 关系型数据库:通常更适用于单节点或垂直扩展,横向扩展性较差。

数据一致性

  • Elasticsearch:在分布式环境中强调性能和实时性,可能牺牲了一致性。它使用分片和副本来提高可用性,但在网络分区等情况下可能会出现数据不一致。
  • 关系型数据库:通常强调ACID(原子性、一致性、隔离性、持久性)事务,确保数据一致性。

用途

  • Elasticsearch:适用于全文搜索、实时日志分析、监控、数据分析、地理信息系统(GIS)等需要高级搜索和实时性的应用。
  • 关系型数据库:适用于事务性应用、数据管理、企业应用等传统的关系型数据存储需求。

总的来说,Elasticsearch和关系型数据库在用途上有差异,选择取决于你的具体需求。通常情况下,Elasticsearch更适合需要全文搜索和实时性的应用,而关系型数据库更适用于事务性和结构化数据管理。有时候,也可以将它们结合使用,根据需求选择最合适的工具。

二、基本概念回顾

当使用Elasticsearch时,有一些基本概念是很重要的,下面是一些ES基本概念的回顾:

(一)索引、文档、字段的概念

当使用Elasticsearch时,理解以下核心概念非常重要:索引(Index)、文档(Document)和字段(Field)。以下是对这些概念的详细介绍和理解:

索引(Index)

  • 概念:索引是Elasticsearch中的一个逻辑容器,用于组织和存储相关的文档数据。它类似于关系数据库中的表,但更灵活。
  • 理解:可以将索引看作是一个大型数据集的容器,用于存储相似类型的数据。例如,你可以创建一个名为"products"的索引,用于存储产品信息。

文档(Document)

  • 概念:文档是存储在索引中的基本数据单元,通常以JSON格式表示。每个文档代表了一个独立的数据记录。
  • 理解:文档类似于关系数据库中的一行记录。例如,在"products"索引中,每个文档可以代表一个产品,包括产品的名称、描述、价格等信息。

字段(Field)

  • 概念:字段是文档中的数据项,它们包含了文档的具体信息。每个字段都有一个名称和一个对应的值。
  • 理解:在一个文档中,每个字段代表了一个属性或特征,例如,一个产品文档可以包含字段如“productName”、“productDescription”、“price”等,每个字段存储相关信息。

综合起来,可以将这些概念视为组织和存储数据的层次结构:

  • 一个索引可以包含多个文档,这些文档代表了不同类型的数据。
  • 每个文档包含多个字段,每个字段存储文档的具体数据。

这种层次结构的弹性和灵活性使得Elasticsearch非常适合处理大规模、异构数据,并且具有强大的搜索和分析功能。通过理解这些概念,你可以更好地组织、检索和分析你的数据。

(二)映射

映射(Mapping)是Elasticsearch中的一个重要概念,它用于定义索引中文档的结构和字段的属性。映射指定了每个字段的数据类型、如何分析文本、是否存储原始数据等信息。以下是关于映射的详细介绍:

  1. 字段的数据类型:映射确定了每个字段的数据类型,例如文本、数值、日期、布尔值等。指定正确的数据类型有助于Elasticsearch正确地索引和搜索数据。

  2. 分析器(Analyzer):对于文本字段,映射可以指定使用哪种分析器来处理文本数据。分析器决定了如何将文本拆分成词条,以及如何处理这些词条,例如小写化、删除停用词等。

  3. 存储选项:映射可以指定是否将字段的原始值存储在索引中。存储原始值可以提高检索性能,但会占用更多的存储空间。

  4. 多值字段:映射允许你指定字段是否可以包含多个值,这对于数组或多选字段非常有用。

  5. 日期格式:对于日期字段,映射可以定义日期的格式,以确保正确的日期解析和排序。

  6. 自定义字段属性:你还可以在映射中定义自定义字段属性,例如字段的权重、是否可搜索、是否可排序等。

  7. 嵌套对象:映射允许你在文档中包含嵌套对象,这些对象可以具有自己的字段和映射。

映射的正确定义对于Elasticsearch的性能和数据质量非常重要。它确保了索引中的文档被正确地存储和检索,并允许执行高级的搜索和分析操作。通常,映射可以自动创建,但在需要更精细的控制时,也可以手动定义映射。

(三)集群和节点

在Elasticsearch中,集群(Cluster)和节点(Node)是两个核心的概念,用于管理和处理数据。以下是有关集群和节点的详细解释:

集群(Cluster)

  • 概念:集群是一个或多个节点的集合,它们协同工作以存储和处理数据。集群是Elasticsearch的最高级别的组织单元。

  • 用途:集群用于处理大规模数据,提供高可用性和容错性。它允许将数据分布在多个节点上,从而实现数据的水平扩展和负载均衡。

  • 特点:集群有一个唯一的名称,它可以包含任意数量的节点。集群中的节点可以加入或离开,使得集群可以动态调整以适应不同的负载。

节点(Node)

  • 概念:节点是集群中的单个实例,它可以是物理服务器或虚拟机器。每个节点是一个独立的Elasticsearch实例,具有自己的配置和角色。

  • 用途:节点用于存储数据和执行搜索操作。每个节点负责管理分配给它的数据分片,并响应来自客户端的查询请求。

  • 特点:每个节点有一个唯一的名称,可以配置为具有不同的角色,例如主节点(Master Node)、数据节点(Data Node)、协调节点(Coordinator Node)等。不同的角色决定了节点的功能。

集群是多个节点的集合,用于协同工作以存储和处理数据,提供高可用性和扩展性。节点是集群中的独立实例,负责具体的数据存储和搜索任务。

(四)分片和副分片

在Elasticsearch中,分片(Shard)和副本分片(Replica Shard)是关于数据存储和可用性的重要概念。它们允许你将数据分散存储在多个节点上,以提高性能和容错性。

分片(Shard)

  • 概念:分片是将索引中的数据分割成更小的部分的方式。每个索引可以分成多个主分片,这些主分片之间是独立的数据单元。

  • 用途:分片用于水平扩展数据存储和搜索性能。当索引的大小超过单个节点的处理能力时,分片使得数据可以分布在多个节点上。

  • 特点:默认情况下,每个索引有5个主分片。你可以在创建索引时指定分片的数量,但一旦创建,分片数量就不能更改。

副本分片(Replica Shard)

  • 概念:副本分片是主分片的精确复制。每个主分片可以有零个或多个副本分片。副本分片包含了主分片的完整拷贝。

  • 用途:副本分片用于提高数据的可用性和容错性。如果主分片丢失或不可用,副本分片可以顶替它,确保数据不会丢失。

  • 特点:副本分片的数量可以在索引创建后随时更改,以提高可用性和性能。通常,每个主分片至少有一个副本。

分片和副本分片是Elasticsearch中用于数据管理和可用性的关键概念。分片允许水平扩展数据,副本分片提供了数据的冗余和容错性。

一个分片的主分片和副分片分别存储在不同的计算机上,如上图为一个三个节点的集群,某索引设置了3个主分片,每个主分片分配了两个副分片,P表示该分片的主分片,R表示该分片的副分片,P和R后面的数字表示其编号。在极端情况下,当有一个节点时,如果索引的副分片个数设置大于1,则系统只分配主分片,而不会分配副分片。

(五)DSL

在Elasticsearch中,DSL代表"Domain-Specific Language"(领域特定语言),它是一种用于构建和执行复杂查询的结构化查询语言。DSL允许用户以非常灵活和精确的方式定义搜索和分析操作。DSL是Elasticsearch查询的核心组成部分,用于与Elasticsearch进行交互,从而检索和操作数据。

DSL查询通常以JSON(JavaScript Object Notation)格式编写,因此它是一种使用JSON语法的查询语言。DSL查询由一个或多个查询子句组成,这些子句定义了搜索的条件、过滤条件、聚合操作等。以下是DSL查询中常见的一些查询子句和其作用:

  • Match Query:用于执行全文搜索,根据文本匹配度对文档进行排序。

  • Term Query:用于精确匹配字段的值,不执行分析。

  • Range Query:用于匹配指定范围内的数值或日期字段。

  • Bool Query:允许组合多个查询子句,使用布尔逻辑(AND、OR、NOT)来构建复杂的查询。

  • Filter:用于精确过滤文档,不影响文档的相关性排序。

  • Aggregations:用于执行数据分析操作,例如汇总、平均值、求和、直方图等。

  • Nested Query:用于在嵌套文档中执行查询。

  • Geo Queries:用于地理位置数据的查询,如地理坐标和地理形状。

DSL查询非常强大且灵活,允许根据具体的搜索和分析需求构建高级查询。它是Elasticsearch的一个关键特性,用于创建强大的搜索引擎和数据分析应用。通过构建复杂的DSL查询,可以准确地检索和分析数据,以满足不同的用例和业务需求。

三、架构原理

Elasticsearch的架构原理允许用户构建高性能、可扩展、实时的搜索和分析系统。然而,分布式系统的管理和维护可能具有一定的复杂性,需要谨慎规划和配置,以确保数据的完整性和性能。

(一)节点职责

Elasticsearch中的节点可以扮演不同的职责,根据其角色和配置,以下是常见的ES节点职责分析:

主节点(Master Node)

  • 主要职责:主节点负责集群的管理和协调,包括索引和分片的创建、删除、重新分配等。它还负责维护集群状态信息。
  • 配置特点:通常,一个集群中只有一个主节点,但可以有多个备用主节点以提供冗余和高可用性。

数据节点(Data Node)

  • 主要职责:数据节点负责存储索引数据和执行搜索操作。它们存储分片的副本,以提供高可用性。数据节点也负责处理文档的索引和删除操作。
  • 配置特点:一个集群可以有多个数据节点,具体数量取决于集群规模和性能需求。

协调节点(Coordinator Node)

  • 主要职责:协调节点不存储数据,但负责接收来自客户端的搜索和查询请求,然后将请求分发到适当的数据节点。这有助于减轻数据节点的负载。
  • 配置特点:可以在大型集群中引入协调节点,以处理大量的搜索请求。

候选主节点(Candidate Master Node)

  • 主要职责:候选主节点是潜在的主节点候选者,当主节点失败时可以自动接管主节点的角色。它们有能力成为主节点,但不会主动参与主节点的选举。
  • 配置特点:通常,每个节点都是候选主节点,但只有一个会成为活动主节点。

不同的节点角色和配置允许Elasticsearch在不同的用例和环境中发挥其强大的搜索和分析能力。根据需求和性能目标,可以选择配置适当数量和类型的节点,以构建高性能、高可用性的ES集群。

主节点(Master Node)、数据节点(Data Node)和协调节点(Coordinator Node)三种节点类型通常是Elasticsearch集群中的核心节点,它们协同工作以实现数据存储、搜索和协调

为了降低Elasticsearch集群的负载并更好地处理大量搜索请求,可以配置某些节点作为专门的协调节点。这些协调节点不负责存储数据,而是负责接收来自客户端的搜索和查询请求,并将这些请求转发到包含实际数据的数据节点上。

配置协调节点

  1. 创建协调节点配置文件:首先,创建一个新的Elasticsearch配置文件,通常可以在集群中的节点上创建一个新的配置文件。

  2. 配置节点类型:在配置文件中,指定节点的类型为"coordinating-only"。这告诉Elasticsearch这是一个专门的协调节点,不会存储数据。

    node.master: false
    node.data: false
    node.ingest: false
  3. 配置其他设置:根据需要,可以配置其他节点设置,如网络绑定、HTTP端口等。

  4. 启动节点:使用配置文件启动协调节点。确保节点成功加入集群。

协调节点的作用分析

  • 负载均衡:协调节点的主要作用是分发搜索和查询请求到数据节点,从而实现负载均衡。这有助于减轻数据节点的负担,特别是在处理大量并发请求时。

  • 减少网络开销:协调节点可以减少客户端与数据节点之间的网络开销。客户端只需与协调节点通信,协调节点负责将请求发送到适当的数据节点,然后将结果返回给客户端。

  • 隔离查询层和数据层:协调节点的存在将查询逻辑与数据存储分开,使得可以更容易管理和调整每个层的性能和资源。

  • 提高安全性:协调节点可以用作防火墙前端,允许你在协调节点上实施访问控制和安全策略,以保护数据节点免受未经授权的访问。

协调节点在Elasticsearch集群中起到非常重要的作用,特别是在大规模集群和高并发环境中。它们可以有效降低数据节点的负载,提高集群的性能和可伸缩性。配置协调节点是一种智能的方式来优化Elasticsearch集群的性能和资源利用率。

(二)主分片和副分片

Elasticsearch为了支持分布式搜索和提高高可用性,采用了以下机制:

  • 数据分片:索引被分成多个分片,每个分片可拥有零个或多个副本。这些分片和副本分散在不同的节点上,增强了数据的可用性和并发性能。

  • 主分片和副本:每个分片包括一个主分片和其可能的多个副本分片。主分片负责存储数据,副本分片提供冗余和高可用性。如果主分片所在节点宕机,某个副本分片将晋升为主分片以继续提供服务。

这种分布式结构允许Elasticsearch在多个节点上同时执行搜索和查询操作,提高了性能和吞吐量。此外,副本分片确保数据的冗余性,防止了单点故障。当主分片不可用时,系统能够迅速切换到副本分片,确保数据的持续可用性。这些机制一起使得Elasticsearch成为一款强大的分布式搜索和分析引擎。

我们再次将视角拉回到上面的简单集群,如果node1发生故障宕机,集群感知到分片0的主分片P0将要丢失,此时集群会立即将其他节点(如node3)上的分片0对应的副分片R0作为主分片P0进行服务。集群中由node2和node3对外提供服务,所有的分片相关的服务不受影响。

如果node1恢复了服务并加入集群中,因为在node1上还保留有分片0的数据,此时node1上的分片P0会变成副分片R0,在此期间缺失的数据会通过node3上的主分片P0进行补充。并且node1上的分片R1和R2也会分别从node3和node2上对应的P1和P2分片上补充数据,如下图所示:

当客户端对某个索引的请求被分发到ES的协调节点时,协调节点会将请求进行转发,转发的对象是包含这个索引的所有分片的部分节点。协调节点中有一份分片-节点路由表,该表主要存放分片和节点的对应关系。协调节点采用轮询算法,选取该索引的主/副分片所在的节点进行请求转发。一个索引的主分片设定后就不能再修改,如果想继续提升索引的并发性能,则可以增加索引的副分片个数,此时协调节点会将这些副分片加入轮询算法中。

(三)路由计算

Elasticsearch的路由计算是指确定文档应该存储在哪个主分片上的过程。路由计算使用一个叫做routing的值来决定文档的归属,然后将文档路由到相应的主分片。

Routing值

  • routing 是一个用户或应用程序定义的值,通常用于标识文档应该被路由到哪个主分片。
  • routing 可以是任何字符串或数字,通常是与应用程序中的特定逻辑相关的标识符,比如用户ID、产品ID、地理位置等。
  • 客户端在写入文档时可以明确指定 routing 值,也可以让Elasticsearch根据文档内容自动计算。

路由计算公式

Elasticsearch使用以下路由计算公式来确定文档的路由目标主分片:

shard = hash(routing) % number_of_primary_shards

  • hash(routing) 表示对 routing 值进行哈希计算,以得到一个哈希码。
  • % number_of_primary_shards 表示取哈希码与主分片数量取模的结果,从而确定目标主分片的编号。

路由的目的

  • 路由的目的是将文档均匀地分布到索引的各个主分片上,以实现数据的分散存储和负载均衡。
  • 良好的路由策略可以确保索引数据在不同主分片上的分布较为均匀,避免了数据倾斜,提高了性能和可扩展性。

路由的自定义和灵活性

  • 客户端可以根据应用程序的需求自定义 routing 值,以控制文档的路由。
  • Elasticsearch还支持使用自定义的路由计算器,允许应用程序定义更复杂的路由策略,以满足特定的业务需求。

总之,Elasticsearch的路由计算机制允许根据文档的 routing 值将数据路由到适当的主分片上,以实现数据的分布式存储和负载均衡。当一个文档需要被写入Elasticsearch索引时,路由计算用于确定该文档应该存储在哪个主分片上。

案例举例

以下是一个示例,以帮助更清晰地理解路由计算的工作原理:

假设有一个名为 "user" 的索引,它有5个主分片(number_of_primary_shards为5)。现在,我们要将一个用户的信息文档写入到这个索引中,并使用用户的ID来作为 routing 值。用户ID可以是任何字符串或数字,但为了示例简化,我们使用数字:

文档信息

  • 用户ID: 12345
  • 文档内容: 用户名、电子邮件等用户信息

路由计算

我们使用以下路由计算公式来确定文档的目标主分片:

shard = hash(routing) % number_of_primary_shards

在示例中,用户ID为12345,所以 routing 值就是12345。接下来,我们将计算哈希值:hash(12345),得到一个哈希码。假设哈希码为3,然后我们取哈希码与主分片数量5取模:3 % 5,结果为3。

结果

根据路由计算,文档应该路由到主分片3上。协调节点将该写入请求发送到负责主分片3的数据节点,然后数据节点存储该文档。

通过这个路由计算过程,Elasticsearch确保文档被均匀地分布到索引的各个主分片上,实现了数据的分散存储。这有助于提高性能、负载均衡和高可用性,因为数据存储在不同的节点上,同时也确保了数据冗余,以应对节点故障。这是Elasticsearch分布式架构的核心部分。

(四)ES写文档的过程

当Elasticsearch的协调节点接收到客户端发送的写入文档请求,它会执行以下关键步骤来确保文档的成功写入:

1.路由计算

  • 协调节点首先执行路由计算,这是通过一定的路由算法来确定文档应该存储在哪个主分片上。
  • 路由计算通常使用文档的routing值来计算目标主分片,确保文档被分配到正确的位置。

2.写入主分片

  • 协调节点将写入请求转发到目标主分片所在的数据节点。目标主分片负责实际存储文档。
  • 数据节点将文档写入主分片的Lucene索引,确保文档的持久化存储。

3.主分片副本同步

  • 如果索引配置了副本分片,主分片在写入后会将数据同步到所有副本分片所在的节点。这确保了数据的冗余性和高可用性。
  • 同步操作确保即使某个节点发生故障,数据仍然可用。

4.写入确认

  • 一旦主分片和所有副本分片都成功写入文档,数据节点会向协调节点发送写入确认。
  • 协调节点知道文档已经成功写入索引。

5.响应客户端

  • 协调节点将写入成功的确认信息发送给客户端,以通知客户端文档已经成功写入索引。

完全一致性

Elasticsearch确保写入操作的完全一致性。这意味着只有在主分片和所有副本分片都成功写入后,写入操作才会被确认为成功。这确保了数据的可靠性。

高可用性

主分片和副本分片的机制确保了数据的高可用性。即使在节点故障的情况下,数据仍然可以从副本分片中检索。

这个过程确保了文档的安全写入和持久存储,同时保障了数据的高可用性和一致性。Elasticsearch的写入操作是其分布式性能和可用性的核心组成部分,支持实时数据的索引和检索。

上图中,一个包含3个节点的ES集群,假设索引中只有3个主分片和6个副分片,客户端向节点1发起向索引写入一条文档的请求,在本次请求中,节点1被称为协调节点。节点1判断数据应该映射到哪个分片上。假设将数据映射到分片1上,因为分片1的主分片在节点2上,因此节点1把请求转发到节点2上。节点2接收客户端的数据并进行存储,然后把请求转发到副分片1所在的节点1和节点3上,当所有副分片所在的节点全部完成存储后,协调节点也就是节点1向客户端返回成功标志。

(五)ES读文档的过程

Elasticsearch读取文档的过程相对简单,但仍然包括几个关键步骤,下面是这个过程的详细分析:

1.客户端发起读取请求

  • 当客户端需要检索一个或多个文档时,它会向Elasticsearch集群中的任何一个节点发送读取请求。
  • 请求通常包括索引名称、文档ID以及任何其他检索条件。

2.路由计算

  • 接收读取请求的节点会执行路由计算,以确定文档存储在哪个主分片上。这通常使用文档的routing值来计算目标主分片。

3.读取主分片

  • 一旦目标主分片确定,节点将读取请求转发到拥有该主分片的数据节点。
  • 数据节点从主分片的Lucene索引中检索文档数据。

4.返回文档数据

  • 数据节点将检索到的文档数据返回给协调节点,然后协调节点将其传递给客户端。
  • 客户端接收到文档数据后,可以对其进行处理或显示。

5.数据一致性和高可用性

  • Elasticsearch确保读取操作的数据一致性。这意味着只有在主分片上的数据被读取后,读取操作才会返回成功。
  • 如果主分片不可用,Elasticsearch会自动从副本分片中选择一个来满足读取请求,以确保数据的高可用性。

6.查询处理(可选)

  • 在读取文档时,客户端可以使用查询条件来筛选文档,例如执行全文搜索或过滤文档。
  • Elasticsearch支持强大的查询语言和过滤器,允许客户端定制检索条件。

7.近实时性

  • 读取操作通常是近实时的,文档数据会尽快对外可见。但需要注意,在某些情况下,由于分片的同步延迟,可能会存在短暂的延迟。

8.负载均衡

  • Elasticsearch的协调节点负责将读取请求路由到正确的主分片上,以实现负载均衡和高性能的检索操作。
  • 查询请求可以在多个节点上并行执行,以提高响应速度。

总之,Elasticsearch的读取文档过程涉及路由计算、数据检索和返回,以及数据一致性和高可用性的保障。这使得Elasticsearch成为一个强大的实时数据检索引擎,支持在大规模数据集上执行复杂的查询操作。

上图所示,一个包含3个节点的ES集群,假设索引中只有3个主分片和6个副分片,客户端向节点1发起向索引获取文档的请求,在本次请求中,节点1被称为协调节点。节点1判断数据应该映射到哪个分片上。假设将数据映射到分片1上,分片1有主/副两种分片,分别在节点2、节点1和节点3上。假设此时协调节点的轮询算法选择的是节点3,那么它会将请求转发到节点3上,然后节点3会把数据传输给协调节点,也就是节点1,最后由节点1向客户端返回文档数据。

四、基本问题的反思

(一)ES是如何提升数据的高可用性的呢?

Elasticsearch通过多种方式提升数据的高可用性,以确保数据在集群中的持久性和可用性。以下是一些关键的机制和策略,ES用来提高高可用性:

分片和副本

  • Elasticsearch将每个索引划分为多个分片(Shard),这些分片可以分布在不同的节点上,以实现数据的水平分割和负载均衡。
  • 每个分片都可以配置多个副本分片(Replica Shard),这些副本分片存储了分片的复制,确保了数据的冗余性。如果主分片不可用,副本分片可以顶替它,保证数据的可用性。

主从架构

  • Elasticsearch的集群通常包括一个主节点(Master Node)和多个数据节点(Data Node)。主节点负责管理集群的元数据,包括索引和分片的创建和重新分配。数据节点负责存储和处理数据。
  • 主节点选举机制确保了在主节点故障时能够选举出新的主节点,从而保持集群的可用性。

节点冗余性

  • Elasticsearch支持配置多个主节点、数据节点和协调节点,以提供节点级别的冗余性。如果一个节点故障,其他节点可以继续处理请求。
  • 仲裁节点(Voting-Only Node)用于提高主节点选举的可靠性,防止脑裂问题。

故障检测和自动恢复

  • Elasticsearch具有内置的故障检测机制,可以检测到节点的故障或不可用性。
  • 当节点不可用时,Elasticsearch会自动重新分配分片和副本,以将数据从不可用节点中恢复到其他可用节点上。

数据持久性

  • Elasticsearch会将索引数据持久化到磁盘,确保数据在节点重启或崩溃后不会丢失。
  • 定期的快照和备份策略可以帮助保护数据的持久性,并支持灾难恢复。

数据恢复策略

  • 当新节点加入集群或旧节点重新加入集群时,Elasticsearch使用数据恢复策略来高效地将数据重新分配到节点上,以加快数据的可用性。

总之,Elasticsearch通过分片和副本、主从架构、节点冗余性、故障检测和自动恢复、数据持久性等多种机制来提高数据的高可用性。这使得Elasticsearch适用于构建可靠的分布式搜索和分析系统,即使在节点故障或网络问题的情况下,也可以保持数据的可用性和一致性。

(二)ES如何提升服务的高并发性能呢?

Elasticsearch可以通过一系列优化和配置来提升其服务的高并发性能,确保能够快速响应大量的查询请求。以下是一些提高Elasticsearch高并发性能的关键策略和方法:

合理分片设计

  • 确保索引的分片数量合理。如果分片数量太少,可能无法充分利用集群中的节点;如果分片数量太多,会增加集群管理的复杂性。
  • 根据数据量和查询负载来确定分片数量,避免分片过多或过少。

节点扩展和负载均衡

  • 随着负载的增加,可以扩展集群,添加更多的数据节点和协调节点,以增加处理能力。
  • 使用负载均衡器来分发查询请求,确保它们均匀分布到不同的节点上,减轻单个节点的压力。

使用副本分片

  • 副本分片提供了数据的冗余和负载均衡。每个主分片可以有多个副本,这些副本可以处理读请求,从而提高读取性能。
  • 注意,增加副本分片会增加存储需求,因此需要根据资源和需求来平衡。

查询优化

  • 使用Elasticsearch的DSL查询语言构建高效的查询,避免不必要的查询和过滤操作。
  • 使用查询缓存来缓存频繁执行的查询,以减轻查询负载。

数据模型优化

  • 映射(Mapping)的设计对性能有重要影响。选择合适的数据类型、分析器和索引选项可以提高搜索性能。
  • 使用近实时(Near Real-Time)索引设置来实现快速的数据可用性。

分布式搜索和聚合

  • 使用Elasticsearch的分布式搜索功能,允许查询在所有节点上并行执行,提高搜索性能。
  • 避免在查询中执行大量的聚合操作,因为它们可能会消耗大量计算资源。

监控和性能调整

  • 使用监控工具来监视集群性能,包括CPU、内存、磁盘和网络使用情况。
  • 根据监控数据对集群进行性能调整,例如增加节点、调整分片设置等。

硬件优化

  • 选择性能强大的硬件,特别是对于数据节点,包括高速CPU、大内存、快速磁盘等。
  • 使用固态硬盘(SSD)来提高磁盘性能,以加速读写操作。

查询预热

  • 预热(Warm-Up)查询可以在启动集群或重新加载索引后执行,以使缓存和查询性能优化达到最佳状态。

数据压缩和编码

  • 使用数据压缩和编码技术来减小索引的存储占用,提高数据传输效率。

通过以上策略和方法,可以有效提高Elasticsearch的高并发性能,确保它能够应对大规模和高负载的查询请求,同时保持稳定性和可伸缩性。要注意的是,性能调优是一个持续的过程,需要根据实际需求和监控数据进行不断优化和调整。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1065017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

读取图片颜色占比绘制{精美}折线图失败

问题之初 读取图片颜色占比绘制{精美}折线图失败❌ 花了4个小时 你问我问题吧 选择题<small> 读取一张图片各种颜色占比 默认 /storage/emulated/0/Pictures/Screenshots/Screenshot_20230725_195440.jpg自动设置检测代码需要的库 函数 变量 定义 样式等from PIL impor…

C++库函数——set与map的模拟实现

目录 1.红黑树的迭代器与改造 ①红黑树的迭代器 ②红黑树的改造 2.map的模拟实现 3.set的模拟实现 4.测试 1.红黑树的迭代器与改造 ①红黑树的迭代器 对于上面这棵红黑树&#xff0c;我们可以很容易得知道begin()是红黑树的最左节点&#xff0c;end()应该是一个空节点。…

ubuntu增加内存

文章目录 1、硬盘操作步骤第二步:点击【扩展】(必须关闭ubuntu电源才能修改)第三步:修改【最大磁盘容量大小】1、硬盘操作步骤 最近发现Ubuntu空间不足,怎么去扩容呢? 第一步:点击【硬盘】 第二步:点击【扩展】(必须关闭ubuntu电源才能修改) 第三步:修改【最大磁…

Java反序列化:CC1链 详解

CC1 Apache Commons Collections是一个扩展了Java标准库里的Collection结构的第三方基础库&#xff0c;它提供了很多强大的数据结构类型和实现了各种集合工具类。作为Apache开放项目的重要组件&#xff0c;Commons Collections被广泛的各种Java应用的开发&#xff0c;⽽正 是因…

腾讯云轻量和CVM有啥区别?怎么选择服务器配置?

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器价格便宜&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…

MIPI接口协议及规范理解

什么是MIPI接口 MIPI&#xff0c;英文全称为Mobile Industry Processor Interface&#xff0c;即移动行业处理器接口。它是MIPI联盟发起的为移动应用处理器制定的开放标准。MIPI接口是一种专为移动设备和嵌入式系统设计的串行通信接口&#xff0c;定义了一系列的接口标准&…

【pwn入门】用gdb调试32位程序

声明 本文是B站你想有多PWN学习的笔记&#xff0c;包含一些视频外的扩展知识。 问题源码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> char sh[]"/bin/sh"; int func(char *cmd){system(cmd);return 0; }int main(){char a[8]…

学习搜狗的workflow,MacBook上如何编译

官网说可以在MacBook上也可以运行&#xff0c;但是编译的时候却有找不到openssl的错误&#xff1a; 看其他博客也有类似的错误&#xff0c;按照类似的思路去解决 问题原因和解决办法 cmake编译的时候&#xff0c;没有找到openssl的头文件&#xff0c;需要设置cmake编译环境下…

基于Java的连锁超市会员管理系统设计与实现(源码+lw+ppt+部署文档+视频讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

孢子捕捉仪——植物疾病探测的得力工具

孢子捕捉仪是一款专为收集随空气流动、传染的病害病原菌孢子及花粉尘粒而制的精密仪器&#xff0c;它主要用于监测病害孢子的存量及其扩散动态&#xff0c;犹如植物健康状况的“超级侦察兵”&#xff0c;是农业植保部门应当配备的农作物病害监测专用设备&#xff0c;是植物疾病…

学之思第二天-调通登录功能

目录 一、前端问题 二、后端问题 三、总结 之前一直是一个前端网页即使输对了正确的账号密码&#xff0c;也进不去。 一、前端问题 前端控制台就是一大堆爆红&#xff1a; 报错信息大概下面这样&#xff1a; Uncaught (in promise) NavigationDuplicated {_name: "…

Uniapp 婚庆服务全套模板前端

包含 首页、社区、关于、我的、预约、订购、选购、话题、主题、收货地址、购物车、系统通知、会员卡、优惠券、积分、储值金、订单信息、积分、充值、礼品、首饰等 请观看 图片参观 开源&#xff0c;下载即可 链接&#xff1a;婚庆服务全套模板前端 - DCloud 插件市场 问题反…

QT:SQLITE数据库编程

pro文件&#xff1a;QT core gui sql widget.ui main.cpp #include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w("./student.db"); //传入文件名w.show();return a.exec…

binary_cross_entropy和binary_cross_entropy_with_logits的区别

binary_cross_entropy和binary_cross_entropy_with_logits的区别 引言 二分类问题是常见的机器学习任务之一&#xff0c;其目标是将样本分为两个类别。为了训练一个二分类模型&#xff0c;通常使用交叉熵作为损失函数。 二分类交叉熵损失函数有两种不同的形式&#xff0c;分…

深度学习之人脸检测算法

检测方法&#xff1a; Haar cascade opencv HOG Dlib CNN Dlib SSD MTCNN Haar特征 1.Haar特征原理综述 Haar特征是一种反映图像的灰度变化的&#xff0c;像素分模块求差值的一种特征。它分为三类&#xff1a;边缘特征、线性特征、中心特征和对角线特征。用黑白两种…

EQ 均衡器

EQ 的全称是 Equalizer&#xff0c;EQ 是 Equalizer 的前两个字母&#xff0c;中文名字叫做“均衡器”。最早是用来提升电话信号在长距离的传输中损失的高频&#xff0c;由此得到一个各频带相对平衡的结果&#xff0c;它让各个频带的声音得到了均衡。 EQ 的主要功能是&#xf…

端口隔离 MAC地址安全配置

二、知识点 目前网络中以太网技术的应用非常广泛。然而&#xff0c;各种网络攻击的存在&#xff08;例如针对ARP、DHCP等协议的攻击&#xff09;&#xff0c;不仅造成了网络合法用户无法正常访问网络资源&#xff0c;而且对网络信息安全构成严重威胁&#xff0c;因此以太网交…

学习笔记|串口通信的基础知识|同步/异步|常见的串口软件的参数|STC32G单片机视频开发教程(冲哥)|第二十集:串口通信基础

目录 1.串口通信的基础知识串口通信(Serial Communication)同步/异步&#xff1f;全双工&#xff1f;常见的串口软件的参数 2.STC32的串口通信实现原理引脚选择模式选择 3.串口通信代码实现编写串口1通信程序测试 总结 1.串口通信的基础知识 百度百科&#xff1a;串口通信的概…

STM32F103C8t SPI1重映射到PB3 PB4 PB5无输出

STM32F103C8t6用到了ADC 和SPI 导致PAx口无法使用SPI1 因此像复用到的引脚&#xff0c; 检查后发现硬件SPI可以复用到PB3 PB4 PB5&#xff0c; MSIO&#xff1a;PB5 MOSI&#xff1a;PB4 SCK&#xff1a;PB3 但是尝试后发现没有反映 SCK引脚没有波形输出 GPIO_PinRemapConfig(…

使用pywin32读取doc文档的方法及run输出乱码 \r\x07

想写一个读取doc文档中表格数据&#xff0c;来对文档进行重命名。经查资料&#xff0c;py-docx无法读取doc文档&#xff0c;原因是这种是旧格式。所以&#xff0c;采用pywin32来进行读取。 import win32com.client as win32word win32.gencache.EnsureDispatch(Word.Applicati…