Elastic Search 架构

 2024-07-31    0 条评论    29053 浏览

es

你好!Elasticsearch 是一个开源的分布式搜索引擎,它主要用于实时搜索、分析和存储大规模数据。下面是 Elasticsearch 的详细架构概述:

集群(Cluster)

  • Elasticsearch 是一个分布式系统,由一个或多个节点组成一个集群。
  • 集群中的每个节点都是一个运行 Elasticsearch 实例的服务器。
  • 节点可以根据需要加入或离开集群,实现弹性和高可用性。

节点(Node)

节点是集群中的一个单独的 Elasticsearch 实例。

每个节点都有一个唯一的名称,并且属于集群的一个成员。

ElasticsSearch中的节点角色主要包括以下几种:

  • 主节点(Master Node): 负责管理整个集群的状态,如创建、删除索引,跟踪哪些节点是部分集群的一部分,并决定哪些分片分配给哪些节点等。一个集群中通常会有3-5个主节点。

  • 数据节点(Data Node): 负责存储数据,执行数据相关的操作,如CRUD、搜索和聚合等。数据节点承担了集群的大部分工作负载。

  • 协调节点(Coordinating Node): 负责接收客户端的请求,将请求转发到合适的数据节点执行,并将结果返回给客户端。协调节点也可能参与查询的执行过程。

  • 客户端节点(Client Node): 不存储数据,也不参与集群管理,主要用于接收用户的请求并将其转发到合适的节点。

  • 部落节点(Tribe Node): 允许一个节点连接到多个独立的Elasticsearch集群,并在这些集群之间执行搜索和其他操作。

  • 冷热节点: 冷数据节点用于存储不太活跃的数据,而热数据节点用于存储活跃的数据。这种架构可以提高性能和降低成本。

节点可以同时扮演多种角色,如既是主节点又是数据节点。通过合理地配置节点角色,可以构建出高可用、高性能的Elasticsearch集群。

索引(Index)

索引是文档集合的逻辑容器,类似于关系数据库中的数据库。

每个索引都有一个唯一的名称,并且用于存储相关文档的数据。

索引可以分片和复制以支持大规模数据存储和高可用性。

  1. 索引的定义

    • 在 Elasticsearch 中,索引是一种逻辑上类似于数据库的概念,用于存储和检索文档数据。
    • 索引是文档的容器,每个文档都属于一个索引。
  2. 特点和功能

    • 分布式:索引数据可以水平扩展到多个节点。
    • 实时:支持快速的实时搜索和分析。
    • 文档导向:数据以文档的形式存储,每个文档有一个唯一的 ID。
  3. 索引结构

    • 每个索引可以包含多个类型,但从 Elasticsearch 7.x 版本开始,推荐一个索引只包含一个类型。
    • 索引可以配置不同的分片(shard)和副本(replica),用于提高性能和容错能力。
  4. 创建和管理

    • 使用 Elasticsearch 的 API 可以创建、删除和管理索引。
    • 索引可以通过映射(mapping)定义字段的类型和属性,包括文本、数值、日期等。
  5. 搜索和分析

    • Elasticsearch 提供了丰富的查询语言和聚合功能,用于对索引中的文档进行搜索和分析。
    • 支持全文搜索、字段搜索、复杂的过滤和聚合等功能。
  6. 用途和应用场景

    • 实时日志分析和搜索。
    • 实时监控和报警系统。
    • 企业级搜索解决方案。
    • 大数据分析和数据仓库。

分片和副本(Shards and Replicas)

索引可以被分成多个分片(shard),每个分片是一个独立的 Lucene 实例。

分片可以水平扩展,允许索引更多的数据和处理更高的负载。

每个分片可以有一个或多个复制品(replica),用于提供数据的冗余和故障恢复能力。

分片(Shard)

