面试题答案
一键面试主要机制
- Transport 模块:Elasticsearch 基于 Java 的 Netty 构建了 Transport 模块来实现节点间通信。它负责管理网络连接、序列化与反序列化数据以及处理请求和响应。
- 序列化协议:使用自定义的二进制序列化协议,能够高效地将 Java 对象转换为字节流在网络上传输,并且在接收端再反序列化为对象。这种协议比通用的序列化方式(如 Java 原生序列化)更轻量、高效。
- 发现机制:节点通过发现机制来识别集群中的其他节点。在默认情况下,Elasticsearch 使用 Zen Discovery 机制。它基于种子节点列表进行节点发现,新节点启动时会向种子节点发送请求,种子节点将集群中其他节点的信息返回给新节点,帮助新节点加入集群。
工作流程
- 节点启动与发现
- 新节点启动后,根据配置的种子节点列表尝试连接其中的一个或多个种子节点。
- 种子节点收到新节点的连接请求后,将集群中其他节点的信息(如节点地址、节点 ID 等)返回给新节点。
- 新节点通过这些信息与其他节点建立连接,完成加入集群的过程。
- 请求发送
- 当一个节点(如客户端节点或数据节点)需要执行某个操作(例如索引文档、搜索等)时,它会构建相应的请求对象。
- 该请求对象会通过 Transport 模块进行序列化,转换为字节流。
- 然后根据请求的目标节点(如果是写操作,可能是主节点或负责该分片的节点;读操作可能是包含相关副本分片的节点),通过建立好的网络连接将序列化后的请求发送出去。
- 请求接收与处理
- 目标节点的 Transport 模块接收到字节流后,对其进行反序列化,还原成请求对象。
- 节点根据请求的类型,将其转发到相应的处理模块(如索引模块处理索引文档请求,搜索模块处理搜索请求等)进行处理。
- 响应返回
- 处理模块完成操作后,构建响应对象。
- 响应对象同样通过 Transport 模块进行序列化并发送回请求节点。
- 请求节点接收到响应后,反序列化响应对象,获取操作的结果并返回给客户端(如果是客户端发起的请求)。