面试题答案
一键面试PrimaryTerms作用
- 主节点变更标识:PrimaryTerms用于标识主分片的选举周期。当主节点发生故障,Elasticsearch会重新选举新的主节点,此时PrimaryTerm会递增。每个主节点在其任期内都有唯一的PrimaryTerm,这确保了不同时期的主节点操作能被明确区分。例如,在一个集群中主节点A故障后,新选举的主节点B的PrimaryTerm会比A高。
- 数据版本控制:在写操作时,PrimaryTerm会被包含在请求中发送到主分片。主分片使用PrimaryTerm来验证请求是否来自当前有效的主节点。如果请求中的PrimaryTerm与主分片当前的PrimaryTerm不一致,请求会被拒绝,这防止了旧主节点在失去领导权后继续处理写操作,保证了数据的一致性。
SequenceNumbers作用
- 操作顺序标识:SequenceNumbers是单调递增的数字,用于记录主分片上每个写操作的顺序。每当主分片接收到一个写请求并成功处理后,SequenceNumber就会加1。这使得每个写操作在主分片上都有一个唯一的顺序编号,类似事务日志中的序列号,可用于追踪和排序写操作。
- 副本同步依据:主分片通过将SequenceNumber和写操作一起发送给副本分片,副本分片根据SequenceNumber来确保接收到的操作顺序与主分片一致。如果副本分片发现接收到的操作的SequenceNumber不连续,会请求主分片补发缺失的操作,从而保证副本与主分片的数据一致性。
两者关联
- 共同标识操作:每次写操作在主分片上都会同时关联一个PrimaryTerm和一个SequenceNumber。它们一起唯一标识了一个写操作在特定主节点任期内的顺序位置。例如,在PrimaryTerm为5的主节点任期内,SequenceNumber从100依次递增记录写操作。
- 版本协同:当主分片将写操作发送给副本分片时,会携带PrimaryTerm和SequenceNumber。副本分片不仅要验证SequenceNumber的连续性,还要验证PrimaryTerm是否与当前主分片的PrimaryTerm一致。只有两者都匹配,副本分片才会应用该写操作,这样确保了副本分片应用的操作是来自当前有效的主节点且顺序正确。
对数据一致性和可靠性的保障
- 防止脑裂问题:通过PrimaryTerms,Elasticsearch能有效避免脑裂情况下旧主节点继续处理写操作。当新主节点选举产生,其PrimaryTerm更高,旧主节点接收到的写请求因PrimaryTerm不匹配会被拒绝,从而防止数据冲突和不一致,保证了数据一致性。
- 保证副本同步准确:SequenceNumbers确保了主分片和副本分片之间写操作顺序的一致性。副本分片根据SequenceNumber能准确地同步主分片上的所有写操作,不会出现操作丢失或顺序错乱的情况,保障了数据的可靠性,即使在网络故障或节点故障后重新同步数据时,也能依据SequenceNumber恢复到正确状态。
- 数据完整性维护:PrimaryTerms和SequenceNumbers的协同工作,从主节点选举到副本同步的整个过程中,全面保障了数据的一致性和可靠性。无论是正常的写操作流程,还是在集群发生故障后的恢复过程,都能确保数据的完整性和正确性,使得Elasticsearch集群能够在各种复杂环境下稳定运行。