在Elasticsearch中,索引被分成多个分片,每个分片可以是一个Lucene索引。分片主要有两个作用:

  1. 分布数据:通过将索引数据分成多个分片存储在不同的节点上,Elasticsearch可以水平扩展存储能力和处理能力。每个分片都是一个独立的、可以托管在集群中的 Lucene 索引。

  2. 提高并行度:分片允许Elasticsearch在多个节点上并行地执行搜索和分析操作,从而提高整体的性能和吞吐量。

在创建索引时,可以指定分片的数量,默认情况下是5个主分片。通常情况下,分片数量一经设置就不能更改,因为它直接影响了数据如何分布和索引的整体性能。

副本(Replica)

副本是分片的复制品,用来提高系统的高可用性和容错能力。每个分片可以有零个或多个副本,副本与其原始分片包含相同的数据,但是位于不同的节点上。主要作用包括:

  1. 提高可用性:如果某个节点失效,仍然可以通过副本在其他节点上访问索引数据,保证系统的持续可用性。

  2. 提高读取性能:由于查询可以并行地在主分片和副本上执行,副本可以用来处理读取请求,从而提高系统的读取吞吐量。

副本的数量可以动态调整,通常建议设置为1或更多,具体取决于集群的需求和配置。然而,副本数量的增加会占用更多的存储空间和网络带宽。

分片与副本分布算法

  1. 分片数:在创建索引时,可以指定索引的主分片数量(primary shards)和副本分片数量(replica shards),分片尽量为数据节点的数量的倍数。主分片是数据的实际存储,副本分片是主分片的备份,用于提高可用性和读性能。

  2. 分片分配算法

    • 随机分配:Elasticsearch 在分配分片时,会尽量随机地将分片分配到节点上,以均衡节点之间的负载。
    • 节点可用性:在分配分片时,Elasticsearch 会考虑节点的可用性。如果某些节点不可用,系统会自动将这些节点上的分片重新分配到可用的节点上。
    • 避免单点故障:Elasticsearch 会避免将主分片和其副本分片放在同一个节点上,以确保即使一个节点失败,其数据也不会丢失。
  3. 平衡分配:Elasticsearch 使用分片平衡算法来确保集群中的分片尽可能均匀地分布在所有节点上。这种平衡可以动态调整,以响应节点的加入或离开。

  4. 标签和权重:用户也可以为节点设置标签,然后在创建索引或分片时使用这些标签进行更精确的分配。通过给节点设置权重,可以实现一些分片优先分配给特定节点的策略。

  5. 动态调整:在集群运行过程中,Elasticsearch 能够根据当前的负载和节点状态动态调整分片的分布,以确保高效的资源利用和负载均衡。

这些算法和策略共同作用,确保了 Elasticsearch 在数据存储和查询中的高可用性和可扩展性。

文档(Document)

  • 文档是 Elasticsearch 中的基本数据单元,它是一个 JSON 对象。
  • 每个文档都属于一个索引,并且必须有一个唯一的 ID。
  • 文档包含一个或多个字段,每个字段都有一个特定的数据类型,如文本、日期、数字等。

映射(Mapping)

  • 映射定义了索引中每个字段的数据类型和属性。
  • 映射可以自动创建(dynamic mapping),也可以手动定义。
  • 合理的映射设计能够优化搜索和聚合操作的性能。

搜索和分析(Search and Analysis)

  • Elasticsearch 提供强大的搜索和分析功能,支持全文搜索、结构化查询、聚合分析等。
  • 查询语言使用 JSON 结构体来构建查询请求,支持各种查询类型和过滤条件。
  • Elasticsearch 使用分析器来处理和标准化文本数据,支持多种语言和自定义分析器配置。

REST API 和客户端库

  • Elasticsearch 提供了 RESTful API,可以通过 HTTP 请求与集群交互。
  • 各种编程语言的客户端库(如 Java、Python、Node.js 等)提供了更方便的方式来与 Elasticsearch 集成和交互。

总结来说,Elasticsearch 的架构设计旨在实现高性能、可扩展性和可靠性,适用于大规模数据的实时搜索和分析场景。