面试题答案
一键面试PrimaryTerms作用
- 故障恢复与主分片选举:PrimaryTerms用于标识主分片的任期。每当主分片发生故障,集群重新选举新的主分片时,PrimaryTerm就会递增。这确保了节点能够识别当前有效的主分片,避免旧的主分片副本在故障恢复后可能产生的数据冲突。例如,若节点A上的主分片发生故障,重新选举出节点B上的分片作为新主分片,此时PrimaryTerm会增加,节点A上的旧主分片副本就知道自己已不是最新主分片。
- 写入确认:在写入操作时,主分片会将PrimaryTerm包含在写入请求中。副本分片在接收到写入请求时,会检查PrimaryTerm。如果副本分片上的PrimaryTerm与请求中的不一致,说明可能存在主分片变更,副本分片会拒绝该写入请求,从而防止数据写入到过期的副本上。
SequenceNumbers作用
- 版本控制:SequenceNumbers是单调递增的序列号,用于记录每个文档的变更顺序。每个写入操作在主分片上执行成功后,SequenceNumber会递增。当副本分片接收来自主分片的写入请求时,会检查请求中的SequenceNumber是否比自己本地记录的大。如果是,则说明这是一个更新的操作,可以安全应用;否则,说明可能存在数据不一致,需要进行处理。
- 数据同步:在集群内数据同步过程中,SequenceNumbers帮助确定哪些数据是最新的。通过比较主分片和副本分片上的SequenceNumber,副本分片能够快速定位自己缺失的数据,从而从主分片拉取并同步最新数据。
协作保证数据一致性
- 写入流程:当客户端发起写入请求到主分片时,主分片会分配一个新的SequenceNumber,并将当前的PrimaryTerm和SequenceNumber包含在写入请求中,一起发送给副本分片。副本分片接收到请求后,先检查PrimaryTerm是否与自己记录的一致,若一致,再检查SequenceNumber是否大于本地记录。只有两者都满足条件,副本分片才会应用该写入操作。
- 故障恢复:在主分片故障恢复过程中,新选举出的主分片会携带更高的PrimaryTerm。旧主分片副本在接收到新主分片的写入请求时,由于PrimaryTerm不一致,会拒绝写入。新主分片会基于自己的SequenceNumber状态,向副本分片同步缺失的数据,确保所有副本分片与新主分片的数据一致。通过这种PrimaryTerms和SequenceNumbers相互配合的机制,ElasticSearch能够在分布式环境下有效地保证数据一致性。