ElasticSearch 是如何实现分布式的?
如果你正在准备技术面试,或者想深入理解 ElasticSearch(简称 ES)是如何实现分布式的,这篇文章将用通俗易懂的方式来讲解。
1. 为什么需要分布式搜索?
在互联网行业,搜索是一个重要的功能,像电商网站搜索商品、社交平台搜索用户、企业内部搜索文档等,几乎所有大型系统都依赖高效的搜索功能。
最早,搜索引擎主要依赖 Lucene,这是一个强大的搜索库。但 Lucene 本身并不支持分布式,它更适合单机环境。随着数据量越来越大,单机搜索性能不够用了,于是出现了基于 Lucene 的分布式搜索引擎,比如 ElasticSearch(ES)。
今天,大部分公司都在用 ES 作为搜索引擎,因此 ES 也成了面试中的高频考点。常见的一个问题是:ElasticSearch 是如何实现分布式的?
2. ES 的分布式架构
ElasticSearch 采用 分布式架构,意味着它可以运行在多台机器上,并把数据分散存储到不同的服务器中,实现横向扩展,提高搜索性能和可靠性。
可以用一个快递公司来类比 ES 的分布式架构:
- 索引(Index)相当于仓库:一个索引存储的是某类数据,比如订单数据。
- 分片(Shard)相当于多个快递站点:数据会被拆分存储到不同的 shard 里,每个 shard 只存一部分数据,类似于不同的快递站点各自负责一部分快递。
- 副本(Replica)相当于备用仓库:每个 shard 都有副本,如果某个 shard 发生故障,系统可以用副本数据继续提供服务,不影响搜索功能。
3. ES 里的核心概念
为了更清楚地理解 ES 的架构,我们用 MySQL 来类比:
ElasticSearch 概念 | MySQL 类比 | 解释 |
---|---|---|
Index | 数据库中的一张表 | 存储某一类数据,如订单数据、用户数据等 |
Type(已废弃) | 表中的分类字段 | ES 7.x 以后已移除,之前用于区分类似的数据 |
Mapping | 表的结构 | 定义每个字段的数据类型 |
Document | 表中的一行数据 | ES 里存储的最小数据单元 |
Field | 表中的字段 | 每个文档由多个字段组成 |
举个例子:
假设我们有一个订单索引 order_idx
,存储所有的订单数据,相当于 MySQL 里的一张 order
表。
每条订单数据是一个 Document,里面包含订单 ID、商品名称、价格等多个 Field。
4. ES 的分片(Shard)机制
ElasticSearch 之所以能高效处理大规模数据,关键在于它的 分片(Shard)机制。
假设你是快递公司的老板,有 300 万个包裹要送,如果让一个快递员送完所有包裹,肯定忙不过来。但是如果把 300 万个包裹拆分到 3 个快递站,每个快递站各自负责 100 万个包裹,送快递的效率就大大提升了。
ES 也是同样的道理:
- 一个索引(Index)可以拆分成多个分片(Shard)。
- 每个分片存储一部分数据,多个分片分布在不同的服务器上。
- 查询时,ES 可以同时在多个分片上并行处理请求,提高搜索性能。
例如:
- 你有 3T 订单数据,拆分成 3 个 shard,每个 shard 存 1T 数据。
- 如果数据增长到 4T,可以新建一个 4 个 shard 的索引,重新分配数据。
5. 主分片(Primary Shard)和副本分片(Replica Shard)
为了保证数据可靠性,ES 采用了 主分片(Primary Shard)+ 副本分片(Replica Shard) 机制。
5.1 主分片(Primary Shard)
- 负责数据的存储和查询。
- 当你向 ES 写入数据时,数据会先存到主分片。
5.2 副本分片(Replica Shard)
- 作为主分片的备份,存储相同的数据。
- 当主分片宕机时,ES 可以用副本分片来继续提供服务,保证高可用。
比如:
- 你的 ES 集群有 3 个主分片,每个主分片都有 1 个副本。
- 那么 ES 实际上会有 6 个 shard(3 个主分片 + 3 个副本分片)。
- 如果一台服务器宕机,数据仍然可用。
6. Master 节点和故障恢复
ElasticSearch 采用 主节点(Master)+ 数据节点(Data Node) 架构,保证集群的正常运行。
- Master 节点:负责管理整个集群,比如索引创建、分片分配、主从切换等。
- Data 节点:负责存储数据和执行搜索查询。
6.1 Master 节点的选举
如果 Master 节点宕机,ES 会自动选举一个新的 Master,保证集群不会崩溃。
6.2 故障恢复机制
假设某台服务器宕机,导致主分片不可用,ES 会:
- 让副本分片(Replica Shard)切换成新的主分片(Primary Shard)。
- 等宕机的服务器恢复后,重新分配副本分片。
这个机制确保即使服务器故障,ES 也能继续提供搜索和数据存储服务。
7. 结语
ElasticSearch 作为分布式搜索引擎,核心原理就是 数据分片 + 副本存储 + 主节点管理。
简单来说,ES 就像一个高效的快递网络,把数据拆成多个小块(Shard),分发到不同的服务器上,同时保持数据的副本,确保高性能和高可用。