Elasticsearch 的分布式架构原理:通俗易懂版
Lucene 和 Elasticsearch 的前世今生
Lucene 是一个功能强大的搜索库,提供了高效的全文检索能力。然而,直接基于 Lucene 开发非常复杂,即使是简单的功能也需要编写大量的 Java 代码,并且需要深入理解其底层原理。
Elasticsearch(简称 ES)构建在 Lucene 之上,隐藏了 Lucene 的复杂性,提供了简单易用的 RESTful API 和 Java API,同时支持多种语言的 API 访问,使得搜索引擎的开发变得更加容易。
Elasticsearch 是什么?
Elasticsearch 主要有以下特点:
- 分布式文档存储引擎
- 分布式搜索引擎和分析引擎
- 分布式架构,支持 PB 级数据
ES 的核心概念
近实时(Near Realtime,NRT)
Elasticsearch 是一个近实时(NRT)的搜索引擎,意味着:
- 从写入数据到数据可以被搜索到,会有一个小延迟(通常 1 秒左右)。
- 通过 ES 进行搜索和分析可以在秒级时间内返回结果。
集群(Cluster)
一个 Elasticsearch 集群由多个节点组成,每个节点所属的集群由配置决定。对于中小型应用来说,刚开始一个集群通常只有一个节点。
节点(Node)
- 节点是 ES 集群中的一个实例,每个节点都有一个唯一的名称。
- 默认情况下,节点会自动加入名为
elasticsearch
的集群。 - 只要启动多个 ES 实例,它们就会自动组成一个集群。
文档(Document)和字段(Field)
- **文档(Document)**是 ES 中最小的数据单元,类似于数据库中的一行记录。
- **字段(Field)**是文档中的数据字段,类似于数据库中的列。
- ES 以 JSON 格式存储文档。
示例:
{
"product_id": "1",
"product_name": "iPhone X",
"product_desc": "苹果手机",
"category_id": "2",
"category_name": "电子产品"
}
索引(Index)
- 索引(Index)是一组具有相似结构的文档集合,类似于数据库中的 表(Table)。
- 例如,一个
product_index
可能存储所有商品的相关信息。
⚠ 过时概念:Type
在 Elasticsearch 7.x 及以上版本中,type
概念已被移除,所有索引只能有一个 type
。
以前,type
用于对一个索引内的数据进行分类,比如:
product_index
下可以有electronics
和clothing
两个type
,分别存储电子产品和服装产品的数据。- 但在 ES 7.x 及以上版本中,这种分类方式已不再支持,建议使用不同的索引来存储不同类别的数据。
分片(Shard)
- 单台服务器无法存储海量数据,ES 通过 分片(Shard) 机制将索引拆分成多个部分,并分布在多台服务器上。
- 优点:
- 扩展能力:可以存储更多数据。
- 提高查询性能:查询时多个分片可以并行执行,提高吞吐量。
注意:
- 每个分片(Shard)本质上是一个独立的 Lucene 索引。
- 在创建索引时,需要指定分片数量,后续不能更改。
副本(Replica)
- 副本(Replica) 用于提高数据的可用性和查询性能。
- 副本的作用:
- 高可用性:如果主分片(Primary Shard)所在节点宕机,副本(Replica Shard)可以接管,防止数据丢失。
- 负载均衡:多个副本可以分担查询压力,提高查询速度。
默认配置:
- Primary Shard(主分片):默认 5 个,创建索引时确定,无法修改。
- Replica Shard(副本分片):默认 1 个,可以随时调整。
- 最小的高可用配置:需要至少 2 台服务器,确保每个副本分布在不同的节点上。
示意图:
索引 -> 分片(Shards)-> 主分片(Primary Shard)& 副本分片(Replica Shard)
ES vs 传统数据库对比
Elasticsearch | 关系型数据库 |
---|---|
Index(索引) | 数据库(Database) |
Document(文档) | 行(Row) |
Field(字段) | 列(Column) |
总结
Elasticsearch 通过 分片(Sharding)+副本(Replication) 机制,实现了 分布式存储 和 高可用性,同时提供了 近实时搜索 的能力,使得它成为大数据搜索和分析的主流选择。
在现代互联网公司,Elasticsearch 主要用于 日志分析、全文搜索、业务分析、推荐系统 等场景。如果你在面试中遇到 ES 相关问题,理解这些基本概念,可以帮助你更好地应对面试挑战。