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 的架構是一個分布式系統,核心由集群、節點、索引、分片和文檔組成。它通過倒排索引實現高效搜索,通過主分片和副本分片確保數據可靠性和性能。基本概念如映射、復制和查詢是理解其功能的關鍵。如果需要深入某部分(例如分片分配或查詢優化),可以告訴我,我會進一步講解!