面试题答案
一键面试基本原理
Elasticsearch 使用路由算法将文档分发给不同分片。路由算法基于文档的 _id
,确保相同 _id
的文档始终被路由到相同的分片,这样可以保证在读取文档时能准确找到存储位置。
主要组件
- 集群:由多个节点组成,这些节点负责存储和处理数据。
- 节点:可以是主节点(负责集群级别的操作,如创建或删除索引,跟踪哪些节点是集群的一部分)、数据节点(存储数据并执行数据相关的操作,如增删改查)等。
- 索引:逻辑上的文档集合,一个索引可以被分为多个分片存储在不同节点上。
- 分片:索引的物理分区,每个分片都是一个独立的Lucene索引,允许 Elasticsearch 水平扩展存储和处理能力。
大致流程
- 文档写入请求:客户端发送写入文档的请求到集群中的某个节点,该节点称为协调节点。
- 计算路由:协调节点根据文档的
_id
,使用公式shard = hash(_id) % number_of_primary_shards
计算出应该将文档路由到哪个分片。这里number_of_primary_shards
是索引创建时指定的主分片数量。 - 转发请求:协调节点将请求转发到对应分片所在的数据节点。如果目标分片是副本分片,协调节点会将请求转发到对应的主分片所在节点。
- 写入主分片:数据节点在主分片上执行写入操作,成功后将操作转发到所有相关的副本分片。
- 返回响应:当所有副本分片都成功写入后,数据节点向协调节点返回成功响应,协调节点再将响应返回给客户端。