Elasticsearch 的架构与基本概念
Elasticsearch(简称 ES)是一个开源的分布式搜索和分析引擎,基于 Apache Lucene 构建。它被广泛用于全文搜索、日志分析、实时数据分析等场景。以下是其架构概述及其基本概念的详细解释。
Elasticsearch 的架构
Elasticsearch 的架构设计为分布式、高可用和可扩展,核心是一个多节点的集群结构。以下是其主要组成部分和工作方式:
1. 集群(Cluster)
- 定义:一个 Elasticsearch 集群由多个节点(Node)组成,共同工作以存储数据和处理请求。
- 特性:
- 集群有一个唯一的名称(默认
elasticsearch
),用于区分不同的集群。 - 节点通过网络通信,共同维护数据和状态。
- 集群有一个唯一的名称(默认
2. 节点(Node)
- 定义:运行 Elasticsearch 实例的单个服务器或进程。
- 角色(可组合):
- 主节点(Master Node):负责集群管理(如分片分配、节点加入/退出)。
- 数据节点(Data Node):存储数据,执行索引和搜索操作。
- 摄取节点(Ingest Node):预处理数据。
- 协调节点(Coordinating Node):路由请求和聚合结果。
- 配置:通过
node.roles
指定(7.9+),例如node.roles: ["master", "data"]
。 - 特点:节点可以动态加入或离开集群,自动重新平衡数据。
3. 索引(Index)
- 定义:类似于传统数据库中的“数据库”,是数据的逻辑容器。
- 特性:
- 每个索引包含一组文档(Document),并定义了数据的结构(Mapping)。
- 索引被分成多个分片存储在集群中。
- 示例:
logs-2023-01
(日志索引)。
4. 分片(Shard)
- 定义:索引被分成多个分片,每个分片是一个独立的 Lucene 实例,存储部分数据。
- 类型:
- 主分片(Primary Shard):原始数据存储位置,负责写入。
- 副本分片(Replica Shard):主分片的副本,用于冗余和高可用。
- 特点:
- 分片数量在创建索引时指定(默认 1),不可更改。
- 副本数量可动态调整(默认 1)。
- 分布:分片分布在集群的多个节点上,实现负载均衡和容错。
5. 文档(Document)
- 定义:索引中的基本数据单元,类似于数据库中的一行。
- 格式:JSON 格式,包含字段(Field)和值。
- 示例:
{"id": 1,"title": "Elasticsearch Guide","content": "This is a guide to ES." }
6. 映射(Mapping)
- 定义:定义文档字段的类型和存储方式,类似于数据库的表结构。
- 类型:文本(text)、关键字(keyword)、数字(integer/float)、日期(date)等。
- 动态性:
- 默认动态映射:自动推断字段类型。
- 显式映射:手动定义以优化性能。
7. 倒排索引(Inverted Index)
- 定义:Lucene 核心数据结构,将词(term)映射到包含该词的文档 ID。
- 作用:支持快速全文搜索。
- 示例:
Term | Doc IDs -----------|--------- elastic | 1, 3 search | 1, 2
基本概念
以下是 Elasticsearch 的核心概念,帮助理解其工作机制:
-
集群(Cluster)
- 一组协同工作的节点,共享数据和负载。
- 通过
cluster.name
标识。
-
节点(Node)
- 集群中的单个实例,承担特定角色。
- 通过配置文件(如
elasticsearch.yml
)设置。
-
索引(Index)
- 数据的逻辑分组,包含多个分片。
- 通过 REST API 创建,例如:
curl -X PUT "localhost:9200/my-index"
-
分片(Shard)
- 数据分片单元,主分片和副本分片共同确保高可用和性能。
- 主分片数影响并行性,副本数影响容错性。
-
文档(Document)
- JSON 格式的数据单元,存储在索引中。
- 通过唯一 ID 标识,例如:
curl -X POST "localhost:9200/my-index/_doc/1" -d '{"title": "Test"}'
-
映射(Mapping)
- 定义字段的类型和索引方式。
- 示例:
{"mappings": {"properties": {"title": { "type": "text" },"date": { "type": "date" }}} }
-
倒排索引(Inverted Index)
- 搜索的核心,支持关键词快速定位文档。
-
主选举(Master Election)
- 集群通过选举选择一个主节点,负责协调操作。
- 使用 Zen Discovery(6.x)或 Voting(7.x+)机制。
-
复制(Replication)
- 数据在主分片和副本分片间复制,确保高可用。
- 写入主分片后同步到副本。
-
查询(Query)
- 通过 REST API 执行搜索和分析。
- 示例:
curl -X GET "localhost:9200/my-index/_search?q=title:elastic"
架构工作流程
写入流程
- 客户端发送写入请求到协调节点。
- 协调节点路由请求到主分片所在的数据节点。
- 主分片写入数据并同步到副本分片。
- 多数副本确认后,返回成功响应。
搜索流程
- 客户端发送搜索请求到协调节点。
- 协调节点广播查询到所有相关分片(主分片或副本)。
- 各分片执行查询并返回结果。
- 协调节点聚合结果,返回给客户端。
容错机制
- 主节点故障:自动选举新主节点。
- 数据节点故障:副本分片接管,集群重新分配分片。
架构图示(简易版)
[Client] --> [Coordinating Node]|+-----------+-----------+| |
[Master Node] [Data Nodes]|[Shards: P0, R0, P1, R1]
- Client:发送请求。
- Coordinating Node:路由和聚合。
- Master Node:管理集群状态。
- Data Nodes:存储分片(P=Primary, R=Replica)。
优点与特性
- 分布式:数据和负载分布在多节点。
- 高可用:副本分片提供冗余。
- 可扩展:动态添加节点。
- 实时性:近实时搜索(默认 1 秒刷新)。
总结
Elasticsearch 的架构是一个分布式系统,核心由集群、节点、索引、分片和文档组成。它通过倒排索引实现高效搜索,通过主分片和副本分片确保数据可靠性和性能。基本概念如映射、复制和查询是理解其功能的关键。如果需要深入某部分(例如分片分配或查询优化),可以告诉我,我会进一步讲解!