面试题答案
一键面试1. 基本概念
- Primary Terms:主要用于标识主分片在不同阶段的生命周期。每当主分片选举发生变化(例如节点故障导致重新选举主分片),Primary Term 就会递增。
- Sequence Numbers:是在主分片上生成的单调递增的数字,用于标识每个写入操作的顺序。
- SequenceIDs:在 Elasticsearch 内部使用,通过 Primary Terms 和 Sequence Numbers 组合来唯一标识每个操作。
2. 节点故障前的正常写入流程
- 客户端请求写入:客户端向 Elasticsearch 集群发送写入请求。
- 主分片接收请求:请求被路由到主分片所在的节点。主分片生成一个新的 Sequence Number,并将写入操作记录到其本地的 translog(事务日志)中。此时,Primary Term 保持不变(假设没有主分片选举发生)。
- 副本分片同步:主分片将包含 Sequence Number 和写入操作的请求发送给所有副本分片。副本分片在应用该操作之前,会检查 Primary Term 和 Sequence Number。只有当 Primary Term 匹配且 Sequence Number 大于其当前已应用的最大 Sequence Number 时,副本分片才会应用该操作,并记录到自己的 translog 中。
- 确认响应:当所有副本分片成功应用操作后,主分片向客户端返回成功响应。
3. 节点故障及恢复流程
- 节点故障检测:Elasticsearch 集群通过节点间的心跳检测机制发现节点故障。一旦检测到包含主分片的节点故障,集群会触发重新选举主分片的过程。
- 主分片重新选举:在重新选举过程中,新的主分片被选出,并且 Primary Term 会递增。这是因为新的主分片代表了主分片生命周期的新阶段。
- 数据恢复:
- 从副本恢复:新的主分片从可用的副本分片中选择一个(通常是具有最新数据的副本)进行数据同步。副本分片会将其记录的 translog 中的操作,按照 Sequence Number 顺序发送给新的主分片。
- 检查一致性:新的主分片在接收副本分片发送的操作时,会检查 Primary Term 和 Sequence Number。如果副本分片发送的操作的 Primary Term 与当前主分片的 Primary Term 相同,且 Sequence Number 大于主分片当前已应用的最大 Sequence Number,主分片会应用该操作。这确保了新主分片在恢复过程中不会重复应用已有的操作,也不会遗漏任何操作。
- 恢复完成:当新的主分片从副本分片同步完所有数据后,数据恢复完成。集群继续正常的读写操作,新的写入操作会在递增的 Primary Term 下,生成新的 Sequence Number。
4. 关键步骤总结
- 递增 Primary Term:在主分片重新选举时递增 Primary Term,标识主分片新的生命周期阶段,防止旧主分片的过期操作在新主分片上应用。
- 基于 Sequence Number 同步:副本分片和主分片之间通过比较 Sequence Number 来确保操作的正确顺序应用,保证数据的一致性,避免数据丢失或重复。
- 协同工作:Primary Terms 和 Sequence Numbers 共同组成 SequenceIDs,在节点故障恢复过程中,它们协同确保 Elasticsearch 集群的数据不丢失、不重复且保持一致性。