面试题答案
一键面试1. 分配决策(Allocation Decision)
- 节点选择:Elasticsearch 根据各种因素(如节点负载、磁盘空间、节点属性等)决定将分片分配到哪个或哪些节点上。这一步的作用是确保分片分布均匀,避免单个节点负载过高,同时合理利用集群资源。例如,如果某个节点磁盘空间不足,分配器会尽量避免将新的分片分配到该节点。
- 主分片与副本分片分配:对于主分片,Elasticsearch 会确保每个主分片在集群中只存在一份,且均匀分布在不同节点上。副本分片则会根据副本数量的设置,被分配到与主分片不同的节点上,以提供数据冗余和高可用性。比如设置副本数为 1 时,每个主分片对应的副本分片会被分配到另一个节点。
2. 分片创建(Shard Creation)
- 元数据更新:Master 节点在决定好分片分配后,会更新集群的元数据,记录分片与节点的对应关系。这一步至关重要,它让整个集群都知道新分片的位置信息,以便后续的通信和操作。
- 本地初始化:被分配到分片的节点在本地创建相应的分片目录结构,初始化一些必要的文件和配置,为后续的数据恢复做准备。例如创建存储数据的文件夹、配置文件等。
3. 数据恢复(Data Recovery)
- 全量恢复(Full Recovery)
- 数据传输:如果是副本分片的首次恢复(例如集群刚创建或者新加入节点),副本分片会从对应的主分片所在节点拉取全部数据。主分片节点会将数据以数据流的形式发送给副本分片所在节点。这一步实现了数据的复制,保证副本分片与主分片的数据一致性。
- 数据写入:副本分片所在节点接收到数据后,将数据写入本地存储。在写入过程中,会按照 Elasticsearch 的数据存储格式(如 Lucene 格式)进行组织和存储,确保数据能够被正确索引和查询。
- 增量恢复(Incremental Recovery)
- 日志同步:当主分片有数据更新时,更新操作会记录在事务日志(translog)中。副本分片通过与主分片同步事务日志来获取增量更新。主分片会将事务日志中的记录发送给副本分片。
- 应用更新:副本分片接收到增量更新后,在本地应用这些更新操作,使得副本分片的数据与主分片保持一致。这种方式可以减少数据传输量,提高恢复效率,尤其是在主分片数据量较大且更新频繁的情况下。
4. 恢复完成确认(Recovery Completion Acknowledgment)
- 分片状态更新:当副本分片完成数据恢复(全量或增量)后,会向 Master 节点发送恢复完成的确认信息。Master 节点接收到确认后,更新该分片在集群元数据中的状态,标记为已恢复。这一步使得集群能够准确掌握每个分片的状态,为后续的操作(如负载均衡、故障处理等)提供准确依据。
- 集群状态更新:Master 节点在接收到所有分片(主分片和副本分片)的恢复确认后,更新整个集群的状态,将该索引或分片组标记为可用状态。此时,该分片或索引就可以正常提供服务,接受客户端的读写请求。